본문 바로가기

ComputerScience/Network

TCP - 2. Reliable data transfer

728x90

1. Reliable data trasfer

tcp는 best effort 방식의 비신뢰성 ip위에서 동작한다고 했다.

timeout 발생, 중복 ack 수신 시에 sender는 재전송을 시도한다.

 

timer는 한 stream(여러 segement들로 구성)에 대해 한번 설정된다. 가장 oldest unacked segment를 시작점으로 설정된다.

timeout내에 ack가 도달하지 않아 재전송할때는 기존 timeout 해제 -> 재전송 -> timeout길이를 두배로 다시 설정한다.

이렇게 하는 이유는 network를 더 혼잡하게 만들지 않도록 하기 위해서다. 즉 좀 더 천천히 재전송하기 위해 이렇게 한다.

 

만약 ack가 timeout내에 도달하면 해당 세그먼트를 전송완료 체크하고 윈도우를 이동하는 등 작업을 수행하면 된다. 그리고 timer를 다음 oldest unacked packet에 대해 설정한다.

하지만 중복 ack였다면 (뒤에서 자세히)

2. Sender side

1) connection이 만들어지면 초기 seq#를 설정한다.

2) seq#로 segment를 만들고 하위 계층으로 전달. 설정된 타이머가 없다면 지금 패킷이 가장 oldest unacked packet이므로 타이머 설정, 이미 타이머 설정되어 있다면 추가 설정 안함.

3) timeout 발생 : 기존 timeout 해제 -> 재전송 -> timeout길이를 두배로 다시 설정

4) 올바른 ack가 도달했다 : sendbase(다음에 보낼 패킷) 전송한다.

5) 중복 ack가 도달했다 : (뒤에서 자세히)

두번째로 도달한 ack=120은 중복 ack 수신 처리된다.

ack100이 소실됐지만 누적ack를 사용하기 때문에 ack120만 받아도 HostA는 B가 byte stream의 119번 위치까지는 잘 받았다고 확신할 수 있다.

3. Receiver side

1) 올바른 seq# segment를 수신했다

500ms만 더 기다려서 다음 segement도 잘 수신되는지 기다린다. 이렇게 조금만 늦게 delayed ack를 보낸다. 그러면 (누적)ack를 보내는 횟수를 줄일 수 있다. 

ack9, ack10을 보내야 하는 걸 조금만 기다리면 ack10 하나로 퉁칠 수 있다.

즉 한번 더 기다린다는 뜻이므로 20개가 도달하면 대략 ack 10번으로 퉁칠 수 있는 것이다. (두개 받았을 때 ack하나 보내는 꼴)

하지만 오류가 발생할수도 있으니 반드시 ack수가 절반이 되는 것은 아니다.

 

2) 기대하는 seq#보다 큰 번호가 도달함 (out-of-order, gap 탐지)

1,2,5번을 순서대로 수신했다면 5를 받자마자 즉시 (중복) ack3를 보내준다. (다음 기대하는 #)

 

3) gap을 채우는 패킷을 수신

현재 버퍼 상태 : 2 _ _ 5

이어서 4, 3이 도달한다면

ack는 순서대로 3, 6을 보내게 된다.

4. Fast retransmit

packet loss를 파악하기 위해 timeout만큼 기다려야 했다.

packet loss를 인지했을때 윈도우가 크면 클수록 재전송되는 ack의 수가 많아진다. 이를 활용하자는 것이다.

핵심 아이디어는 중복ack를 통해 packet loss를 timeout보다 빠르게 탐지하고 재전송을 수행하자는 것이다.

sender가 3번 동일한 ack를 수신하면 timeout을 기다리지 않고 seq#가 가장 작은 unacked segment를 다시 전송해준다.

첫번째 ack100이후로 중복 ack100이 총 세번 도달했다. (동일 패킷이 총 네번) 그러면 timeout을 기다리지 않고 seq100을 다시 보내준다.

이게 fast retransmit이다.

728x90
반응형