TCP三次握手流程圖
第一次握手
客戶端主動發送 SYN=1,隨機產生seq number = x 的數據包到服務器(服務器由SYN=1知道客戶端要求建立連接)
第二次握手
服務器收到請求后要確認聯機信息,向客戶端發送SYN=1,ACK=1,隨機產生seq number= y ,
ack number = 客戶端的seq number +1 (x+1)
第三次握手
客戶端收到后檢查ack number 是否正確,即第一次發送的seq number +1 ,以及位碼ACK 是否為1,
若正確客戶端會再次發送 ack number = y+1 (服務端seq number +1) ,
seq number =服務端ack number (即x+1,也是第一次seq number +1),服務端收到后確認seq number 值與ACK=1,則連接建立成功。
TCP三次握手實例:
第一次: IP 192.168.1.116.3337 > 192.168.1.123.7788: S 3626544836:3626544836 第二次: IP 192.168.1.123.7788 > 192.168.1.116.3337: S 1739326486:1739326486 ack 3626544837 第三次: IP 192.168.1.116.3337 > 192.168.1.123.7788: ack 1739326487,ack 1
第一次握手:192.168.1.116發送位碼syn=1,隨機產生seq number=3626544836的數據包到192.168.1.123,192.168.1.123由SYN=1知道192.168.1.116要求建立聯機;
第二次握手:192.168.1.123收到請求后要確認聯機信息,向192.168.1.116發送ack number=3626544837,syn=1,ack=1,隨機產生seq=1739326486的包;
第三次握手:192.168.1.116收到后檢查ack number是否正確,即第一次發送的seq number+1,以及位碼ack是否為1,若正確,192.168.1.116會再發送ack number=1739326487,ack=1,192.168.1.123收到后確認seq=seq+1,ack=1則連接建立成功。
總結:
一個完整的三次握手也就是 請求---應答---再次確認
解釋如下:
第一次握手:Client將標志位SYN置為1,隨機產生一個值seq=x,並將該數據包發送給Server,Client進入SYN_SENT狀態,等待Server確認。
第二次握手:Server收到數據包后由標志位SYN=1知道Client請求建立連接,Server將標志位SYN和ACK都置為1,ack (number )=x+1,隨機產生一個值seq=y,並將該數據包發送給Client以確認連接請求,Server進入SYN_RCVD狀態。
第三次握手:Client收到確認后,檢查ack是否為x+1,標志位ACK是否為1,如果正確則將標志位ACK置為1,ack=y+1,並將該數據包發送給Server,Server檢查ack是否為y+1,ACK是否為1,如果正確則連接建立成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨后Client與Server之間可以開始傳輸數據了。