miinsun
[Network] TCP TimeOut, TCP 재전송 본문
타임 아웃이란?
* TCP는 타이머를 통해서 데이터 재전송 여부를 판단
* timeout이 되기 전에 feedback이 오면 다음 패킷을 보냄
* timeout이 되면 패킷이 유실된 것으로 판단하고 재전송
RTT(Round Trip Time, 왕복 시간)
- 세그먼트가 수신자에게 도착하고 feedback이 돌아오는 시간을 rtt라고 함
- 타이머 시간을 결정 짓는 요소
- 타이머 시간 판단시, 시간이 너무 짧으면 오버헤드가 발생
- 반대로 시간이 너무 길면, 유실 대응이 늦어짐
- 그렇다면 타이머 시간을 RTT만큼 설정하면 되지 않을까?
- 모든 패킷의 RTT는 다르기 때문에 다른 RTT를 적정 RTT로 맞춰줘야 할 필요가 있음
- 대표값으로 맞춰줘야함 → Estimated RTT(현재까지 측정해온 RTT의 합을 평균)
TCP 재전송 시나리오
- ACK가 유실되었을 때
- HostA가 HostB로 데이터를 전송
- 즉, HostA가 92~99(8 bytes)까지 해당하는 데이터 패킷을 전송함
- HostB가 HostA로 응답 데이터 전송
- ACK 값 100을 전송함
- (2)의 과정이 유실되었을 때, timeout이 일어남
- timeout이후에 HostA가 HostB로 데이터를 재전송
- HostA가 HostB로 데이터를 전송
- ACK가 전송되는 도중에 timeout 발생되었을 경우
- HostA에서 HostB로 데이터를 두번 통신
- 처음엔 HostA가 92~99(8 bytes)까지 해당하는 데이터 패킷을 전송함
- 다음으로 HostA가 100~119(20 bytes)까지 해당하는 데이터 패킷을 전송함
- HostB가 HostA로 응답 데이터를 송신, ACK이 HostA에 도달하기 전에 timeout 발생
- timeout이 발생한 seqNum 92를 HostA가 HostB에 재전송을 함
- HostB가 HostA로 다음 데이터를 요구
- HostB가 HostA에 ACK 120을 보냄 (즉, 120번까지 들어왔으니 그 이후를 보내달라는 의미)
- HostA에서 HostB로 데이터를 두번 통신
- ACK가 누적된 경우
- HostA에서 HostB로 데이터를 두번 통신
- 처음엔 HostA가 92~99(8 bytes)까지 해당하는 데이터 패킷을 전송함
- 다음으로 HostA가 100~119(20 bytes)까지 해당하는 데이터 패킷을 전송함
- HostB에서 HostA로 응답 데이터 전송
- ack = 100 유실
- HostA에서 ack = 100을 받기 전에 데이터 전송
- seq = 100, 20byte(100 ~ 119)
- HostB에서 응답 데이터 전송
- ack = 120
- HostA에서는 ack = 100이 유실되었어도 ack = 120을 보고 그 전 데이터까지 잘 받았다고 판단
- HostA에서 HostB로 데이터를 두번 통신
'Infra > Network' 카테고리의 다른 글
[Network] TCP의 흐름제어, 연결제어, 혼잡제어 (0) | 2022.07.12 |
---|---|
[Network] TCP의 이해 (0) | 2022.07.12 |
[Network/Java] 자바 소켓 통신 (0) | 2021.12.03 |
[Network] TCP와 UDP의 차이 (0) | 2021.12.03 |
[Network/Python]파이썬 소켓 통신 (0) | 2021.12.02 |
Comments