建立tcp需要三次握手才能建立,而斷開連線則需要四次握手。整個過程如下圖所示:
【注】:
syn: 表示建立連線
fin: 表示關閉連線
ack: 表示響應
psh: 表示有 data資料傳輸
rst: 表示連線重置。
先來看看如何建立連線的。
首先client端傳送連線請求報文,server段接受連線後回覆ack報文,並為這次連線分配資源。client端接收到ack報文後也向server段發生ack報文,並分配資源,這樣tcp連線就建立了。
那如何斷開連線呢?簡單的過程如下:
【注意】中斷連線端可以是client端,也可以是server端。
假設client端發起中斷連線請求,也就是傳送fin報文。server端接到fin報文後,意思是說"我client端沒有資料要發給你了",但是如果你還有資料沒有傳送完成,則不必急著關閉socket,可以繼續傳送資料。所以你先傳送ack,"告訴client端,你的請求我收到了,但是我還沒準備好,請繼續你等我的訊息"。這個時候client端就進入fin_wait狀態,繼續等待server端的fin報文。當server端確定資料已傳送完成,則向client端傳送fin報文,"告訴client端,好了,我這邊資料發完了,準備好關閉連線了"。client端收到fin報文後,"就知道可以關閉連線了,但是他還是不相信網路,怕server端不知道要關閉,所以傳送ack後進入time_wait狀態,如果server端沒有收到ack則可以重傳。「,server端收到ack後,"就知道可以斷開連線了"。client端等待了2msl後依然沒有收到回覆,則證明server端已正常關閉,那好,我client端也可以關閉連線了。ok,tcp連線就這樣關閉了!
整個過程client端所經歷的狀態如下:
而server端所經歷的過程如下:
【注意】在time_wait狀態中,如果tcp client端最後一次傳送的ack丟失了,它將重新傳送。time_wait狀態中所需要的時間是依賴於實現方法的。典型的值為30秒、1分鐘和2分鐘。等待之後連線正式關閉,並且所有的資源(包括埠號)都被釋放。
【問題1】為什麼連線的時候是三次握手,關閉的時候卻是四次握手?
答:因為當server端收到client端的syn連線請求報文後,可以直接傳送syn+ack報文。其中ack報文是用來應答的,syn報文是用來同步的。但是關閉連線時,當server端收到fin報文時,很可能並不會立即關閉socket,所以只能先回覆乙個ack報文,告訴client端,"你發的fin報文我收到了"。只有等到我server端所有的報文都傳送完了,我才能傳送fin報文,因此不能一起傳送。故需要四步握手。
【問題2】為什麼time_wait狀態需要經過2msl(最大報文段生存時間)才能返回到close狀態?
答:雖然按道理,四個報文都傳送完畢,我們可以直接進入close狀態了,但是我們必須假象網路是不可靠的,有可以最後乙個ack丟失。所以time_wait狀態就是用來重發可能丟失的ack報文。
TCP三次握手和四次揮
一 tcp報文格式 在了解三次握手和四次揮手之前,首先要知道tcp報文內部包含了哪些東西。報文主要段的含義 序號 seq 用來標記資料段的順序,確保tcp傳輸有序。ack 確認 確認序號標誌,ack 1表示確認號字段有效,ack 0表示確認序號無效。syn 同步 連線請求序號標誌,用於建立連線。sy...
三次握手和四次揮手 TCP三次握手和四次揮手的理解
相比較於udp傳輸協議,tcp傳輸協議被認為是安全可靠的,這是由於tcp協議的三次握手和四次揮手保證了資料傳輸的安全性。tcp報文格式簡介 要了解tcp協議的三次握手和四次揮手,需要先了解在tcp協議中請求和響應的資料報報文格式。在報文中有幾個值得注意的字段 1 序號 seq序號,佔32位,用來標識...
HTTP協議簡介及TCP三次握手和四次揮手
一 tcp ip協議介紹 tcp ip協議是分層的,從底層至應用層分別為 物理層,鏈路層,網路層,傳輸層和應用層 從應用層至物理層,資料是一層層封裝,封裝的方式一般都是在原有的資料的前面加乙個資料控制頭,資料封裝格式如下 其中,對於tcp傳輸協議,客戶端在與伺服器建立連線前需要經過三次握手,過程如下...