아롱이 탐험대

Transmission Control Protocol (TCP) (4) 본문

CS/Computer network

Transmission Control Protocol (TCP) (4)

ys_cs17 2022. 4. 10. 16:17
반응형

TCP에서 내가 보낸 ACK을 상대가 받았는지 못 받았는지 모른다. TCP의 특성 중 가장 중요한 것은 신뢰성 보장이다. 이는 데이터 전송 실패 시 재전송한다는 의미이다. 중간에 받지 못한 데이터를 재전송한다는 의미이다. App단에서 buffer에 있는 데이터를 읽었다는 의미는 전송이 제대로 된 데이터를 읽었다는 말이다.

 

Normal operation

Normal operation sample

ACK을 보내는 것에 대한 Normal operation을 살펴보자.

Rule 1은 데이터를 받고 나서 해당 ACK을 보낸 것이다. 

Rule 1은 sending buffer에 보낼 것이 있으면 data와 ACK이랑 같이 보낸 다는 규칙이다.

Rule 2는 데이터를 받아서 ACK으로 보내려고 할때 50ms 정도 기다렸다가 같이 보낼 것이 있는지 확인 후 ACK을 보내는 것이다. 같이 보낼 데이터가 없으면 50ms 후 ACK을 보낸다.

Rule 3는 50ms 기다리는 동안 패킷이 1개 더 오면 ACK을 보낸다.

데이터가 없는 상황에서 패킷이 2개 들어오면 그냥 ACK을 보낸다. 너무 안 보내는 것도 문제가 되기 때문이다.

패킷이 10개 들어오면 ACK을 5개 보낸다.

Normal operation에서 rule 1, rule 2, rule 3는 ACK을 줄어보려고 하는 상황이다.

 

Lost segment

 

Lost segment sample

Lost segment에 속하는 rule 4, 5는 예외의 상황이다.

Rule 4를 설명하기 전 sender 입장에서는 segment가 중간에 없어 졌는지는 시간이 지난 후 알 수 있다. sender는 ACK을 받지 않아도 한꺼번에 많이 보낼 수 있다는 것을 알고 있자.

Rule 4는 패킷이 없어진 것을 무시하고 801번이 온 상황이다. 801번을 우선 할당하고, 701번이 없어진 상태이다. 이때 reciever는 바로 701번에 대한 ACK을 보낸다.

Sender는 time out을 통해 데이터가 중간에 사라진 것을 알 수 있다. 패킷을 보낼 때마다 sender는 패킷마다 보낸 시간을 테이블로 저장한다. 만약 정해진 시간 동안 기다렸는데 패킷에 대한 ACK이  오지 않는다면 없어진 것으로 간주한다. 따라서 없어진 패킷에 대해 재전송한다.

Rule 5는 701번을 받으면 901로 ACK을 보낸다. 즉 잃어버렸던 패킷이 돌아오면 바로 ACK을 보낸다는 것이다.

Reciever에서는 제대로 들어온 패킷에 대해서만 app에서 읽는다. 중간에 없어진 것이 있으면 reciever buffer는 app에 올리지 않는다.

 

Fast retransmission

Fast retransmission은 tcp에서 사용하는 용어이다.

Fast retransmission sample

Sender 측에서 101번이랑 201번 패킷을 보냈다고 하자. 패킷 2개당 ACK은 1개가 오는데, reciever는 들어온 패킷에 대한 301번 ACK을 보내준다. Sender는 ACK을 받으면 RTO 타이머 (패킷을 잘 보냈는지 확인하는 타이머)를 멈추고 301, 401번 패킷을 보낸다. Reciever는 중간에 없어진 301번을 받지 못하고, 401번을 받아야 ACK을 전송한다. 하지만 reciever 측에서는 301번을 못 받았다고 ACK으로 알려준다. Sender는 window size가 허락하는 한 ACK이 오지 않아도 계속 패킷을 보낸다.

501번을 보내는데도 301으로 ACK이 온다. 그리고 window size 만큼 보낸 것임으로 601번도 보내는데도 301번으로 ACK이 온다. Third duplication까지 오니깐 Sender는 301번이 안 왔을 경우의 확률이 높다고 생각하고 301번을 재전송한다. 원래는 time out까지 오고 나서 detect를 진행한다. 하지만 굳이 time out까지 안 가도 중복된 ACK이 계속 오기 때문에 일찍 오류 탐지가 가능하다.

3개의 중복된 ACK이 들어오면 해당 패킷이 없어졌다고 간주한다.

하지만 이 경우에 100% 패킷이 없어진 것은 아니다. 패킷이 다른 경로로 전송이 되어서 늦게 오는 것일 수도 있다.

First duplication을 오류라고 보면 중복되는 것들이 많아 질 것이다. 이로 인해 재전송하는 상황이 아닌데 재전송을 하게 된다면 시간적 메모리적 낭비가 심해진다.

3개의 중복된 ACK이 오면 중간에 패킷이 없다고 가정하고 빨리 재전송을 하는 것이 fast retransmission이다.

중간에 없어진 패킷을 재전송하면 정상적으로 701번에 대한 ACK을 보내준다. Cumulative ACK을 쓰면서 보기 쉬운 상황이다.

Cumulative ACK의 장점은 ACK을 줄일 수 있고, 쉽게 구현도 가능하다.

 

위 그림과 같이 ACK에 대한 전송을 확인할 수 있는 방법은 없다. ACK을 못 받았다고 해서 Sender는 재전송을 하지는 않는다. window size만큼 보내고, Server는 이에 대한 확인으로 901번에 대한 ACK을 보낸다. 701번 ACK을 받지 못해도 정상적으로 진행이 가능하다.

 

Lost ACK corrected by resending a segment

rule 6 sample

Rule 6도 응급 상황이다. ACK이 없어진 상태인데, sender는 time out이나 중복된 ACK으로 오류 검사를 하는데, 이것은 time out으로 알게 된 경우이다. 따라서 501번에 대한 패킷을 재전송한다. (사실은 어떤 패킷이 없어졌는지 모르기 때문에 501, 601 둘 다 보낸다.)

여기서 point는 중복된 ACK을 받을 수 있다는 것이다. 이런 경우에는 ACK을 바로 재전송한다. (제대로 받았다고 알려줌)

 

Dead Lock

ACK 하나가 없어졌을 경우에 deadlock이 발생할 수 있다. 데이터가 가고 ACK이 왔는데 RWND=0 (Window size = 0)으로 가거나 Clarck으로 인해 0으로 갈 수 있다. 이때 MSS만큼 빈공간이 생기거나 반 이상의 reciever buffer가 있을 때 제대로 된 RWND를 보낸다. 이때 제대로 갈 때 보내는 ACK이 없어질 수도 있다. 이때 reciever는 데이터를 기다리고, sender는 RWND = 0으로 착각해서 서로 deadlock이 걸리게 된다.

RWND=0을 받을 때 sender에서는 persistence timer를 킨다. Timer가 만료되면 작은 사이즈의 패킷을 먼저 보낸다. 이 데이터를 probe segment라고 한다. 상대방은 이것을 받고 ACK을 보낸다. 이때 ACK과 RWND를 같이 보낸다. RWND=K로 받으면 아까 보낸 ACK이 없어졌을 것이라고 가정하고 데이터를 K만큼 보내기 시작한다.

 

Congestion

 

Congestion sample

TCP 연결이 router랑 되어있는데, 100Mbps짜리 lan에 연결되어있다고 가정하자. 들어오는 것은 200 Mbps이고 나가는 것을 100 Mbps라 할 때 이것을 처리해야 하는데 이는 우리가 사용하고 있는 패킷 스위칭 방법이다.

경로 설정을 중앙에서하지 않는 방법이다.

중앙 제어 방식은 패킷을 보내기 전 미리 경로에 대한 설정을 한다. 연결이 끝날 때까지 경로를 유지하며 성능을 보장한다. 하지만 패킷 스위칭 방식은 다르다. 중앙에서 경로를 설정하지 않고, 모든 패킷의 경로가 달라질 수 있다. 어느 경로가 더 좋은지 테이블로 관리한다. 계속 좋은 경로를 찾기 시작하고, 패킷이 서로 독립적으로 보이게 된다. 하지만 모니터링이 되지 않고, 시간에 대한 보장도 되지 않는다.

중앙 제어 방식은 혼잡이 잘 생기지 않지만 모든 패킷을 보낼 때는 혼잡이 생긴다. 명절 같은 경우에 기차 예매를 생각하면 된다. 패킷 스위칭은 패킷이 많아도 출발은 시킨다.

X축은 네트워크에 데이터가 더 많이 보낸다면 보낼 수 있는 한계치이고 y축은 이에 대한 딜레이다.

데이터가 증가하면 딜레이도 늘어난다. 한계에 가까워지면 확 늘어나게 되는데, 이를 exponential increasing이라고 부른다. 데이터가 쌓이면 버퍼에 딜레이가 증가한다고 생각하면 된다.

y축은 recieving rate이다. 얼마만큼 빠르게 받고 있는지를 의미한다. capacity를 넘어가게 된다면 packet을 버리게 된다. 그 후 time out 같은 경우를 통해 packet을 다시 찾게 된다. 이때 sender는 패킷을 재전송한다.

capacity에 도달했을 때 패킷을 더 많이 보내면 손실이 많이 된다.

보내는 측이 10Mbps이고, 받는 측이 50 Mbps이면 혼잡 구간에서는 재전송과 같은 이슈 때문에 10초에 받을 수도 있다. 이때는 5 Mbps가 된다. 이게 throughput이다. 경우에 따라 TCP에서는 혼잡한 상황이 자주 발생한다.

반응형
Comments