接觸網絡協議棧TCP/IP的人,就一定繞不開的一個話題就是TCP的三次握手。下面我將簡單介紹一下。
三次握手流程的本質,可以這么理解:TCP的三次握手其實是雙方各一次握手,各一次確認,只是其中一次握手和確認合並在一起。
當然也可以更通俗的去理解:
-
“喂,你聽得到嗎?”
-
“我聽得到呀,你聽得到我嗎?”
-
“我能聽到你”
三次握手為什么不用兩次,或者四次
原因很簡單,因為只有三次才是最合適的,三次通信是最小值,兩次通信滿足不了要求,而四次通信則顯得冗余。
比如之前的三次改成兩次,四次的結果就變味了。
兩次握手:
-
“喂,你聽得到嗎?”
-
“我聽得到呀”
-
“喂,你聽得到嗎?”
-
“草,我聽得到呀!!!!”
-
“你TM能不能聽到我講話啊!!喂!”
-
“……”
四次握手:
-
“喂,你聽得到嗎?”
-
“我聽得到呀,你聽得到我嗎?”
-
“我能聽到你,你能聽到我嗎?”
-
“……不想跟傻逼說話”
TCP的三次握手流程
-
第一次握手:Client將標志位SYN置為1,隨機產生一個值seq=J,並將該數據包發送給Server,Client進入SYN_SENT狀態,等待Server確認。
-
第二次握手:Server收到數據包后由標志位SYN=1知道Client請求建立連接,Server將標志位SYN和ACK都置為1,ack=J+1,隨機產生一個值seq=K,並將該數據包發送給Client以確認連接請求,Server進入SYN_RCVD狀態。
-
第三次握手:Client收到確認后,檢查ack是否為J+1,ACK是否為1,如果正確則將標志位ACK置為1,ack=K+1,並將該數據包發送給Server,Server檢查ack是否為K+1,ACK是否為1,如果正確則連接建立成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨后Client與Server之間可以開始傳輸數據了。
TCP“三次握手” 這個問題的本質是, 信道不可靠, 但是通信雙發需要就某個問題達成一致. 而要解決這個問題, 無論你在消息中包含什么信息, 三次通信是理論上的最小值. 所以三次握手不是TCP本身的要求, 而是為了滿足"在不可靠信道上可靠地傳輸信息"這一需求所導致的. 請注意這里的本質需求,信道不可靠, 數據傳輸要可靠. 三次達到了, 那后面你想接着握手也好, 發數據也好, 跟進行可靠信息傳輸的需求就沒關系了. 因此,如果信道是可靠的, 即無論什么時候發出消息, 對方一定能收到, 或者你不關心是否要保證對方收到你的消息, 那就能像UDP那樣直接發送消息就可以了.”。這可視為對“三次握手”目的的另一種解答思路。