1. 程式人生 > >TCP協議筆記

TCP協議筆記

使用 沒有 listen 網絡 關閉連接 style 設置 開始 關系

1 TCP 三次握手、四次揮手

1.1 三次握手

client:  CLOSE->SYN_SEND->ESTABLISHED

server:  LISTEN->SYN_RECV->ESTABLISHED

客戶端發送連接請求,發送SYNC,狀態變為SYN_SEND;如果服務器端接收到SYN報文,狀態變為SYN_RECV,同時服務器端發送ACK+SYN報文;如果客戶端收到ACK+SYN報文,則繼續發送ACK確認報文,此時客戶端變為ESTABLISHED狀態;如果服務器端收到ACK報文,服務器端也變為ESTABLISHED狀態。

1.2 四次揮手

client:  FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT

server:  CLOSE_WAIT->LAST_ACK->CLOSED

客戶端關閉連接,發送FIN報文給服務器,狀態變為FIN_WAIT_1,此時客戶端停止發送數據,但仍能接收服務器端發送過來的數據;服務器端收到FIN,停止發送數據,回復客戶端ACK報文,此時狀態改為CLOSE_WAIT狀態; 服務器端關閉連接,發送FIN報文給客戶端,此時狀態變為LAST_ACK;如果客戶端收到服務器端的FIN報文,則客戶端發送ACK確認報文,並且進入TIME_WAIT狀態;如果服務器收到客戶端的ACK報文,則進入CLOSED狀態; 在TIME_WAIT期間,如果客戶端沒有再收到服務端的FIN報文(也即ACK報文沒有丟失),則客戶端也進入CLOSED狀態。

2 擁塞控制

2.1 慢開始,擁塞控制

擁塞窗口、ssthresh關系

技術分享

cwnd<ssthresh時,使用慢開始算法(指數增長)。

cwnd>ssthresh時,改用擁塞避免算法(線性增長)

cwnd=ssthresh時,慢開始與擁塞避免算法任意;

本來遇到網絡擁塞時,也即網絡丟包;ssthresh設置為網絡擁塞時cwnd值的一半,cwnd此時 重新為1開始發送;周而復始。

2.2 快重傳,快恢復

快重傳配合使用的還有快恢復算法,有以下兩個要點:

①當發送方連續收到三個重復確認時,就執行“乘法減小”算法,把ssthresh門限減半。但是接下去並不執行慢開始算法。

②考慮到如果網絡出現擁塞的話就不會收到好幾個重復的確認,所以發送方現在認為網絡可能沒有出現擁塞。所以此時不執行慢開始算法,而是將cwnd設置為ssthresh的大小,然後執行擁塞避免算法。如下圖:

技術分享

TCP協議筆記