3.5 connection-oriented transport : TCP
Overview
- point-to-point
one sender, one receiver
- reliable, in-order
- pipelined
TCP congestion and flow control
- full duplex data
데이터를 보내면서 동시에 받을 수 있다.
- connection-oriented
handshaking
- flow controlled
받을 사람이 받을 수 있는 정보만
TCP segment structure
- seq #: TCP는 패킷#가 아니라 byte#를 사용한다. 따라서 해당 패킷의 가장 처음 나오는 byte#를 seq#로 사용한다.
- ack #: 다음에 받을 seq# 이고 byte#를 사용한다.
sender가 보낼 때 0, receiver가 보낼 때 1?
- U : uegent data가 있을 경우 1 → Urg data pointer에 저장되어 있는 포인터의 데이터를 바로 app layer로 올린다.
- Urg data pointer : 바로 application layer로 올릴 데이터의 포인터가 저장되어 있다.
- A : ack#가 유효하면 1, 아니면 0으로 ack#를 무시한다.
- P : application layer로 바로 데이터를 보내야하는 경우 1로 표시한다.
- R : reset의 약자로 컨넥션을 재설정한다.
- S : sink의 약자로 컨넥션을 연결한다.
- F : finish의 약자로 컨넥션을 끊는다.
- receiver window(rwnd) : socket의 free buffer space, free buffer가 얼마나 남았는지 알려주고, ack를 보낼 때 같이 보낸다.
TCP seq#, ack#
1byte의 데이터 'C'를 보낼 때 seq#가 42고 ACK를 보낼 때 그 다음에 받을 seq#인 43을 보낸다.
그리고 ack#을 43을 받은 sender은 seq#가 43인 패킷을 보낸다.
RTT(round trip time)
rtt값은 timeout값을 정하기 위해서 사용된다.
timeout값은
- RTT값보다 커야하고
- 너무 짧으면 premature timeout이 발생하고 불필요한 재전송이 많고
- 너무 길면 loss된 segment를 위해 너무 오래 기다린다.
sample RTT : RTT시간을 계산한 것
estimated RTT
estimated RTT를 계속 계산하여 약간의 마진을 더해 timeout interval을 교체한다.
reliable data transfer
TCP는 unreliable한 IP위에 reliable data transfer service를 올린 것
rdt service
- pipelined segment
- cumulative acks
- single retransmission timer
timeout된 seg만 packet만 재전송
TCP sender
application layer로부터 data를 받았을 때
- segment를 만들면서 segment의 첫번째 byte#로 seq#를 정한다.
- timer start
retransmission이 발생하는 이유
- timeout event
ack loss가 발생해서 다시 segment를 보낸다. ⇒ 중복된 seq#이므로 버린다.
ack100은 오지 않고 ack120이 왔으므로 그전 seq#은 다 받았다는 의미 이므로 120을 보내도 된다.
- duplicate acks
3번 이상 중복된 ack를 보냈으므로 timeout이 되기 전에 재전송한다.
TCP fast retransmit
timeout 시간은 상대적으로 길기때문에, 중복된 ack를 통해 lost segment를 detect
TCP ACK generation
- seq#대로 seg가 도착했고 이전 ack가 모두 도착한 상태 → 다른 seg가 올 때까지 500ms기다린다.
- seq#대로 seg가 도착했지만 이전에 받은 seq에 대한 ack를 보내지 않았을 때 → 가장 마지막으로 받은 seq에 대한 ack를 보낸다.
- seq#가 out-order일 때 → 가장 최근에 순서대로 받은 ack을 다시 보냄, out-order seq#은 buffer에 저장한다.
- 부분적, 혹은 모두 gap을 충족할 때 → 가장 최근에 순서대로 받은 ack를 보낸다.
flow control
flow control → receiver가 sender를 control
connection을 맺을 때 socket에 buffer를 할당한다.
ack를 보낼 때 rwnd도 함께 보내서 남은 버퍼의 양을 알려준다.
connection management
sender와 receiver는 데이터를 교환하기 전에 handshake를 한다.
이 과정을 통해 state, seq#, rcvBuffer를 할당한다.
2-way연결을 요청할 때 loss가 발생할 수 있기 때문에 3-way 연결을 사용한다.
3-way handshake
- client에서 S=1,seq=x(OS에서 랜덤하게 생성)
- server는 S=1,ACK=1,seq=y(OS에서 랜덤하게 생성)
- client는 ACK=1를 보낸다.
SYN → SYN+ACK → ACK
closing a connection
- client에서 F=1
- server에서 ACK=1
- server에서 F=1
- client에서 ACK=1
- 4에서 loss가 생길 수 있으니 seg의 lifetime의 *2만큼 timer
2와 3은 1개로 합쳐질 수 있다.
3.6 principles of congestion control
congestion control이란?
network가 소화할 수 있도록 data를 덜 보내고 speed를 줄이게 하는 것
flow control과의 차이점 : receiver(flow) ↔ network(congestion)
manifestations
- lost packet : error이 발생해서 drop될 수도 있지만 packet buffer가 꽉차서 그럴 때가 더 많다.
- long delays : router buffer에서 queueing delay가 발생한다.
scenario 1
one router, infinite buffers, output link capacity : R
병목 현상으로 R/2이상이 되면 일정한 output을 가지고 delay가 기하급수적으로 늘어난다.
scenario 2
one router, finite buffers ⇒ packet loss 발생
router buffer가 꽉 차서 packet이 drop됐을 때
time out이 되어 retransmission을 했을 때
scenario 3
loss로 인해 아무것도 전송되지 않는다.
⇒ 이런 일을 막기위해 congestion control이 필요하다.
3.7 TCP congestion control
TCP congestion control
- additive increase : loss가 발견되기 전까지 cwnd를 늘려나간다.
- multiplicative decrease : loss가 발견되면 cwnd를 반으로 줄인다.
sender
limit transmission : last byte sent - last byte acked ≤ cwnd ⇒ 보낼 량을 cwnd보다 작거나 같게 설정
TCP sending rate : cwnd/RTT bytes/sec
TCP slow start
connection이 처음 시작할 때 loss가 발생하지 전까지 sending rate를 지수적으로 증가시킨다.
TCP detecting, reacting to loss
ssthresh : slow start를 끝낼 마지노선
파란선 → cwnd
- by timeout
ssthresh를 cwnd/2로 조정
cwnd를 1로 조정
ssthresh까지 slow start
- by 3 duplication ACKs
cwnd를 cwnd/2로 조정
=> timeout이 발생한 경우 congestion이 더 심각하므로 극단적인 조정
TCP throughput
TCP throughput는 window size와 RTT에 따라 달라진다.
window size (W) = min(swnd, cwnd, rwnd)
avg TCP throughput =3/4 W/RTT bytes/sec
TCP throughtput = 1.22 MSS/RTT* root(L)
TCP Fairness
각 connection이 보내는 throughput의 합이 R보다 커지면 둘다 cwnd값이 1/2로 줄고 큰 값을 가진 connection은 크게 줄고 작은 값은 가진 connection은 작게 줄어들기 때문에, 결국 같은 양을 보내게 된다.
Explicit congestion notification(ECN)
router에서 congestion이 발생할 것 같다고 ECN을 11로 설정하여 전송한다.
des에서 ECE를 1로 설정하여 ACK seg를 보낼 때 congestion이 발생했다고 source에 직접적으로 알려주는 system