[Network] Transport Layer 3 - TCP

chxghee·2024년 10월 17일

TCP

  • 클라 서버 1-1 대응되며 양방향 통신한다.

  • 신뢰성과 순서를 보장한다

  • full duplex data :
    양방향 데이터 흐름이 가능하며, 같은 연결에서 동시에 송신과 수신이 가능.

  • MSS (Maximum Segment Size):
    TCP는 한 번에 전송할 수 있는 최대 세그먼트 크기(MSS)
    MSS이하로 세그먼트를 나눠 전송한다.
    MSS의 크기는 최대 전송 단위(MTU 패킷에 링크레이어 헤더까지 붙인 것) 보다 작아야함

  • 누적 ACK (Cumulative ACKs) 사용

  • 파이프라이닝 (Pipelining)
    혼잡 제어(congestion control)와 흐름 제어(flow control) 메커니즘을 통해 네트워크와 수신자의 상태에 맞게 전송할 수 있는 데이터의 양을 조절
    (네트워크의 혼잡이 크면 내 패킷을 보내는 속도를 줄인다 -> 윈도우 사이즈를 줄인다)

  • 연결 지향 (Connection-oriented)
    handshaking

  • 흐름 제어 (Flow Control)
    혼잡은 고려 X, 리시버의 버퍼가 overflow하지 않도록 전송을 조절



TCP 세그먼트 구조

  • TCP 세그먼트의 헤더는 보통 옵션을 제외, 20 바이트로 구성된다.

TCP의 시퀀스 번호, ACK

시퀀스 번호
각 세그먼트의 첫 번째 바이트의 위치를 나타냄

ACK 번호
ACK 번호는 수신자가 다음에 기대하는 바이트의 시퀀스 번호를 나타냄

TCP의 타임아웃 시간 설정

TCP는 타이머를 1개 사용한다.
타이머를 사용 할 때는 타임아웃의 시간을 적절히 설정하는 것이 중요하다.
➡️ RTT보다 조금 더 긴 시간을 기준으로 설정한다.

RTT는 패킷을 보내고 ACK를 받을 떄 까지 걸리는 시간이다.

RTT는 전송마다 다 다르기 떄문에 평균 RTT를 구해야 한다.

RTT의 결정

평균을 구할 때 최근 RTT에 가중치를 두어 지수가중이동평균(EWMA)을 구한다.

하지만 이 평균을 그대로 사용한다면 도착하는 패킷의 절반 정도는 타임아웃이 발생할 것이다.

때문에 평균보다 조금 높은 값을 선택햐야한다.
➡️ 편차 * 4 를 평균에 더한 값을 타임아웃 시간으로 정한다.

편차 (RTT - 예측 RTT)

편차또한 가장 최근 RTT의 편차에 대해 가중치를 부여한다.

총 타이머 설정 시간 (timeout interval)

timeout interval = 평균 RTT + 4 * 편차



TCP 송신자

송신자는 ACK를 못 받은 가장 오래된 패킷에 대해 타이머를 유지한다

  1. 타임아웃 시
    • 해당 패킷에 대해서만 재전송 하고 타이머를 다시 시작한다.
  2. ACK를 받았을 시
    • 중복이 아닌 ACK를 받았을 때
    • 윈도우를 이동하고 타이머를 그 다음으로 오래된 패킷에대해 다시 시작

TCP 수신자

TCP 수신자의 ACK을 생성하는 상황을 살펴보자.

상황 1. 순차적 세그먼트 도착, 모든 이전 데이터가 ACK됨

1,2,3,4 패킷을 보냈는데 순서대로 잘 도착한 상황.

➡️ ACK1, ACK2, ACK3, ACK4를 다 보내는 것은 낭비이다.
➡️ ACK를 바로 보내지 않고 500ms 기다렸다 가장 최근의 ACK 만 보냄


상황 2. 순차적 세그먼트 도착, 다른 세그먼트에 대한 ACK 대기 중

1,2,3,4 패킷을 보냈는데 ACK가 loss발생하고 4에 대한 ACK (ACK 5)만 도착.

➡️ 어쩄든 ACK 5 가 도착했으니 4패킷까진 잘 받았구나 알수 있다.
➡️ 누적 ACK이기 떄문에 가능

(ACK 5 인 이유는 TCP에서 ACK는 다음 기대하는 시퀀스 번호이므로 ACK4가 아니라 ACK 5이다.)


상황 3. 순서가 맞지 않는 세그먼트 도착 (gap 발생)

1,2,3,4 패킷을 보냈는데 3번이 loss발생하고 4는 도착.
(기대하는 시퀀스번호 < 도착한 패킷의 시퀀스 번호)

➡️ 가장 마지막으로 보냈던 ACK인 중복 ACK를 보냄
➡️ 예시에서 보냈었던 ACK 3 번을 다시 보냄


상황 4. 간격을 채우거나 완전히 메우는 세그먼트 도착

1,2,3,4 패킷을 보냈는데 3번이 loss발생하고 4에 대한 ACK가 도착,
그 후 3이 재전송 되어 수신한 상황

➡️ 즉시 그에 대한 ACK를 보냄 (ACK 4)

(여기서 이전에 도착했던 4번 패킷을 버퍼링을 통해 유지할지 drop할지는 구현의 문제이다)



이외 여러가지 시나리오


TCP fast retransmit

loss 발생으로 중복 ACK가 3개 이상 오면 타임아웃 전에 빠른 재전송을 한다.

타임아웃을 기다리는 것은 오버헤드가 크다
떄문에 타임아웃이 오기 전에 loss를 감지해서 빠르게 재전송을 할 수 있다.


참고

GBN과 TCP의 신뢰적 데이터 전송의 비교
공통점 - 순차적 데이터 도착, 재전송, 슬라이딩 윈도우
차이점 - TCP는 빠른 재전송 가능

profile
다 같이 화이팅! 🙋‍♂️

0개의 댓글