TCP: Transmission Control Protocol
8. Error Control
Error Control
- TCP는 신뢰할 수 있는 transport layer 프로토콜이다.
- 즉, TCP로 데이터 스트림을 전송하는 응용 프로그램은 TCP에 의존해 전체 스트림을 반대쪽 끝에 있는 응용 프로그램에 오류 없이 순서대로 전달할 수 있다.
- TCP의 Error Control(오류 제어)는 checksum, acknowledgment, and time-out의 세 가지 tool을 사용하여 수행된다.
알아두기
- ACK에 대한 ACK은 존재하지 않는다. 즉, 내가 보낸 ACK을 상대방이 잘 받았는지 확인하는 ACK은 존재하지 않는다.
- 데이터는 순서가 잘못된 상태로 도착하여 receiving TCP에 의해 일시적으로 저장될 수 있지만, TCP는 순서가 잘못된 데이터가 프로세스에 전달되지 않도록 보장한다. → TCP는 receiving buffer에서 application으로 데이터를 전송할 시 제대로 된 데이터만 올려보낸다(신뢰성 보장). 순서 바뀐 것은 아예 process로 전달되지 않음
Normal operation
- 일반적인 데이터 전송 과정.
- sender가 data를 보내면 receiver는 보낸 data를 잘 받았고 다음 패킷을 보내달라는 의미로 ACK을 전송한다.
- 이때 상대에게 전송하는 ACK의 갯수를 줄이기 위한 Rule 1, 2, 3이 존재
양방향. Client, Server에는 Sending Buffer, Receiving Buffer이 각각 존재.
Rule 1
데이터를 받았을 때 ACK을 보내야 하는데 ACK을 바로 보내는 게 아니라 Buffer에 보낼 데이터가 있는지 확인하고 보낼 데이터가 있으면 같이 보낸다
(= ACK가는 김에 데이터도 같이 가자)
Rule 2
Sender는 패킷을 송신하고 나면 별도로 정의된 Timer(ACK-delaying timer)를 켜놓고 정해진 시간 동안 대기한다. 위의 그림에서는 지연 시간을 50ms로 설정하였다. 50ms까지 기다려도 Buffer에 보낼 데이터가 없을 시 데이터 없이 ACK만 전송한다.
Rule 3
timer를 켜놓고 기다리는 중에 패킷이 하나 더 도착하면 더 이상 안 기다리고 바로 ACK을 전송한다.
(=데이터가 없는 상황에 패킷 2개 들어오면 2개당 ACK 하나는 보내자)
* Ack 전송 시 Ack Field를 1로 셋팅하면 상대측에서 Ack을 의미있는 정보로 받아들이고, 0으로 셋팅 시 상대는 쓰여진 Ack번호를 무시한다.
* 만약 그림의 맨 아래 Ack:7001 패킷이 Server에게 도착하기 이전 유실되면, Sever 입장에서는 위의 Seq: 5001-6000 / Ack: 1401패킷과 Seq: 6001-7000 / Ack: 1401패킷 두 개 모두 Client가 못 받았다고 생각.
Lost segment (패킷 유실)
Ack 갯수 줄이다 응급상황이 발생할 시 바로 Ack을 전송한다.
Rule 4
잃어버린 패킷이 존재할 시 바로 Ack 전송
Rule5
못 받은 패킷을 받은 경우 바로 Ack 전송
* RTO timer
- RTO : Retransmission Timeout, 재전송 타임아웃 시간
- 패킷 제대로 받았는지 패킷마다 확인하는 타이머. 패킷마다 넉넉한 시간을 부여하고, 그 시간 안에 패킷에 대한 Ack이 도착하지 않은 경우 패킷이 정상적으로 상대방에게 도착하지 않았다고 간주하고 패킷을 재전송한다.
- RTO설정 또는 계산 = 전송된 한 세그먼트에 대한 확인응답을 기다려야 하는 시간 = TCP 재전송 타이머 값
- 송신 TCP는 매 세그먼트를 전송할 때 마다 재전송 타이머(RTO) 가동함
- RTO는 TCP 연결의 RTT(왕복시간) 보다 약간 크면 이상적임. 즉, 세그먼트 전송부터 확인응답 받기까지의 시간 보다 약간 크면 좋음. 얼마나 커야 하는지 즉, RTT 예측에 대해 여러 계산 방식들이 있음
* Sender가 보낸 데이터가 중간에 유실된 경우에도 Sender는 계속 데이터를 전송한다. → Ack을 못 받더라도 window size가 허락하는 한 데이터를 계속 전송한다.
* Resent: 지정된 시간 안에 전송한 패킷의 Ack이 도착하지 않을 시 상대방이 패킷을 수신하지 못한 것이라 가정하고 해당 패킷을 재전송
Fast retransmission
패킷이 없어진 경우 빠르게 재전송
* Culumative Ack의 장점
- 패킷 두 개당 하나씩 Ack 나가므로 Ack 갯수 절약 가능(Rule3)
- Fast retransmission 같은 기능을 쉽게 구현 가능
- 상대가 보낸 패킷이 도착하지 않는 경우(뒷 번호의 패킷은 들어오는데 앞 번호의 패킷이 들어오지 않은 경우), Receiver에서는 해당 패킷을 받고 싶다는 의미로 상대방에게 받고 싶은 패킷의 Ack을 계속해서 보낸다.
- Sender 측으로 세 개의 중복된 Ack이 들어오면 Sender는 Ack으로 들어오는 해당 패킷이 없어졌을 가능성이 높다고 생각하고 RTO timer가 time out되기 전이라도 패킷 재전송(→ Fast retransmit)
- 뒤에 Receiver가 Ack 701번을 보낸 경우 그 앞의 700번 패킷까지는 다 받았다고 간주
Lost acknowledgment (Ack 유실)
- ACK에 대한 ACK은 존재하지 않는다. 즉, 내가 보낸 ACK을 상대방이 잘 받았는지 확인하는 ACK은 존재하지 않는다.
- 하지만 중간에 Ack이 하나 유실되었다 할지라도 큰일이 나는 것은 아님.
- 뒤에 Receiver가 Ack:901을 전송하고 Sender가 그 Ack을 이상없이 수신했다면, Sender는 Receiver가 이전 900번 패킷까지는 이상없이 수신했다는 뜻으로 해석하기 때문.
Lost acknowledgment corrected by resending a segment (세그먼트 재전송을 통한 Ack 유실 수정)
Rule6
- Receiver가 Sender에게 패킷을 잘 받았다는 Ack을 전송하는 상황에 Ack이 유실되었다.
- 위의 Lost acknowledgment과 다른 점은 다음 Ack이 도착하기 이전 RTO timer가 time out되었다는 것이다.
- RTO timer: 패킷마다 넉넉한 시간을 부여하고, 그 시간 안에 패킷에 대한 Ack이 도착하지 않은 경우 패킷이 정상적으로 상대방에게 전송되지 않았다고 간주하고 패킷을 재전송한다.
- time out에 의해, Sender는 상대방이 패킷을 수신하지 못했다고 간주하고 패킷을 재전송한다. 그림에서는 나타나지 않지만, 뭘 못 받았는지 모르기 때문에 501-600, 601-700번 패킷을 같이 전송한다.
- Receiver는 중복된 패킷이 도착하면 바로 Ack을 전송한다.
알아두기
적절히 처리되지 않은 경우 Lost acknowledgments는 deadlock을 발생시킬 수 있다.
- Receiver가 rwnd=0을 보내 Sender가 데이터 송신을 멈춘 상황.
- Receiving Buffer에 MSS만큼의 공간이 생기거나 1/2만큼 빈 공간이 생길 때 Receiver는 rwnd=k (k: 빈 공간 용량)를 보내 상대방을 깨운다.
- 이때 상대방을 깨우려고 보낸 Ack이 유실된다면, Sender는 Receiver가 자신을 깨우기를 기다리고 Receiver는 Sender가 데이터를 보내주기를 무한정으로 기다리게 되는 deadlock이 발생한다.
해결방안: Persistence Timer 사용
- Receiver가 rwnd=0을 보내 Sender가 데이터 송신을 멈춘 상황. 이 때 persistence timer가 작동한다.
- persistence timer가 time out이 되었는데도 상대방에게서 아무런 반응이 없으면, Sender는 일단 작은 사이즈의 데이터(probe segment)를 상대방에게 보내본다.
- 데이터를 보내면 해당 데이터에 대한 Ack이 도착한다. rwnd가 여전히 0이면 상대방 수신버퍼가 아직 비워지지 않았다는 의미. rwnd = k이면 중간에 Receiver가 보낸 Ack이 유실되었을 가능성이 존재
자료 출처:
- TCP/IP Protocol Suite 4th Edition Slide
(Behrouz A. Forouzan 저, McGraw-Hill, 2010) - 정보통신기술용어해설-RTO (http://www.ktword.co.kr/test/view/view.php?m_temp1=1687)
but TCP guarantees that no out-of-order data are delivered to the process.
'Computer Science > 컴퓨터 네트워크' 카테고리의 다른 글
컴퓨터 네트워크: TCP timers (0) | 2021.11.11 |
---|---|
컴퓨터 네트워크 실습 (0) | 2021.10.16 |
컴퓨터 네트워크: Congestion Control (0) | 2021.10.14 |
컴퓨터 네트워크: Flow Control (0) | 2021.10.05 |
컴퓨터 네트워크: Windows in TCP (0) | 2021.10.01 |
컴퓨터 네트워크: State transition diagram (0) | 2021.10.01 |