2017-09-14 57 views
0

當連接建立,有:爲什麼tcp連接終止需要4路握手?

客戶------ ----- SYN>服務器

客戶< --- ACK/SYN ---- ---服務器-①

客戶------ ACK ----->服務器

和終止時談到,有:

客戶------ ----- FIN>服務器

客戶< ----- ------ ACK服務器----②

客戶< --- --FIN ------ ----服務器③

客戶------ ACK ----->服務器

我questionn是爲什麼②和③不能設置在同一個包中,例如①在一個包中是ACK和SYN集?

+2

要允許*半開連接*? –

+0

@Someprogrammerdude我從這個鏈接瞭解到:https://networkengineering.stackexchange.com/questions/24068/why-do-we-need-a-3-way-handshake-why-not-just-2-way? newreg = 531924225dc8452ebd9bbb93a01db9ef – touchstone

+0

最上面的答案表示ACK和SYN設置在同一個包中,那麼我想爲什麼終止不能在一個包中設置ACK和FIN,這樣可以減少一次握手。 – touchstone

回答

3
  • 三方握手連接設置):服務器必須承認(ACK)客戶端的SYN和服務器還必須派遣自己的SYN包含初始序列服務器將在連接上發送的數據的編號。
    這就是爲什麼服務器發送的SYN 在單段的客戶端的SYN ACK
  • 在連接終止:它需要四個段終止因爲FIN的連接和ACK需要在每個方向。
    (2)意味着接收到的FIN(第一鏈段)是由TCP 確認(ACK
    (3)表示稍後的某個時候接收到檔案結尾將關閉其插座中的應用。這會導致其TCP發送一個FIN
    然後最後段將意味着接收到該最終FIN系統上的TCP確認(ACK )的FIN
+0

你剛剛在這個問題上解釋了他的形象。這仍然不能「解釋」原因,但它只解釋了TCP終止。 – deppfx

3

谷歌很多後,我意識到四路實際上是兩對雙向握手。

如果終止是一個真正的四路動作,則2和3確實可以在同一個包中設置1。

但這是一個兩階段的工作:第一階段(即,第一雙向握手)爲:

客戶------ ----- FIN>服務器

客戶< ----- ------ ACK服務器

此時客戶端已經處於FIN_WAIT_2狀態,正在等待來自服務器的FIN。作爲一種雙向和全雙工協議,目前一個方向發生故障,客戶端必須等待另一個「半雙工」終止。

當FIN從服務器發送到客戶端時,則客戶端響應ACK來終止連接。

得出結論,2和3不能合併成一個包,因爲它們屬於不同的狀態。

希望我可憐的英語作品。大聲笑。

裁判:

http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm

http://www.tcpipguide.com/free/t_TCPConnectionEstablishmentProcessTheThreeWayHandsh-3.htm

http://www.tcpipguide.com/free/t_TCPOperationalOverviewandtheTCPFiniteStateMachineF-2.htm

+0

它有幫助,謝謝。 – 1a1a11a