TCP为什么需要三次握手四次挥手
TCP为什么需要三次握手
简单答案:
- client与server需要交换各自的Initial Sequence Number (ISN),至少需要三次交换。
- 若采用两次握手,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 -->