TCP協議來自RFC793 。 https://www.ietf.org/rfc/rfc793.txt網絡
1。 爲何三次握手?this
正確答案:TCP三次握手,其實是雙方各握手一次,各作一次確認,其中一次握手和確認合併在一塊兒。(就這樣簡單,徹底沒有別的幺兒子)。計算機網絡
來此上面連接的Page27頁。three
1) A --> B SYN my sequence number is X 2) A <-- B ACK your sequence number is X 3) A <-- B SYN my sequence number is Y 4) A --> B ACK your sequence number is Y
答案解釋:TCP有2個特性1. 「全雙工」 2.「通訊穩定」ip
特性1須要雙向確認,特性2引入了SEQ(sequence numbers 序列號),用SEQ肯定報文的先後順序。ci
--錯誤答案:引用謝希仁著《計算機網絡》第四版中,講 「三次握手」 的目的是 「爲了防止已失效的鏈接請求報文段忽然又傳送到了服務端,於是產生錯誤」。這句話來自文首連接的Page 32的「The principle reason for the three-way handshake is to prevent old duplicate connection initiations from causing confusion」。rem
這句針對的問題應該是「若是協議只發SYN,不須要ACK就完成創建鏈接步驟可行嗎?「get
即:it
1) A --> B SYN my sequence number is X 2) A <-- B SYN my sequence number is Y
後面一句很重要 「To deal with this, a special control message, reset, has been devised.」 io
連一塊兒解釋就是若是2次握手,會出現失效的重複連接問題。3次握手+reset能夠避免」失效的重複連接問題「!
2。 爲何四次揮手?
正確答案:雙方各揮手一次,各作一次確認。幾乎和握手如出一轍,只是中間的2,3由於存在時間差沒法合併。
1) A --> B FIN my sequence number is X 2) A <-- B ACK your sequence number is X 3) A <-- B FIN my sequence number is Y 4) A --> B ACK your sequence number is Y
RFC793給出的討論在page38
There are essentially three cases: 1) The user initiates by telling the TCP to CLOSE the connection 2) The remote TCP initiates by sending a FIN control signal 3) Both users CLOSE simultaneously
就是說,只有case3的狀況下,第2,3兩步驟不存在時間差,能夠作到3次揮手。但這種特例顯然不該該被推薦爲通用標準。更合理的4次揮手標準誕生了。