TCP segment structure
A: ACK: 다음에 예상되는 seq number
head len: TCP 헤더의 길이
checksum : internet checksum
C,E : 혼잡 알림
TCP options : TCP 옵션
RST,SYN,FIN : 연결관리자
seq number : segment seq number :
receive window : flow control :
TCP sequence numbers, ACKs
Sequence numbers
- 세그먼트 데이터에서 첫 번째 바이트의 바이트스트림 number
Acknowledgements(확인응답) - ACK
- 상대방으로부터 예상되는 다음 바이트의 seq number
- cumulative ACK (누적)
수신 측에서 순서가 맞지 않는 세그먼트를 어떻게 처리할까?
=> TCP 스펙에서는 명확하게 정의돼있지 않고, 구현자에 따라서 다를 수 있다.
받은 세그먼트의 seq number의 값에 받은 데이터 크기를 더한 값을 ACK로 돌려준다.
TCP round trip time, timeout
TCP timeout value는 RTT(Round Trip Time)보단 커야하지만, RTT는 변화한다.
TCP timeout value가 너무 짧으면 불필요한 재전송이 발생할 수 있고, 너무 길면 손실을 감지하는게 오래걸린다.
RTT 추정 방법은 다음과 같다.
SampleRTT : 세그먼트 전송부터 ACK 수신까지 측정된 시간, 재전송은 제외한다.
SampleRTT는 다양하게 변동된다. 따라서 smoother(부드러운) 추정치가 필요하다.
- 다만, 최근에는 여러 측정값의 평균을 사용하고, SampleRTT만 사용하진 않는다.
[ EstimatedRTT = (1-a)*EstimatedRTT(past) + a*SampleRTT ]
RTT 추정식은 위와 같다.
a는 Exponential Weighted Moving Average (EWMA) - 지수 가중 이동 평균의 가중치를 뜻한다.
a는 일반적으로 0.125로 설정된다.
timeout interval: EstimatedRTT + safty margin
EstimatedRTT의 변동이 크면, safty margin이 커져야함.
[ TimeoutInterval = EstimatedRTT + 4*DevRTT(safty margin) ]
[ DevRTT = (1-β) * DevRTT(past) + β * | SampleRTT - EstimatedRTT | ]
DevRTT : EstimatedRTT와 SampleRTT의 편차를 EWMA로 계산
일반적으로, β는 0.25로 설정된다.
TCP Sender (simplified)
event : 애플리케이션으로부터 데이터 수신
- seq number가 있는 세그먼트를 생성한다.
- seq number는 세그먼트의 첫번째 data byte의 byte-stream number이다.
- 타이머가 실행중이지 않으면 실행시킨다.
- * 타이머는 ACK되지 않은 가장 오래된 세그먼트에 대한 것이다.
event : timeout
- 시간초과가 발생한 세그먼트를 재전송한다.
- 타이머를 초기화시킨다.
event : ACK received
- ACK가 이전에 ACK 되지 않은 세그먼트를 받아들이면,
- * ACK된 것으로 알려진 것을 업데이트한다.
- * 아직 ACK되지 않은 세그먼트가 있으면 타이머를 시작한다.
TCP Receiver : ACK generation(생성)
Event at receiver | TCP receiver action |
||||
데이터 세그먼트 수신 | 수신된 세그먼트의 seq number를 기반으로 ACK 세그먼트 생성 | ||||
시간초과 | 재전송이 필요한 데이터 세그먼트가 있는 경우, ACK number를 마지막으로 수신한 세그먼트의 seq number로 설정해서 ACK 세그먼트 생성 |
||||
여러 ACK 세그먼트 수신 | 마지막으로 수신한 ACK Number와 일치하지 않는 ACK number를 가진 ACK 세그먼트를 생성해서 송신측에 재전송이 필요한 세그먼트 재전송 요청 |
만약 ACK가 유실된 경우, 재전송한다.
만약 timeout 된 경우, 재전송한다.
Host A가 비록 ACK=100은 받지못했지만, ACK=120을 받았다는 것은 Host B가 두 세그먼트 모두 정상적으로 받았다는 뜻이 된다.
만약 Seq=92인 세그먼트가 실패했다면 Seq=100에 대한 ACK를 보내지 않았을 것이고 대신 이전에 받은 패킷 중 가장 최근에 받은 패킷에 대한 ACK를 보내서 어떤 패킷이 전송이 실패했는지 알려줄 것이다.
이것이 세그먼트 전송 자체가 실패했을 때의 예시이다.
Seq=100인 세그먼트가 유실되어 Host B가 받지 못했고 다음으로 들어오는 패킷들에 대한 ACK로는 이전에 받은 패킷중 가장 최신 패킷의 ACK인 100을 보내게 된다.
'학교강의필기장 > 컴퓨터네트워크' 카테고리의 다른 글
컴퓨터네트워크[15]: Principles of congestion control (0) | 2023.04.25 |
---|---|
컴퓨터네트워크[14]: flow control / connection management - TCP (0) | 2023.04.25 |
컴퓨터네트워크[12]: Principles of reliable data transfer (0) | 2023.04.20 |
컴퓨터네트워크[11]: Connectionless transport: UDP (0) | 2023.04.19 |
컴퓨터네트워크[10]: Multiplexing and demultiplexing (0) | 2023.04.19 |