RTT란, 데이터가 송신됐다가 응답이 돌아오는 시간이다.
TCP는 데이터 송신 중 문제가 발생했을 때 재전송을 위해 timeout을 설정하는데, 이는 RTT보다 길게 설정한다.
허나 매번 인터넷 환경이 변하므로, TCP는 동적으로 timeout 시간을 조정한다.
측정 방법은 sender에서 세그먼트를 보낸 뒤, ACK이 돌아오는데까지 걸린 시간을 측정한다. 단, 도중에 세그먼트를 재전송한 경우에는 RTT값으로 치지 않는다. 먼젓번에 보낸 세그먼트에 대한 ACK인지, 재전송한 세그먼트에 대한 ACK인지 알 수 없기 때문이다.
하지만 RTT를 상시 변경할 수는 없기 때문에 앞전에 측정한 RTT 값과의 평균을 사용하여 timeout을 설정한다. 또한 앞선 평균 RTT와 SampleRTT의 비율을 조정하여 구한다.
EstimatedRTT = 이전 평균 RTT
SampleRTT = 측정 RTT
α = 가중치(일반적으로 1/8 = 0.125를 사용)
α가 크면 SampleRTT에 민감하다는 뜻이므로 곧 네트워크 변화에 민감하다는 의미이다.
EstimatedRTT를 그대로 timeout으로 쓰기에는 premature timeout이 발생하기 쉬우므로 safety margin을 추가하여 timeout interval을 구해보면 다음과 같다.
DevRTT는 편차이고, 구하는 공식은 다음과 같다.
β는 일반적으로 1/4 = 0.25를 사용한다.
TCP flow control
Receiver가 응답할 때 TCP header에 rwnd 필드에 현재 수용 가능한 RcvBuffer의 크기를 추가한다.
Sender는 이를 보고 unACKed data(아직 ACK을 받지 않은 총 데이터)의 양을 제한한다.
TCP connection management
TCP에서 sender와 receiver는 3-way handshake 과정을 거쳐 연결한다.(2-way는 여러 상황에 문제가 생길 수 있기 때문)
(서로 연결에 동의하고, 상태를 확인 - SYNbit, Seq)
세 개의 과정을 거쳐 3-way라고 한다.
1. SYN: 송신자가 연결 요청을 보냄
2. SYN-ACK: 수신자가 요청을 확인하고 수락함
3. ACK: 송신자도 확인함
이 때, 서로의 source, dest, tcp socket, seq num, rcv buffer의 크기를 확인한다.
서버는 위의 3개의 단계를 거친 후에 established 상태가 된다.
closing 시에는 4-way closing을 거친다.
- FIN (Finish): 한쪽에서 연결 종료 요청.
- ACK (Acknowledgment): 반대쪽에서 FIN에 대한 확인.
- FIN (Finish): 반대쪽에서도 연결 종료 요청.
- ACK (Acknowledgment): 처음 요청한 쪽에서 FIN에 대한 확인.
'cs > 데이터통신' 카테고리의 다른 글
IP Datagram format (0) | 2024.11.30 |
---|---|
Network layer (1) (0) | 2024.11.30 |
Congestion control (0) | 2024.11.30 |
TCP State transition diagram (0) | 2024.11.30 |
Transport layer (0) | 2024.11.30 |