三次握手
位碼即tcp標志位,
SYN(synchronous建立聯(lián)機)
ACK(acknowledgement 確認)
Sequence number(順序號碼)
FIN(finish結(jié)束)
RST(reset重置)
URG(urgent緊急)
Acknowledge number(確認號碼)
第一次握手:主機A發(fā)送位碼為syn=1,隨機產(chǎn)生seq number=1234567的數(shù)據(jù)包到服務器,主機B由SYN=1知道,A要求建立聯(lián)機;
第二次握手:主機B收到請求后要確認聯(lián)機信息,向A發(fā)送ack number=(主機A的seq+1),syn=1,ack=1,隨機產(chǎn)生seq=7654321的包;
第三次握手:客服端收到服務端的報文,并將seq設為x+1,ack設為y+1,ACK設為1再發(fā)送給服務端,發(fā)送完之后兩端都進入ESTABLISHED狀態(tài),完成三次握手,之后就可以進行數(shù)據(jù)傳輸。
為什么需要三次握手建立連接?
至少三次是為了保住連接的可靠。雙方需要經(jīng)過三次握手確認信息達到estarblished狀態(tài)。少一次達不到,多一次顯得冗余。
四次揮手
第一次揮手:客戶端向服務端發(fā)送FIN報文,設置seq為u,發(fā)送完之后客戶端進入FIN_WAIT_1狀態(tài),表示客戶端沒有數(shù)據(jù)發(fā)送給服務端了。
第二次揮手:服務端收到了客戶端的FIN報文段,并回復一個ACK報文。
第三次揮手:服務端向客戶端發(fā)送FIN報文,請求關(guān)閉連接,并設置seq為w,ack為u+1,發(fā)送完之后服務端進入LAST_ACK狀態(tài)。
第四次揮手:客戶端收到服務端的FIN報文之后,回復一個ACK報文,seq設為u+1,ack設為w+1,之后客戶端進入TIME_WAIT狀態(tài),服務端收到之后就會關(guān)閉連接,此時客戶端等待2MSL(最大報文生存時間)后依然沒有收到回復,則說明服務器正常關(guān)閉,客戶端也就隨之關(guān)閉。
** 為什么需要四次握手斷開連接? **
斷開連接時,分為兩個階段。一次是客戶端通知服務器,告知自己不會再發(fā)送數(shù)據(jù)。注意,此時服務器仍可以發(fā)數(shù)據(jù)給客戶端。第二次是服務器告知客戶端自己不會再發(fā)送數(shù)據(jù)。
要弄清楚的是,斷開時,任意一方都可以主動斷開,表明自己不再發(fā)送數(shù)據(jù),但仍可接收數(shù)據(jù)。所以中間的 FIN 和 ACK 不能合并。另外每次斷開連接需要 FIN 請求 + ACK,所以斷開需要四次。
TIME_WAIT 等待 2MSL 的意義?
確保連接可靠關(guān)閉,防止最后一個 ACK 的丟失。
避免套接字混淆(同一個端口對應多個 socket)
注:主要目的是,對客戶端回發(fā) ACK 丟失的情況做處理,可以在服務端再次發(fā)送 FIN 時回發(fā) ACK。
我們發(fā)現(xiàn)上面的 流程2和 流程3都是由服務端發(fā)起的,那么有沒有可能合并這兩個請求,一次發(fā)送給客戶端?答案是 可以。在 RFC 2581中的 4.2 節(jié)有提到, ack可以延遲確認,只要求保證在 500ms之內(nèi)保證確認包到達即可。在這樣的標準下, TCP確認是有可能進行合并延遲確認的 所以通常的 4次揮手,經(jīng)過合并后變成了 3次揮手。