Computer Science 기본 지식/컴퓨터 네트워크

[네트워크] 전송 계층 (2) TCP 프로토콜

로파이 2021. 1. 6. 11:49

TCP (Transmission Control Protocol)

- 전송계층에서 신뢰성있는 통신을 위한 프로토콜

  • 일대일 연결 지향적 (point to point)
  • 일련의 패킷을 연속적으로 전송하는 파이프라인 전송
  • 양방향 데이터 전송 (full duplex)

- TCP 헤더와 세그먼트

  • Sequence Number(SEQ): 세그먼트 data의 일련번호
  • Acknowlege Number(ACK): 다음 기대되는 세그먼트의 일련번호
  • 연결 수립, 오류/흐름 제어를 위한 정보가 담겨있다.
  • 다중 Pipelining 전송을 위해 window size가 존재한다.
  • 연결 수립을 위한 비트 (SYN)와 연결 종료를 위한 비트 (FIN) 그리고 현재 패킷이 acknowledge number를 담고 있다는 뜻의 비트(ACK)가 있다.

1. TCP의 신뢰성 있는 전송

네트워크에서 신뢰성 있는 전송을 가능하게하는 TCP는 다음 기능을 가지고 있다.

  1. ACK를 받을 때까지 기다리지 않고 일련의 패킷을 연속적으로 전송하는 파이프라인 방식
  2. 누적으로 다음 기대되는 ACK 번호를 전송
  3. 패킷을 보낼 때 설정되는 재전송 타이머

- TCP 송신자와 수신자의 Action

TCP Sender TCP Receiver
어플리케이션으로 부터 데이터를 수신 받았을 경우,
일련번호 Seq가 부여된 세그먼트를 생성하고 타이머를 설정한 후 전송한다.
송신자로 부터 데이터를 수신하였을 경우, 체크섬에 비트 에러가 있을 경우, 패킷을 버린다.
시간 초과(타임 아웃) 됬을 경우 세그먼트를 재전송하고 타이머를 재설정한다. 일련번호를 확인하여 중간에 누락된 패킷이 없다면 최종 누적된 번호를 ACK로 보낸다.
정상적으로 ACK를 수신하였을 경우, ACK을 받은 목록 패킷 리스트를 업데이트 하고 아직 확인되지 않은 ACK에 대해 타이머는 유의한다. 중복 패킷은 버린다.

 

- TCP의 재전송 시나리오

출처: https://wiki.ucalgary.ca/page/Courses/Computer_Science/CPSC_441.W2014/Chapter_3:_Transport_Layer.html#TCP:_Slow_Start_Algorithm

  • Lost ACK Scenario: Host B가 보낸 ACK 전송이 실패된 경우 Host A는 92번 Seq에 대해 재전송을 한다.
  • Premature Timeout: 100번 ACK가 도착하기 전에 짧은 타이머의 이른 시간초과로 재전송이 일어난다.
  • Cumulative ACK: 중간에 100번 ACK가 전송 실패로 도착하지 않았지만 누적된 ACK 번호로 Host A는 Seq 100번 까지 잘 도착한 사실을 알게된다.
  • 전송후 되돌아올 때까지 걸린 시간(RTT)에 따라 잘 고려하여 재전송 타이머의 시간을 설정하도록 한다. 

- Fast Retransmit

 

출처: https://wiki.ucalgary.ca/page/Courses/Computer_Science/CPSC_441.W2014/Chapter_3:_Transport_Layer.html#TCP:_Slow_Start_Algorithm

송신자는 타임 아웃이 발생하지 않는 이상 파이프라인 방식으로 패킷을 연속적으로 보내게 된다.

만약, Host B가 100번에 대한 패킷을 받지 못하고 갭이 생겼을 경우 그 이후 전송하는 ACK 번호는 100번을 부여하여 "100번 패킷을 전송해달라"는 메세지를 보낸다.

이 메세지는 100번 이후 일련 번호가 수신될 때마다 100 ACK를 보내게 되고 이는 재전송이 필요한 때임을 시사한다.

긴 타이머로 이것을 빠른 감지할 수 없으므로 "중복된 ACK 번호"를 수신하는 Host A는 이 현상을 재전송이 필요한 시점이라 판단할 필요가 있다고 생각하고 해당 패킷을 재전송하게 된다.

 

2. TCP 흐름 제어 (Flow Control)

 

출처: https://wiki.ucalgary.ca/page/Courses/Computer_Science/CPSC_441.W2014/Chapter_3:_Transport_Layer.html#TCP:_Slow_Start_Algorithm

수신 버퍼에서 어플리케이션으로부터 데이터가 처리되어 지워지는 속도보다 송신자가 송신한 데이터가 더 빨리 도착할 경우 버퍼 오버런이 발생할 수 있는데,

이 흐름을 제어하기 위해 수신자는 TCP 헤더에 "Window Size" 항목에 자신의 수신 버퍼의 남아 있는 크(rwnd)를 담아 전송한다. 송신자는 ACK 패킷에 기록된 Window Size를 보고 다음 보내는 패킷의 데이터 크기를 이 Window Size를 넘지 않도록 제한한다.

 

3. 3-way Handshaking을 통한 연결 수립 및 4-way Handshaking을 통한 연결 종료

- 연결 수립 과정

두 사용자는 상대방 IP/PORT가 정의된 각자의 소켓을 통해 LISTEN 상태.

  1. A : SYN bit = 1, SEQn = x 인 패킷 전송 ---> 연결 요청 상태 (SYN_SENT)
  2. B : SYN bit = 1, ACK bit = 1, SEQn = y, ACKn = x+1 인 패킷 전송 ---> 연결 수신 (SYN_RCVD)
  3. A : SYN bit = 1, ACK bit = 1, ACKn = y+1 인 패킷 전송 ---> 연결 확립 (ESTAB)

- 연결 해제 과정

두 사용자는 연결 확립 (ESTAB) 상태로 데이터를 송수신 중.

  1. A : FIN bit = 1, SEQn = x 인 패킷 전송 ---> FIN 수신 대기 (FIN_WAIT 1)

  2. B : ACK bit = 1, SEQn = y, ACKn = x+1 인 패킷 전송 ---> 종료 대기 (CLOSE_WAIT)

... 아직 남아 있는 데이터를 전송

  3. B : FIN bit = 1, ACK bit = 1, SEQn= z  ACKn = last (마지막)인 패킷 전송 ---> 마지막 ACK (LAST_ACK)

  4. A : ACK bit = 1, ACKn = z+1 인 패킷 전송 ---> 타이머 설정 (TIMED_WAIT)

B는 마지막에 보낸 메세지에 대한 ACK z+1 수신 후 연결 종료(closed), A는 타이머 시간 초과로 자동 연결 종료 (closed)

 

4. TCP 혼잡 제어(Congestion Control )

 

- 네트워크 혼잡 (Network Congestion)

네트워크에 연결된 노드가 증가하고 네트워크 크기가 증가함에 따라 패킷 손실이 증가하고 라우터에서 대기 시간이 길어진다.

혼잡 제어를 위해 적절한 전송률(transmission rate)를 조절하기 위해 피드백 시스템을 도입한다.

  • End-to-end: 네트워크로부터 피드백이 오지 않기 때문에 패킷 손실과 지연으로부터 혼잡 정도를 추측한다.
  • Network-assisted: 라우터가 직접 end system에 네트워크 혼잡도에 대한 TCP 헤더에 혼잡도를 나타내는 비트를 설정하여 직접적인 피드백을 보낸다.

- 혼잡 제어의 기본 원리

AIMD (Additive Increase Multiplicative Decrease)

혼잡 윈도우, 출처: https://wiki.ucalgary.ca/page/Courses/Computer_Science/CPSC_441.W2014/Chapter_3:_Transport_Layer.html#TCP:_Slow_Start_Algorithm

cwnd : congestion window = last byte send - last byte ACKed

            허용가능한 수신되지 않은 unacknowledged 메세지 한계량

전송률 : 매 RTT마다 cwnd 바이트만큼 메시지 전송 = cwnd / RTT (bytes/sec)

MSS: Maximum Segment Size, TCP를 통해 전송가능한 사용자 데이터의 최대 크기

 

- Additive Increase : 매 Round Trip Time마다 cwnd 사이즈를 1 MSS만큼 증가시키는 정책

- Multiplicative Decrease: 패킷 손실 감지시 현재 cwnd 사이즈에서 1 MSS로 줄이는 정책 

 

이에 따른 cwnd 사이즈 변화 형태는 시간에 따라 톱날 형태의 그래프를 가지게 된다.

AIMD 방식

 

Advanced TCP congestion control

 

Slow Start / TCP Tahoe - 출처 : Host-to-Host Congestion Control for TCP, Alexander Afanasyev et al.

 

 

- SS: Slow Start (TCP Tahoe)

  • cwnd가 초기 링크 전송 용량에 빠르게 도달하기 위해 도입되었다.
  • 매 RTT 마다 cwnd를 두배로 늘린다.  이 단계는 패킷 손실이 감지할 때까지 계속된다.
  • slow start로 인해 두 배씩 증가하는 초기 지수적인 증가로 빠르게 증가한다. 시간 초과 혹은 Fast Retransmit으로 패킷 손실이 감지되었을 때, cwnd를 즉시 1로 줄이고 ssthresh(slow start thresh)를 현재 cwnd의 반으로 설정한다.

- CA: Congestion Avoidance (TCP Tahoe)

  • 현재 cwnd가 ssthesh에 도달하였을 때, 패킷 손실을 피하기 위해 cwnd를 선형적으로 증가시킨다.

- FR: Fast Retransmit (TCP Tahoe)

  • 한계 시간이 길게 설정된 패킷 타이머로 인해 패킷 손실이 늦게 감지될 수 있는 것을 보완하여 번복된 ACK를 패킷 손실로 간주하고 빠르게 패킷 손실을 감지한다.
  • 수신측에서 먼저 도착해야할 패킷이 오지 않았을 때 해당 패킷에 대한 ACK를 번복적으로 보내게 되고 송신자는 3번의 동일한 ACK를 받았을 때 cwnd를 조절하게 된다.

TCP Reno - 출처 : Host-to-Host Congestion Control for TCP, Alexander Afanasyev et al.

- FR: Fast Recovery (TCP Reno)

  • 1 MSS로 줄이는 것은 과도한 줄임으로 네트워크 실제 부하량보다 낮은 전송률이 형성된다. 
  • 시간 초과: 1MSS로 줄이는 것을 유지하고 SS단계 그리고 ssthreh에 도달하여 CA에 진입한다.
  • Fast Retransmit: cwnd를 현재 크기에 반으로 줄인다음 CA 단계에 진입하도록 하였다.

TCP Tahoe vs TCP Reno 비교

https://wiki.ucalgary.ca/page/Courses/Computer_Science/CPSC_441.W2014/Chapter_3:_Transport_Layer.html#TCP:_Slow_Start_Algorithm

TCP Tahoe의 경우 패킷 손실 감지 시 cwnd를 1MSS로 줄인다. TCP Reno는 패킷 손실에 대한 경우를 구별하여 Fast Retransmit 발생시 cwnd를 반으로 줄이고 CA에 돌입하도록 하였다.

 

- Keep Fast Recovery (TCP New Reno)

  • 패킷 손실은 한꺼번에 여러번 발생하는 패턴을 보이는데 이에 따라 cwnd가 한꺼번에 반으로 여러번 감소하여 지수적으로 감소한 결과는 TCP Tahoe보다 안 좋은 성능을 보였다. 이에 따라 다수의 패킷 손실로 Fast Recovery로 진입하였을 때, 손실된 패킷을 재전송하고 이에 대한 ACK가 올 때까지 Fast Recovery를 유지한다.

- Selective Acknowlegement (SACK)

  • 기존 ACK는 축적된 마지막 번호로 전송되었는데, 선택적으로 패킷마다 ACK가 되었는 지 확인하고 재전송이 필요한 패킷만 보낸다. cwnd와 반대로 동작하여, ACK 수신시 1 감소하고 재전송시 1 증가하는 "Pipe"라는 척도를 통해 네트워크 혼잡 정도를 측정한다.
  TCP Tahoe (1988) TCP Reno (1990) TCP New Reno (1999) SACK
Policy Slow Start
Congestion Avoidance
- timeout: set cwnd to 1 MSS
TCP Tahoe
Fast Retransmit
- timeout: set cwnd to 1 MSS
- fast retransmit: set cwnd to half (fast recovery)
TCP Reno
Do not exit Fast Recovery until retransmited data ACK received.
TCP New Reno
Selective acknowlegement and retransmission.
Estimate congestion by pipe.