컴퓨터통신#6
LeeMir, 06 April 2021
3장 - Transport Layer(이어서)
TCP : Closing a Connection
- FINbit를 이용해 연결을 종료함
- 한 호스트에서 보내면 그에 대한 ACK를 받아야하고, 잠시 후 ACK를 보낸 호스트에서 FINbit = 1인 segment를 전송함
- TIMED_WAIT : ACK가 오지 않으면(Loss된 경우) FINbit를 한번 더 보냄
Congestion
- 너무 많은 source들이 너무 많은 data를 너무 빨리 보냄
- Flow Control은 End Host간 이슈, Congestion Control은 Network 전체 차원 이슈
- Packet Lost와 Deley가 발생
TCP Congestion Control : Additive Increase Multiplicative Decrease
- Send Window
- Sent, But Not Acked
- = min(rwnd, cwnd)
- rwnd가 충분히 크다면 cwnd(Congestion Window)의 영향을 받음
- Additive Increase
- Loss가 발생할 때까지 매 RTT마다 cwnd가 1MSS(Max Segment Size)만큼 증가 : linear
- Multiplicative Decrease
- Loss가 발생할 때마다 cwnd를 1/2로 감소
- cwnd를 동적으로 바꾸면서 Congestion Control을 함
- rwnd는 무시한다고 가정했을 때 Send Window는 cwnd로 조절함
- cwnd가 너무 커지면 Network 효율성은 증가하지만, 그만큼 Loss가 발생할 확률이 커짐
TCP Slow Start
- TCP 세션 설정 직후 cwnd는 linear가 아니라 exponentially하게 늘어남
- 초기 cwnd = 1 MSS, 이후 매 RTT마다 cwnd가 2배로 늘어남
- Piggybacked ACK를 사용
- ACK를 즉각 즉각 보내지 않음
TCP : Detecting, Reacting to Loss
- Timeout
- cwnd를 1로 만듦
- cwnd를 exponentially하게 증가시킴(Slow Start처럼)
- 임계값이 있어, 도달하면 그 때부터는 linear하게 증가(cwnd = cwnd + 1MSS)
- 3 Duplicate ACKs : TCP RENO
- 약한 congestion이라고 생각
- cwnd를 1/2로 줄이고 이후 linear하게 증가
- TCP Tahoe는 어떤 상황에서도 cwnd를 1로 만듦
TCP : Switching from Slow Start to CA(Collision Avoidance)
- Collision Avoidance : Exponential에서 Linear로 전환
- ssthresh라는 임계값 존재
- Loss가 Detect되면 cwnd가 절반으로 설정
TCP throughput
- 윈도우 크기가 W일 때에만 Loss가 발생하는 이상적인 상황에서 TCP throughput = W * 3/4 per RTT
TCP throughput = (1.22 * MSS) / (RTT * L^(1/2))
TCP Fairness
- K개의 TCP Session이 Bandwidth가 R인 하나의 Link(Bottleneck)를 공유한다면, 평균 Rate는 K/R을 유지해야함
- 두개의 TCP Connection이 있을 때, 처음 둘이 나누어 가진 Throughput은 공평하지 않더라도 AI와 MD를 반복하다보면 Fair에 근접해짐
- TCP 연결로만 봤을 때는 Fair하나, Application 입장에서는 모든 App이 Connection의 개수가 동일하지 않기 때문에 Fair하지 않음
Explicit Congestion Notification
- TCP는 End-to-End Congestion Control을 하는데, 이 때 Router는 관여하지 않음
- 효율성이 떨어지는 측면이 있어 Network(Router)의 도움을 받는 방식인 ECN이 나옴
- IP의 ToS(Type of Service) Field와 TCP의 CWR, ECE 플래그를 이용함
- Congestion에 빠진 Router에서 ECN = 11로 설정하면 Destination에서 Source로 ACK를 보낼 때 ECE = 1로 해서 보내면 Source에서는 cwnd를 절반으로 줄임