1. 程式人生 > >對TCP三次握手的思考

對TCP三次握手的思考

  從第一次瞭解到TCP的連線方式到現在有一年半了,但好像一直沒有把三次握手的由來弄透徹,解釋上總有一些瑕疵在,現在來說說昨晚的思考。

  對於一個通訊鏈路,由於種種原因傳送方傳送的訊息未必能傳達到接收方,所以一條訊息傳送出去了,但沒人回,有兩種情況:一是資料沒有傳送成功,二是傳送成功但對方沒有立即迴應。當我們規定在試探鏈路時,傳送的訊息必須迴應,這樣如果傳送方依然沒有收到迴應,則可以判斷是鏈路出了問題,如果收到迴應說明鏈路可通,可以安心傳送了。(所以叫你一聲你要答應才禮貌)

  但這只是單向傳送,作為被接收的一方只是傳送了一個應答,站在它的角度,它能接收對面來的訊息說明來路可通,但並不知道去路是否可通。而如果傳送方收到應答後,此時該方知道來去路都是通的(establish),所以它還需要把這個訊息告訴對方,讓對方也放心。

  所以三次握手的本質是在一開始確立全雙工的關係。同樣四次揮手也是如此,只不過分解成了兩次應答,讓先發送完的一方先告知對方自己已發完,但對方未必發完,所以只好分開確認。如果兩邊速度完全一樣則也可以合併成三次揮手。

  除此之外還有雙方預設訊息在一定時間內沒有迴應為此時鏈路不通,重新改送,多次傳送不通則失敗,所以收到對方的重複訊息說明我方剛才的訊息沒有送到,需重發。(與三次握手的思想不衝突,柔和在一起形成基本通訊協議)