[TCP/IP]TCP連接的建立和終止


 

TCP 是支持全雙工通信的傳輸層協議,為了開發出更好的網絡通信應用,清楚了解其中的交互過程是非常必要的。

 

下面用比較直白的話來描述&理解一下這個過程:

 

TCP 連接建立:三次握手

 

服務器依次調用 socket,bind,linsten 綁定到指定本機地址,accept 阻塞等待連接。

 

1. 客戶端調用 socket 指定本地/網絡地址,connect 主動建立連接,向服務器發送 SYN 同步請求,並標記該連接通道傳送數據的初始序號為 J 。

2. 服務器收到 SYN 請求后,響應 ACK(acknowledgement)確認收到,並標記序號為 J + 1 ;

    同時服務器也向客戶端發送一個 SYN 同步請求,並標記該連接通道傳送數據的初始序號為 K 。

3. 客戶端收到 SYN 請求后,對服務器響應 ACK 確認收到,並標記序號為 K + 1 。

 

在完成上面三步之后,TCP連接完成,客戶與服務器之間可以互發數據了。

 

TCP 連接終止:四次揮手

 

客戶或服務器都可以主動發起 close 動作。

 

1. 客戶調用 close 主動關閉連接,此時向服務器發送 FIN(finish)請求,標記連接的數據序號為 M 。

2. 服務器收到客戶結束請求后,響應 ACK 確認,並標記連接數據序號為 M + 1 。

3. 服務器被動關閉,向客戶發送 FIN 請求,標記連接的數據序號為 N 。

4. 客戶收到服務器的 FIN 請求后,響應 ACK 確認,並標記連接的數據序號為 N + 1 。

 

完成上面四步,TCP連接終止。

 

TCP連接的分組交換

 

 

TCP 的 SO_KEEPALIVE 套接字選項

這是一個檢測連接存活的選項,設置了 keep-alive 選項后,如果 2小時內在該套接字的任一方向上都沒有數據交換,

TCP 就自動給對端發送一個保持存活探測分節(keep-alive probe),這是一個對端必須響應的 TCP 分節。

如果沒有對 TCP 探測分節的響應,套接字待處理錯誤被置為 TIMEOUT,套接字關閉。

 

HTTP 的 keep-alive 屬性

HTTP 是基於 TCP 之上的無狀態的請求-響應式短連接,每一個請求就是一個 TCP 連接,頻繁的三次握手和四次揮手會浪費傳輸之外的大量時間。

為了提高連接和應用效率,服務端設置 keep-alive 后客戶端在發起一次請求后,服務器端不會馬上關閉這個 TCP 連接,而是在一段時間內等待,有數據傳輸就復用這個連接。

@todo 用 tcpdump 分析連接的過程。 

 

參考文獻:

Unix網絡編程1 > 傳輸層:TCP、UDP、SCTP > TCP連接的建立和終止

Unix網絡編程1 > 套接字選項 > 通用套接字選項

 

Link:http://www.cnblogs.com/farwish/p/7482038.html

@farwish <www.farwish.com>


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com