kh교육

(20250811033) DNS, tcp(신뢰적인 데이터 통신), 패킷지연,손실

boangod 2025. 8. 11. 23:14

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: 전파 지연

      • 수 마이크로 초로 무시 가능하다.

      • 정지위성의 경우 수백 밀리초에 이를 수 있다.