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로 처리해준다.
'컴퓨터 사이언스 > 네트워크' 카테고리의 다른 글
[모바일 컴퓨팅] DNS (Domain Name System) (0) | 2021.06.07 |
---|---|
[모바일 컴퓨팅] DHCP (Dynamic Host Configuration Protocol) (0) | 2021.06.07 |
[모바일 컴퓨팅] User Datagram Protocol (UDP) (0) | 2021.04.21 |
[모바일 컴퓨팅] ICMP (Internet Control Message Protocol) (0) | 2021.04.20 |
[모바일 컴퓨팅] IP (Internet Protocol) (0) | 2021.04.19 |