TCP Flow Control
위 그림은 link->network->transport->application으로 이어지는 데이터 전송 과정을 표현하고 있다.
transport 계층까지 전송된 데이터는 바로 application 계층으로 올라가지 않고, TCP socket에 있는 buffer에 저장된다.
만약 sending TCP의 전송 속도가 너무 빠르면 TCP socket buffer가 차오르게 되고, 데이터가 loss될 수 있다.
RcvBuffer는 전송 받는 데이터를 넣을 전체 공간을 의미하며 rwnd는 비어있는 버퍼의 크기를 의미한다.
sender는 rwnd값을 이용하여 unacked data를 rwnd가 넘지 않게 조절하면서 buffer overflow를 방지하는데,
이를 `flow control`이라고 한다.
이 rwnd의 값은 내보내는 stream에 적히게 되어, 들어오는 stream이 전송 속도를 조절할 수 있도록 한다.
Connection Management
TCP protocol은 data를 exchaning하기 전, sender와 receiver는 handshake를 통해 연결을 생성한다.
이 handshake는 3-way로 이루어지게 되는데, 2-way가 아닌 3-way로 이루어지는 이유는 무엇일까?
2-Way Handshaking의 문제
위 그림은 2-way handshake시 발생할 수 있는 문제를 담은 시나리오이다.
클라이언트에서 전송한 연결 요청에 대해 서버가 응답하는 과정에서,
응답이 늦어져 클라이언트에서 연결 요청을 재전송하였다.
재전송 직후에, 이전에 보냈던 요청에 대한 응답이 들어오는데 클라이언트는 이 응답이 자신이 처음에 보낸 요청에 대한 응답인지, 이후에 보낸 응답인지 구분할 수 없기 때문에 일단 연결된것으로 처리하고 소켓을 열게된다.
모든 작업이 완료된 후 소켓을 닫게 되는데, 닫은 이후 재전송한 요청이 도착하는 경우 서버에서는 이 요청에 대해 다시 소켓을 열게 되고, half open connection문제가 발생한다.
3-way Handshaking
2-way 방식에서 발생하는 문제를 방지하기 위해 3-way handshaking 방식을 사용한다.
3-way 방법에서는 server에서 client가 alive라는 것을 확인하고 establish 상태로 들어가기 때문에, 앞서 발생한 문제를 예방할 수 있다.
Closing connection
TCP에서 conneciton close는 위와 같은 형태로 이루어진다.
우선 클라이언트에서 FIN(Final) segment를 보내면 클라이언트는 더 이상 서버에게 데이터를 전송하지 않는 상태가 된다.
서버는 FIN segment에 대한 응답을 보내고 클라이언트는 이 응답을 받고 server close를 대기하게된다.
이후 시간이 흘러, 서버도 FIN segment를 만들고 전송하는데 , 클라이언트는 이에 대한 ACK를 보낸다.
ACK를 받으면 서버는 TCP 연결에 사용된 socket, process 등을 모두 free시킨다.
다만 클라이언트는 segment lifetime의 2배 정도를 대기하게 되는데, 이는 클라이언트가 전송한 ACK가 손실될 경우 서버가 재전송하는 FIN segment를 받기 위해 socket을 남겨두어야 하기 때문이다.
Congestion control
Congestion control을 위한 방법으로는
end-end congestion control, network-assisted congestion control의 두 가지 방법이 있다.
`end-end 방식`
실제로 혼잡이 발생하는 것은 네트워크 내부이지만 이를 고려하지 않고 end system에서 발생하는 loss와 delay만을 감지하는 방식이다. 이는 주로 TCP에 의해 사용된다.
`network-assisted 방식`
라우터가 엔드시스템에 혼잡을 알리는 방식이다.
이 때 single bit를 사용하는 방식이 있고 explicit rate를 전달하는 방식이 있는데, single bit의 경우 혼잡 여부만 알리고 두 번째 방법은 혼잡의 정도를 알리게 된다.
TCP congestion control
TCP의 congestion control은 AIMD(addictive increase multiplicative decrease)라고 한다.
TCP는 전송 과정에서 1RTT마다 1MSS만큼 cwnd의 크기를 증가시킨다.
만약 loss가 발생할 경우에는 이 cwnd의 크기를 절반으로 줄인다.
TCP Slow Start
TCP는 최초 데이터 전송 시 1MSS는 cwnd로 잡으며,
이후 하나의 ACK를 받을 때 마다 하나의 MSS를 추가하여 데이터를 전송한다.
따라서 결과적으로는 2배씩 증가하는 것 처럼 보이게된다.
TCP는 이렇게 2배씩 cwnd의 값을 증가시키다가, 특정 시점이 되면 cwnd의 증가를 조심해야 할 것이다.
하지만 이 '시점'이라는 것을 초기에는 알기 힘들기 때문에 이를 추정하기 위해 `ssthresh`라는 값을 사용한다.
ssthresh라는 default value는 OS에 의해 결정되며, ssthresh보다 cwnd가 작은 경우 slow start를 수행한다.
이후 어느 시점에서 loss가 발생할 경우 ssthresh를 cwnd의 절반으로 설정한다.
이렇게 되면 ssthresh가 cwnd보다 작아지게 되는데, ssthresh < cwnd인 동안에는 slow start를 수행하지 않고
앞서 언급한 TCP congestion control에서 사용한 방법으로 cwnd의 크기를 조정한다.
TCP throughput
TCP의 throughput은 윈도우 사이즈 / RTT 로 구할 수 있을 것이다.
만약 평균적으로 loss가 발생하는 window size가 W라면,
$ \frac{3}{4}$ $ \frac{W}{RTT}$가 throughput임을 알 수 있다.
TCP Fairness
bandwidth R인 링크를 공유하고 있는 K개의 TCP session이 있을 때, 공평하게 bandwidth를 분배하려면
R/K가 되어야 할 것이다.
처음에 어떤 위치에서 시작하더라도, loss 발생 시 cwnd를 절반으로 줄이게 되기 때문에
bandwidth를 많이 차지했던 end system의 cwnd가 더 많이 줄어들게 된다.
따라서 시간이 지나면 점차 공평한 지점으로 이동한다.
다만 이는 두 엔드시스템이 bottleneck으로부터 같은 거리에 있는 경우 성립한다.
'Network' 카테고리의 다른 글
[Computer Network] Transport Layer(UDP와 TCP) (0) | 2023.11.01 |
---|---|
[Computer Network] Socket Programming (0) | 2023.11.01 |
[Computer Network] DNS (Domain Name System) (0) | 2023.10.31 |
[Computer Network] Application 계층의 Protocol (0) | 2023.10.31 |
[Computer Network] Internet Layer (0) | 2023.10.29 |