TCP为什么需要三次握手四次挥手

TCP为什么需要三次握手

简单答案:

  1. client与server需要交换各自的Initial Sequence Number (ISN),至少需要三次交换。
  2. 若采用两次握手,server可能会浪费资源为延迟到达的SYN包建立连接。

ISN交换至少需要三次

典型的TCP三次握手过程如下图(Computer Networking: A Top-Down Approach):

ISN是为了保证TCP的可靠传输,client_isn与server_isn在建立连接时的带确认的交换不可能两次完成。否则如去掉最后一次ACK,server将不能确认client收到了server_isn。

本质上TCP握手也是四次:

SYN -->
    <-- ACK
    <-- SYN
ACK -->

只不过将ACK/SYN合成了一个TCP segment发送,变成了三次:

SYN -->
    <-- SYNC/ACK
ACK -->

两次握手造成的资源浪费

SYN(1)
SYN(2) -->
       <-- ACK(2)
---------------------
SYN(1) -->
       <-- ACK(1)

如上图示意,假如client先发送了SYN,由于网络拥堵导致它延迟到达。而client超时未收到server的ACK,则它将重传SYN,如果重传的SYN先于第一个SYN到达,且这次会话时间很短,在虚线处已经完成会话。之后第一个被堵住的SYN延迟到达了server。因为server已经没有任何关于已完成会话的信息,导致它会认为这是新一次的会话,再次分配资源给这个“新连接”,并发送ACK,而此时client早已关闭了连接,server的资源无法释放造成浪费。

TCP为什么需要四次挥手

四次挥手是因为TCP是全双工通信,client和server可能有一方先发送完数据中止通信,而另一方可继续单向传输。双方都需要与对方确认不再有数据发送,因此往返需要四次。

FIN -->
    <-- ACK
    <-- FIN
ACK -->

实际上,如果server在收到FIN之后,自己也不再有数据发送,则四次挥手也可三次完成,即将ACK与自己的FIN放在一个TCP segment中发送:

FIN -->
    <-- ACK/FIN
ACK -->