신뢰성있는 데이터 전송을 위한 요소 5 : checksum, ack(+nack), pipelining, sequence number, Timer
1. TCP의 신뢰성있는 데이터 전송
1) 신뢰성있는 데이터 전송
TCP는 IP의 unreliabl 서비스 위에 RDT(Reliable Data Transfer) 서비스를 생성합니다. (파이프라인 세그먼트, 누적 ack, 단일 재전송 타이머)
재전송은 timeout 이벤트, 중복 ack에 의해 트리거됩니다.
2) TCP sender 이벤트
TCP는 full duplex(전이중) 데이터 전송 방식으로, 동일 연결에서 양방향으로 데이터가 흐른다. 그러므로 Client, Server 모두 sender가 될 수 있다.
TCP 전송측에서는, 앱으로부터 데이터를 받을 수도 있고, 네트워크 계층을 통해 ack를 받을 수도있다. 또한, timeout이 발생할 수도있다.
- 앱으로부터 데이터 수신
- sequence 번호를 담아 segment를 생성한다. 그리고 checksum을 계산해 담는다.
- 타이머가 실행중이 아니라면, 실행한다. TCP에서는 단일 재전송 타이머를 사용한다. 타이머는 가장 오래된 ack에 대해 설정한다.
- 타이머가 실행중이라면, 이미 데이터는 전송되었으나 ack를 받지 못한 세그먼트가 있다는 의미다.
- 반대로, 실행중이 아니라면, ack를 받지 못한 세그먼트가 없다는 의미이므로, 타이머를 실행한다.
- 만료 주기는 Timeout Interval로 설정한다.
- Timeout
- Timer가 만료되어 timeout이 발생한 경우, 해당 세그먼틀 재전송한다. 그리고 타이머는 재시작한다.
- ACK 수신
- ack을 받지 못한 세그먼트의 ack를 받는다면
- acked된 세그먼트를 업데이트한다.
- ack를 받지 못한 세그먼트가 있다면, 타이머를 시작한다.
- ack을 받지 못한 세그먼트의 ack를 받는다면
3) TCP sender의 동작
SendBase | NextSeqNum | ||||||||
Sent & ACKed | Send & Not yet ACKed |
TCP sender는 2개의 변수를 유지한다.
NextSeqNum : 다음번에 내보낼 seq. num.
SendBase : 마지막 ACK를 받은 시퀀스 번호
0) 연결 시작 시
NextSeqNum, SendBase 둘 다 InitialSeqNum 로 설정한다
1) 어플리케이션에서 데이터를 받은 경우
segment를 생성하고, 헤더에 NextSeqNum을 붙어 seq. num.을 만든다.
세그먼틀르 IP 계층으로 내보낸다(전송한다)
NextSeqNum 을 NextSeqNum + Data Length로 업데이트한다. 타이머가 실행중이지 않다면, 실행한다.
2) Timeout 이 발생한 경우
보냈지만 ACK를 받지 못한 세그먼트 중, 작은 Sequence 번호를 가지는 데이터를 재전송한다. 그리고 타이머를 재시작한다.
3) ACK 필드 값이 y인 ACK를 받은 경우
SendBase가 y보다 작다면, SendBase를 y로 업데이트한다.
아직 보냈지만 ACK를 받지 못한 세그먼트가 있다면, 타이머를 시작한다. 그렇지 않다면, 타이머를 중지한다.
2) TCP ACK 생성
receiver에서의 이벤트 | TCP receiver 동작 |
seq # 인 in-order 세그먼트 도착. seq #까지 모든 데이터 ACK받은 상태 | 500ms까지 다음 세그먼트를 기다리며 ACK를 지연시킨다. 다음 세그먼트가 오지 않으면 ACK를 보낸다. (tcp는 누적 ACK를 사용하고, pipelining을 하기 때문에, segment는 연속적으로 도착한다. 보낼 데이터가 없는데 ACK만 보내기위해 세그먼트를 보내야하기 때문에(최소 고정 헤더 20byte) 전송 절약하기 위함) |
seq # 인 in-order 세그먼트 도착. 다른 세그먼트는 ACK pending 상태 | 즉시 하나의 누적 ACK를 보내며, 순서대로 두 세그먼트를 모두 ACK한다. |
예상했던 seq # 보다 높은 번호의 out-of-order 세그먼트 도착. Gap 탐지됨 | 즉시 다음 예상 바이트의 시퀀스 번호를 나타내는 중복 ACK를 보낸다. tcp는 nack을 사용하지 않기때문에 "나 얘 기다리고있어"하고 다시 보낸다. |
부분적으로 또는 완전히 Gap을 채우는 세그먼트의 도착한 경우 | 갭의 하단에서 시작하는 경우, 즉시 ACK를 보낸다. 그렇지 않은 경우(=중간의 세그먼트가 온 경우) 중복 ACK를 보낸다. |
2) TCP 빠른 재전송
TCP fast retransmit 이란 duplicate ACK가 들어오면, timeout이 발생하기 전에 재전송하는것을 말한다.
sender가 같은 데이터에 대해 3번 ACK를 받으면(duplicate ACK 3번), 가장 작은 seq #를 갖는 ACK되지 않은 세그먼트를 재전송한다.
타임아웃 기간이 일반적으로 길다. 패킷 분실이 발생하고 다시 보내기까지 오랜 지연 시간이 걸린다.
duplicate ACK를 여러 번 받았다는 것은 해당 세그먼트는 손실되었을 가능성이 높으므로 timeout을 기다리지 않는 것이다.
Duplicate ACK를 3번 받으면 손실되었다고 판단하는 이유?
Duplicate ACK가 1번 온 경우에는, 순서가 바뀌어서 전송되었을 수 있으므로
3번 받으면 손실되었다고 판단하여 재전송한다.
'CS > 네트워크' 카테고리의 다른 글
[네트워크] 전송 계층 - TCP : 연결 관리 (0) | 2025.01.12 |
---|---|
[네트워크] 전송 계층 - TCP : 흐름 제어 (0) | 2025.01.12 |
[네트워크] 전송 계층 - TCP : segment 구조 (0) | 2025.01.12 |
[네트워크] 전송 계층 - 신뢰성 있는 데이터 전송의 5 원리 (0) | 2025.01.12 |
[네트워크] 전송 계층 - UDP (0) | 2025.01.12 |