DNS
마스터 슬레이브 서버
1. master name server의 named.conf에서 이전될 zone을 지정
zone "ast12.sec." {
type master;
file "ast12.sec.zone";
also-notify { 192.168.10.157; }; // IXFR
(또는 allow-update { 192.168.10.32; };) // AXFR
};
2. slave named server named.conf에 zone 영역지정
zone "ast12.sec." {
type slave;
file "ast12.sec.zone";
masters { 192.168.10.156; };
};
3. /var/named의 퍼미션이 named 그룹에 대해서 W 가능하도록 설정한다.
◆ IXFR(Incremental zone transfer)
• Default 전송방법
- Option에서 disable 할 수 있다.
- provide-ixfr no(master), request-ixfr no(slave)
• Notify 메시지와 함께 사용됨 변경된 내용만 slave에 전송함.
• master, slave 모두 지원해야 한다.
• TCP/UDP 53번 포트를 선택할 수 있음
실습
두개의 네임서버를 각각 master, slave 서버로 구축
Master Server : 192.168.10.156
/etc/named.conf
# systemctl restart named.service
Slave Server - 192.168.10.157
/etc/named.conf
chmod g+w /var/named로 w가 가능하도록 설정.
# systemctl restart named.service
연동이 되면 자동으로 /var/named에 ast12.sec.zone파일이 생성된다.
tcp
신뢰적인 데이터 통신
데이터가 깨지지 않고 도착하는 것
데이터가 순서에 맞게 도착하는 것
ㄴ tcp가 보장을 한다.
나한테 일어나는 일 = 이벤트(event)
내가 하는 일 = 액션(action)
sender
rdt send = app가 데이터를 주는 이벤트
udt send = 하위 레이어로 패킷을 보내는 액션
receiver
rdt rev = 하위 레이어에서 패킷이 올라오는 이벤트
deliver data = app에게 데이터를 주는 액션
신뢰적인 data 전송의 원리
rdt 1.0
하위 채널이 완전히 신뢰적인 경우
- no bit error → 비트가 손상되지 않는다
- no loss of packets → 패킷이 유실되지 않는다
sender
Wait for call from above → app이 데이터 주기를 기다리는 상태
rdt_send(data) → app이 데이터를 주는 이벤트 발생
--------------------------------
packet = make_pkt(data) → 받은 데이터를 가지고 패킷을 생성
udt_send(packet) → 만들어진 패킷을 하위 레이어로 보낸다
Wait for call from above → 다시 어플리케이션이 데이터 주기를 기다리는 상태
receiver
Wait for call from below → 하위 레이어로부터 패킷이 올라오기를 기다리는 상태
rdt_rcv(packet) → 하위 레이어에서 패킷이 올라오는 이벤트가 발생
--------------------------------
extract (packet, data) → 패킷으로부터 데이터를 추출
deliver_data(data) → 추출된 데이터를 app로 보낸다.
Wait for call from below → 다시 하위 레이어로부터 패킷이 올라오기를 기다리는 상태
rdt 2.0
비트 오류가 있는 채널
블라인드 통신을 하기 때문에 receiver는 비트가 깨졌는지 알 수가 없다. 그러므로 패킷이 잘 도착하거나, 깨졌을 때 응답을 보낸다.
추가된 기능 : checksum, acknowledgement (ACKs), negative acknowledgement (NAKs)
• checksum을 통해 bit error감지
• acknowledgement (ACKs)
- receiver 가 sender에게 pkt를 잘 받았다는 응답
• negative acknowledgement (NAKs)
- receiver 가 sender 에게 pkt에 error 또는 장애가 있다는 응답
• sender는 NAK인 경우 pkt 재전송
- 패킷을 저장하기 위한 버퍼가 필요함.(패킷을 가지고 있어야 하기 때문)
sender
데이터 전송 대기 상태 (Wait for call from above)
Wait for call from above → app가 데이터 주기를 기다리는 상태
rdt_send(data) → app부터 데이터를 받는 이벤트 발생
sndpkt = make_pkt(data, checksum) → 데이터에 체크섬을 붙여서 패킷을 만듭니다.
udt_send(sndpkt) → 생성된 패킷을 하위 레이어로 보냅니다.
Wait for ACK or NAK → 하위레이어로부터 ACK나 NAK가 오길 기다리는 상태
rdt_rcv(rcvpkt) && isNAK(rcvpkt) → 하위 레이어로부터 NAK를 받음.
udt_send(sndpkt) → 아까 받은 패킷을 하위 레이어로 재전송.
Wait for ACK or NAK → ACK를 받지 못했기 때문에 다시 하위레이어로부터 ACK나 NAK가 오길 기다리는 상태
rdt_rcv(rcvpkt) && isACK(rcvpkt) → 하위 레이어로부터 ACK를 받음.
Wait for call from above → 패킷이 잘 전달됐기 때문에 다시 app가 데이터 주기를 기다리는 상태
receiver
Wait for call from below → 하위 레이어로부터 패킷이 올라오기를 기다리는 상태
rdt_rcv(rcvpkt) → 하위 레이어로부터 패킷을 받는 이벤트가 발생.
경우 1
corrupt(rcvpkt) → 받은 체크섬이 손상이 됨.
udt_send(NAK) → 하위 레이어에 NAK를 전송.
Wait for call from below → 다시 하위 레이어로부터 패킷이 올라오기를 기다리는 상태
데이터는 상위 계층으로 전달하지 않고 폐기
경우 2
notcorrupt(rcvpkt) → 받은 체크섬이 멀쩡함.
extract(rcvpkt, data) → 패킷으로부터 데이터 추출
deliver_data(data) → 데이터를 app로 전달.
udt_send(ACK) → 하위레이어에게 ACK를 전송
Wait for call from below → 다시 하위 레이어로부터 패킷이 올라오기를 기다리는 상태
rdt 2.1
치명적인 결함
응답이 깨질 수 있다. 그러면 그냥 nak로 간주한다
ㄴ 무조건 재전송 → 같은 패킷을 두 번 받아버린다(신뢰적인 전송이 아니게 되어버린다, 중복 문제)
ACK/NAK가 훼손되는 경우
• sender는 receiver 쪽에 어떤 일이 벌어졌는지 알 수 없다.
• 재전송으로 packet이 중복될 수 있다.
중복을 제어하는 방법
• sender는 pkt에 sequence number를 추가한다.(시퀀스 넘버는 0,1번으로 한다.)
• ACK나 NAK가 변형되면 sender는 pkt를 재전송한다.
• receiver는 중복된 pkt을 버린다.
sender
Wait for call 0 from above → 시퀀스번호가 0번인 패킷을 보내려고 app가 데이터 주기를 기다리는 상태
rdt_send(data) → app에서 데이터를 받는 이벤트 발생
sndpkt = make_pkt(0, data, checksum) → 패킷을 만들 때 시퀀스번호 0번, 데이터, 체크섬을 포함해서 패킷을 만듦.
udt_send(sndpkt) → 하위 레이어로 만든 패킷을 전송함.
Wait for ACK or NAK 0 → 하위레이어에서 시퀀스번호 0번의 패킷에 대한 ACK나 NAK 응답이 오기를 기다리는 상태
-------------------------------------------------------------------
경우 1
rdt_rcv(rcvpkt) → 하위 레이어에서 패킷을 받음.
(corrupt(rcvpkt) || isNAK(rcvpkt)) → 하위 레이어의 응답이 훼손되었거나 NAK응답이면
udt_send(sndpkt) → 이전에 보냈던 시퀀스 번호 0번인 패킷을 재전송해서 하위 레이어로 보냅니다.
Wait for ACK or NAK 0 → 하위레이어에서 시퀀스번호 0번의 패킷에 대한 ACK나 NAK응답이 오기를 기다리는 상태
경우 2
rdt_rcv(rcvpkt) → 하위 레이어에서 패킷을 받음.
notcorrupt(rcvpkt) && isACK(rcvpkt) → 하위 레이어의 응답이 멀쩡하고, ACK응답이면
Wait for call 1 from above → 시퀀스번호가 1번인 패킷을 보내려고 app가 데이터 주기를 기다리는 상태
-------------------------------------------------------------------
rdt_send(data) → app에서 데이터를 받는 이벤트 발생
sndpkt = make_pkt(1, data, checksum) → 패킷을 만들 때 시퀀스번호 1번, 데이터, 체크섬을 포함해서 패킷을 만듦.
udt_send(sndpkt) → 하위 레이어로 만든 패킷을 전송함.
Wait for ACK or NAK 1 → 하위레이어에서 시퀀스번호 1번의 패킷에 대한 ACK나 NAK응답이 오기를 기다리는 상태
-------------------------------------------------------------------
경우 1
rdt_rcv(rcvpkt) → 하위 레이어에서 패킷을 받음.
(corrupt(rcvpkt) || isNAK(rcvpkt)) → 하위 레이어의 응답이 훼손되었거나 NAK응답이면
udt_send(sndpkt) → 이전에 보냈던 시퀀스 번호 1번인 패킷을 재전송해서 하위 레이어로 보냅니다.
Wait for ACK or NAK 1 → 하위레이어에서 시퀀스번호 1번의 패킷에 대한 ACK나 NAK응답이 오기를 기다리는 상태
경우 2
rdt_rcv(rcvpkt) → 하위 레이어에서 패킷을 받음.
notcorrupt(rcvpkt) && isACK(rcvpkt) → 하위 레이어의 응답이 멀쩡하고, ACK응답이면
Wait for call 0 from above → 시퀀스번호가 0번인 패킷을 보내려고 app가 데이터 주기를 기다리는 상태
-------------------------------------------------------------------
receiver
Wait for 0 from below → 하위 레이어에서 시퀀스 번호가 0인 패킷을 받는 걸 기다리는 상태
rdt_rcv(rcvpkt) → 하위 레이어로부터 패킷을 받는 이벤트가 발생.
notcorrupt(rcvpkt) &&has_seq0(rcvpkt) → 받은 패킷이 시퀀스번호가 0번이고, 손상이 안된 패킷이면
extract (packet, data) → 패킷으로부터 데이터를 추출
deliver_data → 데이터를 app로 전달
sndpkt=make_pkt(ACK, checksum) → 수신이 완료됐다고 ACK와 체크섬이 포함된 패킷을 만들고
udt_send(sndpkt) → 하위 레이어로 패킷을 전달.
Wait for 1 from below → 하위 레이어에서 시퀀스 번호가 1인 패킷을 받는 걸 기다리는 상태
-------------------------------------------------------------------
경우 1
rdt_rcv(rcvpkt) &&corrupt(rcvpkt) → 하위 레이어에서 패킷을 받는 이벤트가 발생 후 확인해 보니 패킷이 손상된 상태.
sndpkt = make_pkt(Nak, chksum) → NAK, chksum을 포함한 패킷을 만들어서
udt_send(sndpkt) → 하위 레이어에게 패킷을 전송
Wait for 1 from below → 하위 레이어에서 시퀀스 번호가 1인 패킷을 받는 걸 기다리는 상태
경우 2
rdt_rcv(rcvpkt) → 하위 레이어에서 패킷을 받는 이벤트 발생
notcorrupt(rcvpkt) && has_seq0(rcvpkt) → 패킷은 멀쩡하지만 시퀀스 넘버가 0번인 중복된 패킷을 받음
sndpkt=make_pkt(ACK, checksum) → Ack와 chksum을 포함한 패킷을 만들어서
udt_send(sndpkt) → 하위 레이어에게 패킷을 전송
Wait for 1 from below → 하위 레이어에서 시퀀스 번호가 1인 패킷을 받는 걸 기다리는 상태
경우 3
rdt_rcv(rcvpkt) → 하위 레이어로부터 패킷을 받는 이벤트가 발생.
notcorrupt(rcvpkt) &&has_seq1(rcvpkt) → 받은 패킷이 시퀀스번호가 1번이고, 손상이 안된 패킷이면
extract(rcvpkt, data) → 패킷으로부터 데이터를 추출하고
deliver_data(data) → 데이터를 app으로 전달
sndpkt = make_pkt(ACK, chksum) → 수신이 완료됐다고 ACK와 체크섬이 포함된 패킷을 만든 후
udt_send(sndpkt) → 하위 레이어에게 패킷을 전송
Wait for 0 from below → 하위 레이어에서 시퀀스 번호가 0인 패킷을 받는 걸 기다리는 상태
-------------------------------------------------------------------
rdt_rcv(rcvpkt) → 하위 레이어로부터 패킷을 받는 이벤트가 발생.
notcorrupt(rcvpkt) &&has_seq1(rcvpkt) → 패킷은 멀쩡하지만 시퀀스 넘버가 1번인 중복된 패킷을 받음
sndpkt=make_pkt(ACK, checksum) → Ack와 chksum을 포함한 패킷을 만들어서
udt_send(sndpkt) → 하위 레이어에게 패킷을 전송
Wait for 0 from below → 하위 레이어에서 시퀀스 번호가 0인 패킷을 받는 걸 기다리는 상태
rdt_rcv(rcvpkt) &&corrupt(rcvpkt) → 하위 레이어에서 패킷을 받는 이벤트가 발생 후 확인해 보니 패킷이 손상된 상태.
sndpkt = make_pkt(Nak, chksum) → NAK, chksum을 포함한 패킷을 만들어서
udt_send(sndpkt) → 하위 레이어에게 패킷을 전송
Wait for 0 from below → 하위 레이어에서 시퀀스 번호가 0인 패킷을 받는 걸 기다리는 상태
이다음은 위에 처음 적어둔 것부터 갑니다.
패킷 지연과 손실
지연되는 4가지 요소
처리지연
- 패킷해더를 보고 목적지 주소를 봄 → 어디로 갈지 결정을 하는데, 거기서 걸리는 시간
큐잉지연
- 패킷이 스위치, 라우터에 들어오면 큐에 저장이 되는데 앞에서부터 처리하면서 나간다. 만약 큐가 가득 차버리면 저장될 공간이 없어서 패킷이 없어져 버린다. (패킷이 큐에 얼마나 저장돼있느냐에 의존한다.) 혼잡통제
전송지연
R = 링크의 전송률
L = 패킷의 길이
전송지연 = L/R
r이 클수록 지연이 줄어든다
l이 클수록 지연이 늘어난다.
전파지연
d = 링크의 길이
s = 전달 속도(2*108 m/sec)
전파 지연 = d/s
dnodal = dproc + dqueue + dtrans + dprop
■ dproc : 처리 지연
• 수 마이크로초 정도로 보통 무시된다.
• 라우터의 최대 처리율에는 상당한 영향을 준다.
■ dqueue : 큐잉 지연 - 상황에 따라 다르다, 패킷이 지연되는 거, 패킷이 손실이 될 수도 있다.
• 혼잡도에 따라 다르다
■ dtrans : 전송 지연
• L/R : 일반적으로 무시 가능하다. (10 Mbps 이상에서)
• 매우 저속의 링크에서는 수 백 밀리 초에 이를 수 있다.
■ dprop: 전파 지연
• 수 마이크로 초로 무시 가능하다.
• 정지위성의 경우 수백 밀리초에 이를 수 있다.
'kh교육' 카테고리의 다른 글
(20250813035)apache서버,Go-Back-N, Selective Repeat (1) | 2025.08.13 |
---|---|
(20250812034)DNS 서버 구성, tcp (신뢰적인 데이터 통신) (0) | 2025.08.12 |
(20250808032)다중 도메인서버, 전자서명, PKI 폼,배열 (3) | 2025.08.08 |
(20250807031)DNS서버, 키분배,해쉬함수 (1) | 2025.08.07 |
(20250806030)vsftp 사용자 계정 제한 설정,DNS (4) | 2025.08.06 |