본문 바로가기

컴퓨터 사이언스/네트워크

[모바일 컴퓨팅] Transmission Control Protocol (TCP)

TCP Serice Model

- Reliable, in-order, full-duplex byte-stream delivery (가능한 좋은 성능으로)

- 네트워크는 패킷을 드롭할 수도, 지연시킬 수도, out-of-order로 전송할 수도, 동일한 패킷을 오게 할 수도, 오염된 패킷을 보낼 수도

 

TCP는 Reliable Delivery를 지원한다

- Checksum

수신자가 데이터가 오염됐는지 확인할 수 있게 해 준다.

- Suquence numbers

빠진 데이터가 있는지 확인, 데이터를 다시 순서대로 넣기 위해

- Retransmission

오염됐거나 잃어버린 데이터를 송신자가 다시 전송해준다.

round-trip time에 기반에 timeout을 측정한다.

빠른 재전송을 위해 fast retransmit algorithm을 사용한다.

 

 

TCP Header

- Sequence number

ISN(initial sequence number) 32 bits를 랜덤 하게 가져와서 그것부터 시작하게 된다.

다음 seq number는 ISN + size

송신자는 seq number X부터 X + B -1 bytes를 보낸 것 (Packet이 B bytes를 담고 있으면)

- Acknowledgement

ack number는 다음 와야 될 seq number를 가리킨다.

만약 송신자가 N in-order bytes를 보냈으면, S+N이 ack number로 보냄

seq number X 이전의 모든 데이터를 받았다면 ack number는 X + B

X보다 더 작은 값 Y까지만 데이터를 전달받았다면 ack number는 Y + 1

- Header length

4-byte words를 곱해줌. 보통 5

- Reserved는 항상 0

- Advertised window

overflow를 막기 위해, 버퍼가 받을 수 있는 윈도 크기를 전해준다.

 

Flow Control

- 수신자는 송신자에 의해 버퍼가 오버플로우를 막기 위해 window size W를 알려준다.

- 만약 window가 W라면, 송신자는 W/RTT bytes/sec보다 빠르게 데이터를 전송하지 못한다.

- 수신자는 송신자가 전송할 수 있는 속도를 제한한다.

- 만약 송신자가 더 빠르게 보내면 윈도우 사이즈는 점점 작아질 것이다.

 

Initial Sequence Number (ISN)

- 첫 시퀀스 넘버

- IP address와 port number는 연결을 unique 하게 identify 해준다.

하지만, 이와 같은 <IP address, port number>는 다시 사용하게 될 것이고

이전 연결에서 주고받던 패킷이 새로운 연결에 전송되는 일이 발생할 수 있다.

- 때문에, TCP는 ISN이 필요하고, 4 마이크로 초마다 tick 하는 32-bit clock에서 이를 결정해준다.

ISN은 오직 4.55시간에 한 번 겹친다.

- 새 연결을 수립할 때마다 양 쪽 호스트는 ISN을 교환한다.

 

3-way handshake

- SYN 패킷이 유실되었다면?

송신자는 SYN-ACK 패킷을 받지 못할 것이다.

송신자는 타이머를 설정하고 SYN-ACK 패킷을 기다린다.

타이머 안에 SYN-ACK 패킷을 받지 못하면 SYN 패킷을 재전송한다.

송신자는 수신자가 얼마나 멀리 있는지 모르기 때문에 몇 초를 기다릴지 합리적으로 추정하는 것은 매우 어려운 일이다.

RFC 1122 & 2988은 기본값으로 3초를 설정한다. (다른 구현은 6초를 사용한다.)

 

TCP 연결 종료

- end-host들은 각각 독립적으로 종료하여야 한다. (half-close)

- 한쪽 끝이 더 이상 보낼 데이터가 없으면 FIN segemnt를 보낸다.

1. X sends a FIN to Y (active close)

2. Y ACKs the FIN (이 때, Y는 X에게 여전히 데이터를 보낼 수 있다.)

3. Y send a FIN to X (passive close)

4. X ACKs the FIN

 

Arupt Termination

- A에서 동작하는 프로세스가 crashed 되면, A는 B에 RST를 보낸다.

- B는 RST에 ack하지 않는다.

- 그러므로, RST는 reliable하지 않고, 데이터가 유실될 수 있다.

- 하지만, B가 다른 어떤 것을 또 보내면 다른 RST가 보내질 것이다.

 

Sliding Window Flow Control

- 슬라이딩 윈도 프로토콜은 바이트 레벨에서 형성된다.

- 위험성이 있기 때문에 sender buffer 크기는 키울 수는 있지만 줄이지는 않는다.

- 송신자가 수신자에게 ack#과 widnow size를 받으면 ack#, ack#+1,... , ack# + winsize - 1을 보낼 수 있다는 뜻이다.

- 수신자는 ack 데이터 없이 윈도 사이즈를 변경할 수 있다.

 

Retransmission 이유

- 패킷 유실

- ack 유실 (duplicate packet이 가게 됨)

- early timeout (timer가 너무 짧아서 timeout이 일어나 패킷을 보냈지만, ack가 뒤늦게 옴. 이것도 중복 패킷)

 

송신자는 얼마나 기다려야 할까? (timer)

- 너무 짧으면, 재전송이 낭비되고 너무 길면 패킷이 유실되었을 때 재전송까지의 딜레이가 너무 길다

- TCP는 retransmission timeout(RTO)를 RTT에 기반해 설정하게 된다.

- RTO는 RTT + slop(queuing, MAC에 시간이 쓰이기 때문에 알파 값)으로 설정된다.

- RTT를 측정할 때, retransmission은 고려하지 않는다.

 

Karn/Partridge Algorithm

- SampleRTT는 재전송이 아닌 original transmission으로만 측정된다.

- 한 segment가 재전송되었으면, 측정에 더 사용하지 않는다.

- RTO timer가 만료될 때마다 (timeout이 발생) RTO를 기존 RTO의 두배로 설정해준다.

그 후, original transmission이 성공하면, 그 측정값의 RTO로 복구시킨다.

 

RTT Estimation

- exponential averaging

SampleRTT = AckRcvdTime - SendPackTime

EstimatedRTT = α * EstimatedRTT(old RTT) + (1 - α) * SampleRTT(new RTT)

α = 7/8

- Jacobson/Karels Algorithm

 

Fast Retransmission

- 중복된 세 개의 ACKs를 받고 세그먼트를 재전송해준다.

 

Delayed ACK

- 시간을 기다렸다가 받은 여러 개의 패킷에 대해 한 번의 ACK로 처리해준다.