본문 바로가기

카테고리 없음

TCP 신뢰성 보장

728x90

IEEE 의 TCP 문서인 RFC 793 (https://tools.ietf.org/html/rfc793)에서는 다음과 같이 TCP를 정의한다.

(The Transmission Control Protocol (TCP) is intended for use as a highly reliable host-to-host protocol between hosts in packet-switched computer communication networks, and in interconnected systems of such networks.)

즉, 신뢰성 있는 통신을 보장한다.

 

TCP segment는 네트워크를 통과하면서 여러가지 이유로 정상적으로 전달 되지 않을수 있다.[queue가 꽉차서 drop이 됨(Loss), 전송중 바이트가 손상됨 (Corrupted]

 

이러한 것들을 어떻게 감지해서 TCP 는 신뢰성있는 통신을 보장하는 것일까?

 

1. 잘 받았으면 ACK, 못 받았으면 NAK

 

TCP는 오류가 나거나, timeout이 발생할 경우 TCP segment를 재전송하게 된다. 이를 위해 수신자는 TCP segment를 제대로 수신하면 ACK(Positive ACKnowledge), 제대로 수신 못했으면 NACK(Negative ACKnowlegdge)를 보낸다.

실제 TCP에서는 TCP Header의  ACK라는 flag와 ACK Number라는 field 있으며, 이를 이용하여 receiver는 수신자에게 자신이 정상적으로 데이터를 수신했는지 알려줄 수 있다.

 

2. 그렇다면 TCP 는 해당 Packet이 corrupted됐는지 어떻게 알수 있을까?

 

위의 TCP Header에는 Checksum 이라는 필드가 있다. 이 필드에는 TCP 헤더를 16 bit로 짤라서 이 16비트들의 1의 보수의 합을 저장된다. 수신자는 이 Checksum 필드를 이용하여 세그먼트가 손상되었는지 판단할수 있다. 손상 된 경우, 수신자는 ACK Flag을 0으로 reset해서 보내며, 정상적으로 수신 됐을경우, ACK FLAG을 1로 설정하고 해당 세그먼트의 sequence number +1 한 값을 ACK number에 저장해서 전송한다. (이는 TCP 세그먼트의 순서를 보장하기 위함이다.)

 

3. 만약 수신자가 송신자에게 ACK, NAK도 못 보낼 상황이라면?

수신자가 아예 데이터를 수신받지 못하거나, 송신자가 수신자에게 보낸 ACK, NACK가 못갔다고 생각해보자. 이 경우, 송신자는 ACK도 NACK도 받을 수 없다. 이를 위해 송신자는 타이머를 가지고 있으며,  TCP 세그먼트를 보낼때 이 타이머를 작동시키며, 타임아웃이 날 경우 해당 세그먼트를 다시 보내준다. 타이머의 시간이 너무 길면 타이머로 인한 퍼포먼스 하락이 올거고, 너무 짧으면 세그먼트가 중복되서 전송되는 경우가 많아질 것이다.(Kan's algorithm이 있는데 대부분 RFC2988 (Computing TCP's Retransmission Timer)가 사용된다고 한다.)

 

4. 순서가 뒤바뀐 TCP Segment는 어떻게 처리하지?

TCP에서는 TCP Segement가 도착하는 순서가 보장해야한다.( A stream of data sent on a TCP connection is delivered reliably and in order at the destination.) 이를 위해 Sequence Number 필드가 사용된다. 수신자에서는 수신한 세그먼트를 바로 커널로 전달하지 않고, 버퍼에 가지고 있다가 Sequecne Numer 필드를 사용해서 세그먼트가 순서가 맞을때까지 기다린다. 이 순서가 맞춰진 세그먼트 data chunk를 결합시킨 후 커널에 전달한다.

 

다음 포스트에서는 TCP에서 신뢰성을 보장하기 위한 실제 프로토콜인 STOP and Wait Go-BACK N 과 Selective repeat에 대한 내용을 포스트하겠다.

 

 

출처 : https://tools.ietf.org/html/rfc793#page-iii

https://steemit.com/tcpipacknak/@znxkznxk1030/tcp

https://mayple.tistory.com/entry/TCPIP-TCP-%EC%8B%A0%EB%A2%B0%EC%84%B1%EC%9E%88%EB%8A%94-%EC%A0%84%EC%86%A1-%EC%84%9C%EB%B9%84%EC%8A%A4