TCP運作機制

TCP連線管理

Three-way handshake
TCP建立連結用的方式
為非同步機制,因為序號未與網路的整體時脈同步
連結步驟:
 1,a要求連線送syn
 2,b收到後回ack及syn
 3,a在回ack 連線成功
ps:
若送出syn到對方特定port,但對方主機是回覆rst,表示主機的這個port不是listen狀態
若送出syn到對方特定port,但完全沒有回應,可能是被防火牆擋住


Four-way handshake
TCP釋放連結步驟
 1.a送出fin
 2.b收到後回ack
 3.b在回fin
 4.a收到後回ack


Client通常會經歷的狀態
SYN_SENT: client送出syn之後的狀態
ESTABLISHED: client收到syn ack並送出ack後的狀態
FIN_WAIT1: client在ESTABLISHED時,送出fin之後的狀態, 此狀態在等待server回覆ack
FIN_WAIT2: client在FIN_WAIT1時,收到ack後的狀態, 此狀態在等待server回覆fin
TIME_WAIT: client在FIN_WAIT2時,收到fin並送出ack的狀態,在等待30秒後會變成CLOSED狀態

Server通常會經歷的狀態
Listen: server建立socket後的狀態
SYN_RCVD: server收到syn,並送出syn ack後的狀態
ESTABLISHED: Sserver收到ack後的狀態
CLOSE_WAIT: server在ESTABLISHED時,收到fin並送出ack後的狀態
LAST_ACK: server在CLOSE_WAIT時,送出fin後的狀態, 此狀態在等待ack後就會變成CLOSED狀態

TCP送資料過程
設window size為3,傳送端送3個封包,分別為序號0,1,2到接收端
若接收端收到3個封包則:
 1接收端傳回ack訊號表示己接收,ack訊號會指定傳送端下一個傳送來的序號為3
 2傳送端收到ack後,傳送序號3,4,5的封包給接收端
若接收端未收到則:
 1接收端無回應
 2傳送端未收到ack則逾時,重送序號0,1,2的封包給接收端

傳送端  接收端 
傳送前先建立three-way handshakeflag=syn
seq=17700000 ,ack=0 ,len=0
 
 flag=syn,ack
seq=82900000 ,ack=17700001 ,len=0  
flag=ack
seq=17700001 ,ack=82900001 ,len=0
ps:
結束three-way handshake後,開始送資料  
 
seq=17700001 ,ack=82900001 ,len=72byte 
 seq=82900001 ,ack=17700073 ,len=60
ps:ack=上一筆傳送端seq+傳送端len 
seq=17700073 ,ack=82900061 ,len=50byte
ps:seq=上一筆傳送端ack
 

ps:
此機制也稱為piggybacking(搭順風車)
回應是藉反向流量送回傳送端,可減輕交通量 

………………………………………………………………………………….

控制資料傳輸

Sliding window
TCP控制資料傳輸用的機制
window size(sliding windows的大小)在連線期間會不斷改變,越大表示一次送出的資料越多
window size=min(cwnd,rwnd) ,資料傳送時不會超過,擁塞控制用的cwnd和流量控制用的rwnd
ps:
一般情況下cwnd會小於rwnd,所以通常cwnd=windows size

流量控制
目的:避免傳送太多資料給接收端,造成接收端緩衝區資料溢位
在TCP中,由接收端做流量控制

rwnd(receive window,接收窗格):
接收端可用的空間
接收端在回覆傳送端時,會將rwnd放入tcp header內的receive windows欄位,以告知傳送端可傳送的上限


擁塞控制
目的:避免網路擁塞時還繼續傳送資料
在TCP中,由傳送端做擁塞控制
ps:
以下使用TCP Reno版本為主

ps:
擁塞原因
1電腦產生的資料量比網路能夠傳輸的資料量大
2多電腦同時傳送資料到相同目的地時,目的地可能發生擁塞

AIMD(additive-increase,multiplicative-decrease,累進遞增,倍數削減)
TCP擁塞控制的原則
cwnd會根據此原則調整

cwnd(congestion windows,擁塞窗格)
傳送端用來控制擁塞的變數
由三大狀態決定變數值

三大狀態
slow-start(緩啟動):rwnd一開始為1MSS,每經過一次RTT就以指數方式增加一次, 例如,1,2,4,8,..成長,
congestion avoid(擁塞迴避):每經過一次RTT就以線性方式增加一次,例如9,10,11,..成長
fast recovery(快速復原):收到多少重覆ack,cwnd就加多少

狀態間轉移
傳送端發現cwnd超過ssthresh後
 進入congestion avoid狀態
傳送端若發現timeout,
 ssthresh會設為last rwnd*0.5,
 cwnd會設為1MSS,
 進入slow-start狀態
傳送端若發現Duplicated Ack(重覆3次ack),
 ssthresh會設為last rwnd*0.5,
 cwnd會設為last rwnd*0.5+3MSS,
 進入fast recovery狀態
ps:
ssthresh(slow start threshold,緩啟動門檻):啟始64kb
ps:
TCP Tahoe版,不論是timeout或重覆3次ack,rwnd都會設為1
fast recovery是在TCP reno版加入

ps:
假設 1MSS=4kbit (500byte) ; RTT=0.2sec (200ms)
則每秒約20kbps

ps:
擁塞控制三大議題
限速:How does a TCP sender reduces its send rate
擁塞判斷:How does a TCP sender perceive that there is congestion
動態調整速率:What algorithm should the sender use to change its send rate as a function of perceived end-to-end congestion

……………………………………………………………………………………………

錯誤回復機制

TCP也稱selective acknowledgement(選擇性確認)機制
使用GBN和SR協定的混合


常見的pipelining(管線化)錯誤回復方法
GBN(go back n):重送接收端未收到與己收到的所有segment
SR(select repeat,選擇性重複):只重送接收端未收到的segment
refer
https://blog.json.tw/introduction-to-computer-network-gbn-sr-tcp-compare

Go-back N
傳送端連續送N個frame給接收端
若成功則繼續送,若接收端發生失敗則要求傳送端重傳全部frame
優點:比stop-and-wait快

Select Repeat  
傳送端連續傳多個frame給接收端,
若成功則繼續送,若接收端發生失敗則要求傳送端重傳有錯誤的frame
優點:比stop-and-wait快
缺點:兩端須大量buffer儲存傳送後和未傳送資料

ps:
stop-and-wait
傳送端每送出1個frame後,須等待接收端是否有成功接收
若成功則繼續送,若接收端發生失敗則要求傳送端重傳該frame
缺點:傳送端與接收端等待時間較長
優點:處理簡單,不需要大量buffers
應用:適合半雙工,傳播延遲時間較小等近距離通訊

… 

4種常見錯誤情況
1.ack逾時
傳送端送出segment後
在timeout interval未收到對方ack
動作:傳送端在送一次相同segment
2.收到不同時間回來的ack
傳送端送出segment後,收到以下2種ack
在第2次timeout interval內,收到第一次送出segment所回覆的ack,
和第2次timeout interval後,收到第二次重送segment所收到的ack,(因第一次逾時會重送)
動作:傳送端在第2次timeout interval內收到ack,就不會處理之後的ack
3.只收到最後一個ack
傳送端送出2個segment
在timeout interval內只收到最後一個segment回覆的ack
動作: cumulative acknowledgement機制
4,收到duplicate ack 
傳送端發出segment, seq1~5
接收端只有seq2沒收到,偵測到縫隙,接收端回覆duplicate ack
動作: 使用fast retransmit機制


cumulative acknowledgement(累積式確認)
接收端只會記錄連續接收情況的最後一個ack;接收端一次回覆最多只能確認串流中第一個遺失的位元組
ex:
傳送端送出seq20(2byte),seq22(2byte)的segment,
若接收端只收到seq20,
 記錄ack22,並傳回ack22
若接收端收到seq22,
 記錄ack24,傳回ack24
 過一陣子又收到seq20,小於記錄ack24,傳回ack24 
此機制可避免傳送端將之前的segment重送: 
 接收端收到多個segment時會回覆多個ack
 傳送端在timeout interval收到多個ack中, 最大的ack編號代表此編號之前的segment都己到接收端

duplicate ack(重覆ack)
接收端偵測到縫隙時,會發出3次一樣的ack
ack會要求重送未到達的segment

fast retransmit(快速重送)
傳送端收到duplicate ack的回應動作
此動作會在區段的timeout前立刻重送duplicate ack要求的segment

發生timeout
重送擁有最小序號的未經確認區段
將timeoutinterval設為2倍長
ps:
若之後收到ack, timeoutinterval還原預設值

…………………………………………………………………………………

TCP計時器

retransmission timer(重傳計時器):大部份TCP實做,用來確認對方接收無誤,若超過TimeoutInterval,會重設計時器並重送segment
persistence timer(持續計時器):計時結束會送探測封包給接收端取視窗大小,回等待訊息則加倍計時,直到視窗重開,計算ack用
kepalive timer(保持活著計時器):一段時間閒置結束後檢查另一端是否還活動,每75秒一次,共10次,無回應則斷線
2MSL/timewait timer(時間等待計時器):關閉連結時的time wait狀態,丟棄重複之FIN segment.時間約為封包存活期兩倍

ps:
RTT(Round Trip Time):封包從來源端送達目的端,再由目的端回應回來的這段延遲時間

TimeoutInterval(重送逾時間隔)
公式: timeoutinterval=estimatedRTT+4*devRTT
timeoutinterval初始值建議設為1
當有新的estimatedRTT產生時,timeoutinterval要在重算一次

estimatedRTT
取得新的sampleRTT後會更新
使用EWMA(exponential weighted moving average,指數加權移動平均)
公式:estimatedRTT=(1-a)*estimatedRTT+(a)*sampleRTT, 而a的建議值為0.125
ps:
sampleRTT的變動會被estimatedRTT平滑化

sampleRTT
TCP在所有送出但未經確認的segment中,抽樣其中一個segment的RTT
ps:不包含重送的segment

devRTT
估計sampleRTT和estimatedRTT偏差多少
公式:devRTT=(1-b)*devRTT+b*|sampleRTT-estimatedRTT| ,而b的建議值為0.25