TCP에서 가장 중요한 기능
- Reliable Data Transfer (RDT) ⇒ UnReliable 계층에서 RDT Solution + 알파
- Go-Back-N ⇒ 하나의 타이머 이용
- Selective Repeat ⇒ 유실된 패킷만 재 전송
- TCP Connection 전에 TCP 3-way handshake으로 Connection 생성
- SYN (데이터 포함 X, TCP Connection 요청 전송 + Seq Num도 알려 준다, 1 byte) → SYN/ACK (응답, 1 byte) →ACK (데이터 포함, SYN Field가 더 이상 1 아니고 0이다.)
- Close 하는 경우에는 ⇒ Wait (왜냐하면 A → B로 ack가 안 가는 경우에는 재 전송 진행되기 때문에) + Timeout은 항상 변동 되기 때문에, 값을 알 수가 없다.
- FIN → ACK → FIN → ACK 후 완전히 Closed (Closing TCP Connection)
- Flow Control ⇒ Recv의 능력 파악, Data 거의 없는 Segment 보내는 과정을 통하여 ⇒ ack로 Recv Buffer의 Available Space 파악 (결국에는 Recv Buffer에 따라서 Send Buffer 결정)
- Recv Buffer가 언제 사라지는지? ⇒ App에서 Read() 하는 경우
- Congestion Control ⇒ TCP 같은 경우에는 Net가 장애 → 계속 재 전송 진행 → 무조건 Net 상태를 통해서 Send 조절
- 가장 좋은 방식은 라우터가 피드백을 남겨주는 상황이 좋지만, 라우터는 forwarding 하느라 바쁘다.
- 그래서 end ~ end에서 ack를 통하여 Net 상태 유추 (예를 들면, ack가 안 오거나 느리게 오는 경우 등등)
요약
<aside>
💡 TCP Connection = Send, Recv Buffer 생성 ⇒ TCP 3-way handshaking
(1) Go-Back-N
(2) Selective Repeat
——————————— RDT
(3) Flow Control ⇒ 데이터 없는 Segment
(4) Congestion Control ⇒ ACK 통하여 네트워크 상황 유추
</aside>