TCP Flow Control
How much the receiver can handle?
TCP에서 Flow Control은 Sender가 데이터를 보낼때 처리량 이상으로 데이터를 전송하는 경우 데이터가 drop되므로 이를 방지하기 위한 방법입니다.
즉, 수신자의 처리 능력에 맞춰 송신 속도를 제어하는 방법 이라고 요약 가능합니다.
그래서 이를 해결하고자 Window size 같은 항목을 헤더에 두는것입니다.
그래서 Sender에게 한번에 처리 가능한 양을 미리 알려주고 이 사이즈만큼 지속적으로 전송하도록 유도하는거죠.
아래의 예시에서는 window size가 3이고, 처음의 window size를 알기위한 패킷을 제외하면
그 이후로는 Sender가 패킷을 3개씩 모아서 보내고있습니다.
Sliding Window
Slinding window라는 방법을 통해서 전송한 모든 패킷이 ACK을 받지 않아도 다음 패킷을 연속적으로 패킷을 전달 할 수 있습니다.
Sliding window의 동작 방식은 아래와 같습니다.
- 송신: 송신자는 일정 범위 안에서 여러 패킷을 보냅니다. 그리고 패킷이 도착했을 때마다 수신자는 해당 패킷에 대한 ACK를 보냅니다. ACK를 수신하면 윈도우가 앞으로 슬라이딩되면서 송신자가 새로운 데이터를 더 전송할 수 있게 됩니다.
- 수신: 수신자는 패킷을 받아들이고, 만약 모든 패킷이 순서대로 도착했다면 바로 ACK를 보내지만, 순서가 틀린 경우에는 다음에 기대하는 패킷 번호를 ACK로 보내서 재전송을 요청합니다.
예를 들어, 송신 윈도우가 5라고 가정했을 때, 송신자는 최대 5개의 패킷을 연속적으로 보낼 수 있습니다. 수신자가 첫 번째 패킷에 대한 ACK를 보내면 윈도우는 하나씩 슬라이딩되어 송신자는 새로운 패킷을 전송할 수 있게 됩니다.
Window Scaling
고속 네트워크에서는 TCP의 64KB 데이터 용량은 너무 작습니다.
그래서 데이터의 크기를 키울 수 있는 방법이 있는데 Window Scaling이라고 부릅니다.
Window Scaling Factor는 0 ~ 14의 범위를 가질 수 있습니다.
그래서 최대 Window Size는 1GB 입니다. ((2^16 - 1) * 2^14)
TCP Congestion Control
How much the network can handle?
Congestion Control은 네트워크의 혼잡 상태를 고려하여 송신 속도를 조절하는 방법 입니다.
A가 B로 데이터를 보낼때 A와 B의 성능은 동시에 여러개를 처리 할 수 있어 문제가 없습니다.
그런데 A->B로 데이터를 보내주는 중간에 있는 라우터가 1개밖에 처리를 못하면 나머지 패킷들이 drop되게 됩니다.
이런 상황들을 고려해야합니다.
두 가지의 TCP Congestion Control 방법이 있습니다.
1. TCP Slow start
Congestion Window size 증가량을 매 ACK마다 1씩 늘려보는 방법입니다. (exponentially 증가합니다)
Threshold에 도달하는 경우 Congestion Avoidance 알고리즘을 동작합니다.
2. Congestion Avoidance
slow start가 threshold에 도달했을때 시작되는데요.
Congestion Window size를 1씩 늘려봅니다.
Congestion 알림은 어떻게 하는가?
- Congestion 발생의 경우 우리는 router가 패킷 drop하는걸 원하지 않습니다.
- ECN bit을 사용합니다.
- 리시버는 이 bit을 sender에게 다시 보냅니다.
- ECN은 IP header bit 이고, Router는 패킷을 drop하지 않고 그것의 limit이 얼마인지 알려줍니다.
'CS 지식 > 네트워크 기본 다지기' 카테고리의 다른 글
UDP와 DNS (1) | 2024.09.30 |
---|---|
TLS 1.2, 1.3 (4) | 2024.09.30 |
Layer 4 vs Layer 7 Load balancing (0) | 2024.09.29 |
TCP Segment 구조 (0) | 2024.09.23 |
TCP란 (+ TCP Fast Open) (0) | 2024.09.23 |
개발 및 IT 관련 포스팅을 작성 하는 블로그입니다.
IT 기술 및 개인 개발에 대한 내용을 작성하는 블로그입니다. 많은 분들과 소통하며 의견을 나누고 싶습니다.