三方交握(Three-Way Handshake)是TCP(Transmission Control Protocol)在傳送資料前的一個儀式,用來確認雙方都有收到訊息並建立連線

而在解釋三方交握之前,先來看看三方交握會用到的三個概念:請求、確認和同步

請求/確認

假設有A和B兩台電腦,A電腦要傳送封包給B電腦,為了確認B電腦是否收到封包,B電腦在收到A傳過來的封包之後會返回一個確認(Acknowledgment,ACK)封包,以告知A電腦已經有收到封包了,步驟如下:

  1. A電腦傳送封包給B電腦
  2. B電腦回傳一個帶有ACK欄位資訊的封包給A電腦

這可以使TCP變成可靠的傳輸,但是另外一個問題出現了,若A電腦向B電腦發送多個封包,B電腦照樣送回多個ACK封包給A電腦,A電腦將會無法得知這些ACK是對應到哪個已發送的封包,就會不知道哪個對方已經收到,而哪個對方沒收到,這時我們可以用序列號(sequence number,SEQ)來解決這個問題。

序列號

但是這邊又遇到一個問題了,因為A電腦和B電腦的起始序列號不一定會一樣,所以A電腦發送出去的封包的序列號不等於B電腦發送出去的封包的ACK的序號,例如A電腦初始序列號為7,B電腦初始序列號為1000。所以在開始傳送封包前AB雙方會進行同步(synchronization)來確認彼此的初始序列號(Initial Sequence Number,ISN)是多少,以作為後續在收到請求後要發送確認封包時,可以確認對方的序號是否正確。

同步

同步為同步序列號(Synchronize sequence numbers,SYN),用意就是在於確認彼此的初始序列號,假設A電腦的初始序列號是7,B電腦的初始序列號是1000,同步的步驟如下:

  1. A電腦傳送SYN為7的封包給B
  2. B電腦收到A電腦傳送SYN為7的封包,回傳ACK為8(7+1=8)的封包給A電腦
  3. B電腦傳送SYN為1000的封包給A
  4. A電腦收到B電腦傳送SYN為1000的封包,A電腦回傳ACK為1001(1000+1)的封包給B電腦

三方交握

如此一來雙方便知道彼此的初始序列號了,而將四個步驟中的2和3合併成一個封包便是我們俗稱的三方交握

  1. A電腦傳送SYN給B電腦
  2. B電腦收到A電腦傳送的SYN,傳回SYN+ACK給A電腦
  3. A電腦送回ACK給B電腦