三次握手(Three-way Handshake)其實(shí)就是指建立一個(gè)TCP連接時(shí),需要客戶端和服務(wù)器總共發(fā)送3個(gè)包。
進(jìn)行三次握手的主要作用就是為了確認(rèn)雙方的接收能力和發(fā)送能力是否正常、指定自己的初始化序列號(hào)為后面的可靠性傳送做準(zhǔn)備。
實(shí)質(zhì)上其實(shí)就是連接服務(wù)器指定端口,建立TCP連接,并同步連接雙方的序列號(hào)和確認(rèn)號(hào),交換TCP窗口大小信息。
剛開始客戶端處于 Closed 的狀態(tài),服務(wù)端處于 Listen 狀態(tài)。
進(jìn)行三次握手:
第一次握手:客戶端給服務(wù)端發(fā)一個(gè) SYN 報(bào)文,并指明客戶端的初始化序列號(hào) ISN©。此時(shí)客戶端處于 SYN_SEND 狀態(tài)。首部的同步位SYN=1,初始序號(hào)seq=x,SYN=1的報(bào)文段不能攜帶數(shù)據(jù),但要消耗掉一個(gè)序號(hào)。
第二次握手:服務(wù)器收到客戶端的 SYN 報(bào)文之后,會(huì)以自己的 SYN 報(bào)文作為應(yīng)答,并且也是指定了自己的初始化序列號(hào) ISN(s)。同時(shí)會(huì)把客戶端的 ISN + 1 作為ACK 的值,表示自己已經(jīng)收到了客戶端的 SYN,此時(shí)服務(wù)器處于 SYN_REVD 的狀態(tài)。在確認(rèn)報(bào)文段中SYN=1,ACK=1,確認(rèn)號(hào)ack=x+1,初始序號(hào)seq=y。
第三次握手:客戶端收到 SYN 報(bào)文之后,會(huì)發(fā)送一個(gè) ACK 報(bào)文,當(dāng)然,也是一樣把服務(wù)器的 ISN + 1 作為 ACK 的值,表示已經(jīng)收到了服務(wù)端的 SYN 報(bào)文,此時(shí)客戶端處于 ESTABLISHED 狀態(tài)。
服務(wù)器收到 ACK 報(bào)文之后,也處于 ESTABLISHED 狀態(tài),此時(shí),雙方已建立起了連接。
確認(rèn)報(bào)文段ACK=1,確認(rèn)號(hào)ack=y+1,序號(hào)seq=x+1(初始為seq=x,第二個(gè)報(bào)文段所以要+1),ACK報(bào)文段可以攜帶數(shù)據(jù),不攜帶數(shù)據(jù)則不消耗序號(hào)。發(fā)送第一個(gè)SYN的一端將執(zhí)行主動(dòng)打開(active open),接收這個(gè)SYN并發(fā)回下一個(gè)SYN的另一端執(zhí)行被動(dòng)打開(passive open)。
在socket編程中,客戶端執(zhí)行connect()時(shí),將觸發(fā)三次握手。