首先,最基本的三次操作方的說明如下:
- 客戶端向服務端發送請求;客戶端 → 服務端
- 服務端確認客戶端發送到來的請求;服務端 → 客戶端
- 客戶端確認服務端發送到來的確認。客戶端 → 服務端
最顯淺的目的解釋如下:
- 第一次握手:“你”是不是在監聽指定端口?
- 第二次握手:“我”的確在監聽某個端口,“你”可以跟我建立連接。
- 第三次握手:“我”收到了“你”的回復了,“你”做好准備吧。
要是認真思考過后,還不能理解上面的說法的話,你可能需要知道這些TCP協議實現的基本背景
- TCP是建立在IP協議之上的,而IP協議作為網絡層協議,並不保證每個發送的消息,都能到達目的IP;
- 網絡層協議不僅不保證每個數據能不能到達目標地址,而且並不保證你發送的順序,會更目標收到的順序相同;
- 服務端只是一個提供服務的個體,它跟客戶端的關系是一對多。
- TCP是全雙工的,a能到達b未必就是b能到達a。
為什么
TCP需要這樣設計呢?
- 第一次握手的時候,TCP協議頭中會攜帶它發送的
序列號a
(以及窗口大小等,不過這是題外話),以確保服務端沒有回復的時候,它發出第二次(或者內容不一樣)請求的時候,能夠區別開; - 第二次握手,服務端確認的同時,會攜帶上客戶端發過來的
序列號
(准確來說,這個時候已經叫確認號
了,值為a+1),以及自己的發送序列號b
;(“我”只確認a這個序列號的請求,其他序號的有可能丟失,有可能其他原因沒有收到的,“我”不管) - 第三次,客戶端會攜帶上服務端發過來的
序列號
(此時也應稱為確認號
,值為b+1),並且因為服務端剛才確認收到的是a數據,所以這次自己攜帶的序列號
為a+1。