tcp中兩台設備在同時建立連接時,為什麼需兩次發送自己的SYN?

各位網路專家,大家好。在閱讀《TCP/IP詳解 卷1:協議》時,當兩台主機同時打開一條連接時,為什麼需要兩次發送自己的SYN?

例如主機A在發送SYN序號後,收到B主機發來的SYN(K),除了發送對SYN(K)的應答外,為什麼還要再次發送SYN(N)?
新手勿噴,謝謝回答。


TCP SYN是佔用一個序列號的,即一個位元組的長度,記住一點:TCP中只要是數據,即使是一個位元組,即使如SYN,也需要確認的!

當A發SYN(seq:C)給B,A期望收到B 的ACK:C+1
可是恰恰B的SYN已經發出,沒有ACKed A

B期望收到A的 ACK:K+1,
可是恰恰A的SYN已經發出,沒有ACKed B

於是A又重傳了一次 SYN(seq:C,ACK:K+1),同時確認了對方B的SYN(seq:K)

B其實也是重傳了一次SYN ( seq:K, ACK: C+1),同時確認了對方A的SYN(seq:C)

即然各自的SYN已經被確認,TCP連接就建立起來了。


這個應該不是重傳,而是一種特殊的狀態時序,一般建立連接時分主動被動兩種情況,這是第三種,即允許兩個埠同時發起連接,兩邊都是主動。從時間序列上說,兩邊發出SYN前都沒有收到對方的SYN,這種情況下兩邊都做三次握手,進入連接完成序列。實際情況下應該不太可能出現這種情況,因為一般會選擇自動分配的源埠。同樣關閉連接也有兩邊同時發起的時序。
這種時序是一種「不約而同」,所以不會是故意設計成這樣,只是程序運行中有可能出現,為了協議完整而增加的。
至於為什麼都要再發SYN-ACK,還是三次握手的原理,你需要確認「對方在確認收到了我的SYN之後發送了SYN表明同意建立連接」,僅僅收到SYN是不夠的,因為對方不一定收到了你的SYN。


個人認為是因為幾個原因
1、因為不能保證數據按序到達,3可以先於1到達,如果A在3不設置SYN(A的序列號對於B來說無意義),該ACK對於B來說到按照rfc來說是無意義的。假設該ACK有意義,B進入何種狀態,會出現和被動打開不兼容的情況。
2、如果能保證1先於3到達,那麼3不設置SYN在同時打開的情況下是可行的,但是在A被動打開的情況下會出現問題,因為B不知道A是否發送了SYN報文。
3、如果把1,4隱藏掉,其實在SYN_RCVD和A在被動打開的情況下發送的報文是一致的,總是會發送syn/ack報文,這樣就統一了。
4、總之,按照rfc的設計應該是都考慮到了被動打開和主動打開、同時打開的情況。
5、自己的理解,肯定有不對的地方。


推薦閱讀:

是不是清華北大的大多數基礎學科的本科生,研究生都學了CS?,為什麼?
你讀過哪些深入淺出的(技術)書籍?
數字信號在物理層傳輸時,本質上是數字信號還是模擬信號,為什麼?
tcp重傳機制 對端滑動窗口一直為0時如何處理?
為什麼TCP4次揮手時等待為2MSL?

TAG:計算機網路 | 計算機科學 | TCPIP |