三次握手
位碼即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ù)包到服務(wù)器,主機B由SYN=1知道阅茶,A要求建立聯(lián)機匠襟;
第二次握手:主機B收到請求后要確認聯(lián)機信息肮柜,向A發(fā)送ack number=(主機A的seq+1),syn=1脊阴,ack=1,隨機產(chǎn)生seq=7654321的包蚯瞧;
第三次握手:客服端收到服務(wù)端的報文嘿期,并將seq設(shè)為x+1,ack設(shè)為y+1埋合,ACK設(shè)為1再發(fā)送給服務(wù)端备徐,發(fā)送完之后兩端都進入ESTABLISHED狀態(tài),完成三次握手甚颂,之后就可以進行數(shù)據(jù)傳輸蜜猾。
為什么需要三次握手建立連接秀菱?
至少三次是為了保住連接的可靠。雙方需要經(jīng)過三次握手確認信息達到estarblished狀態(tài)蹭睡。少一次達不到衍菱,多一次顯得冗余。
四次揮手
第一次揮手:客戶端向服務(wù)端發(fā)送FIN報文肩豁,設(shè)置seq為u脊串,發(fā)送完之后客戶端進入FIN_WAIT_1狀態(tài),表示客戶端沒有數(shù)據(jù)發(fā)送給服務(wù)端了清钥。
第二次揮手:服務(wù)端收到了客戶端的FIN報文段琼锋,并回復(fù)一個ACK報文。
第三次揮手:服務(wù)端向客戶端發(fā)送FIN報文循捺,請求關(guān)閉連接斩例,并設(shè)置seq為w,ack為u+1从橘,發(fā)送完之后服務(wù)端進入LAST_ACK狀態(tài)念赶。
第四次揮手:客戶端收到服務(wù)端的FIN報文之后,回復(fù)一個ACK報文恰力,seq設(shè)為u+1,ack設(shè)為w+1叉谜,之后客戶端進入TIME_WAIT狀態(tài),服務(wù)端收到之后就會關(guān)閉連接踩萎,此時客戶端等待2MSL(最大報文生存時間)后依然沒有收到回復(fù)停局,則說明服務(wù)器正常關(guān)閉,客戶端也就隨之關(guān)閉香府。
** 為什么需要四次握手斷開連接董栽? **
斷開連接時,分為兩個階段企孩。一次是客戶端通知服務(wù)器锭碳,告知自己不會再發(fā)送數(shù)據(jù)。注意勿璃,此時服務(wù)器仍可以發(fā)數(shù)據(jù)給客戶端擒抛。第二次是服務(wù)器告知客戶端自己不會再發(fā)送數(shù)據(jù)。
要弄清楚的是补疑,斷開時歧沪,任意一方都可以主動斷開,表明自己不再發(fā)送數(shù)據(jù)莲组,但仍可接收數(shù)據(jù)诊胞。所以中間的 FIN 和 ACK 不能合并。另外每次斷開連接需要 FIN 請求 + ACK胁编,所以斷開需要四次厢钧。
TIME_WAIT 等待 2MSL 的意義鳞尔?
確保連接可靠關(guān)閉,防止最后一個 ACK 的丟失早直。
避免套接字混淆(同一個端口對應(yīng)多個 socket)
注:主要目的是寥假,對客戶端回發(fā) ACK 丟失的情況做處理,可以在服務(wù)端再次發(fā)送 FIN 時回發(fā) ACK霞扬。
我們發(fā)現(xiàn)上面的 流程2和 流程3都是由服務(wù)端發(fā)起的糕韧,那么有沒有可能合并這兩個請求,一次發(fā)送給客戶端喻圃?答案是 可以萤彩。在 RFC 2581中的 4.2 節(jié)有提到, ack可以延遲確認斧拍,只要求保證在 500ms之內(nèi)保證確認包到達即可雀扶。在這樣的標準下, TCP確認是有可能進行合并延遲確認的 所以通常的 4次揮手肆汹,經(jīng)過合并后變成了 3次揮手愚墓。