1. 程式人生 > >TCP連線的建立和關閉

TCP連線的建立和關閉

TCP通過三次握手建立連線,通過四次揮手揮手關閉連線

1、三次握手

                                          

第一個TCP報文段包含SYN標誌,因此它是一個同步報文段,即ernest -lapyop(客戶端)向Kongming20(伺服器)發起連線請求,同時,該同步報文段包含一個ISN值為535734930的序號。第2個TCP傳送一個同步報文段,同樣包含一個ISN值為2159701207的序號,並且給第一個報文段回覆確認,確認號為上個報文發的序號值加1,即535734931。上一篇部落格說過,序號值是用來標識TCP資料流中的每一個位元組的,但是同步報文比較特殊,即使它並沒有攜帶任何應用程式資料,,它也要佔用一個序號值。第3個TCP報文段是ernest -laptop對第二個同步報文段的確認,至此,TCP報文段連線就建立起來了,這三個步驟就是TCP建立連線的三次握手。通俗的說,ernest -laptop給Kongming20傳送了一個報文說我要建立連線,然後Kongming20收到後也給ernest -laptop傳送了一個報文說可以,並且給ernest -laptop確認回覆收到訊息了,然後ernest -laptop也給它確認回覆收到。

從第3個TCP報文段開始,tcpdump輸出的序號值和確認值都是相對初始ISN值得偏移,我們可以通過tcpdump -S來選擇列印序號得絕對值

2、四次握手            

                                              

                                            

第4個TCP傳送報文段包含FIN標誌,因此它是一個結束報文段,即ernesr -laptop要求關閉連線,結束報文段和同步報文段一樣,也要佔用一個序號值,Konming20用TCP報文段5傳送確認報文段,確認結束,然後Kongming20也傳送自己得結束報文段,緊接著ernest -laptop傳送報文段7回覆確認。

其實四次揮手也可是三次,但是三次得條件是,恰好客戶端和伺服器端同時想要關閉連線得時候,客戶端傳送結束報文,伺服器端將自己的結束報文和確認號同時傳送給客戶端,然後客戶端給伺服器端回覆最後一次確認

3、半關閉狀態:TCP連線時全雙工的,所以允許兩個方y的資料傳輸被獨立關閉。也就是說,通訊的一端可以傳送結束報文段給對方,告訴它本端已經完成了資料的傳送,但允許繼續接收來自對方的資料,直到對方也傳送結束報文段以關閉連線

                                                          

注:上圖中,伺服器端和客戶端判斷對方是否關閉連線的方法時:read系統呼叫返回0(收到結束報文段)

socket網路程式設計介面通過shutdown函式提供了對半關閉的支援