TCP四次挥手中如果服务端没收到第四次挥手请求,服务端会一直等待吗?

简介: TCP四次挥手中如果服务端没收到第四次挥手请求,服务端会一直等待吗?

搬运一个在某乎的回答,水一篇文章吧。

TCP四次挥手

正常情况下。只要数据传输完了,不管是客户端还是服务端,都可以主动发起四次挥手,释放连接。

就跟上图画的一样,假设,这次四次挥手是由客户端主动发起的,那它就是主动方。服务器是被动接收客户端的挥手请求的,叫被动方

客户端和服务器,一开始,都是处于ESTABLISHED状态。

第一次挥手:一般情况下,主动方执行close()shutdown()方法,会发个FIN报文出来,表示"我不再发送数据了"。

第二次挥手:在收到主动方的FIN报文后,被动方立马回应一个ACK,意思是"我收到你的FIN了,也知道你不再发数据了"。

上面提到的是主动方不再发送数据了。但如果这时候,被动方还有数据要发,那就继续发。注意,虽然第二次和第三次挥手之间,被动方是能发数据到主动方的,但主动方能不能正常收就不一定了,这个待会说。

第三次挥手:在被动方在感知到第二次挥手之后,会做了一系列的收尾工作,最后也调用一个 close(), 这时候就会发出第三次挥手的 FIN-ACK

第四次挥手:主动方回一个ACK,意思是收到了。

其中第一次挥手和第三次挥手,都是我们在应用程序中主动触发的(比如调用close()方法),也就是我们平时写代码需要关注的地方。

第二和第四次挥手,都是内核协议栈自动帮我们完成的,我们写代码的时候碰不到这地方,因此也不需要太关心。

另外不管是主动还是被动,每方发出了一个 FIN 和一个ACK 。也收到了一个 FIN 和一个ACK

回到题主的问题。

TCP四次挥手中如果服务端没收到第四次挥手请求,服务端会一直等待吗?

第四次挥手是第三次挥手触发的。如果第四次挥手服务端一直没收到,那服务端会认为是不是自己的第三次挥手丢了,于是服务端不断重试发第三次挥手(FIN).重发次数由系统的tcp_orphan_retries参数控制。重试多次还没成功,服务端直接断开链接。所以结论是服务端不会一直等待第四次挥手。

TCP第四次挥手丢失

# cat /proc/sys/net/ipv4/tcp_orphan_retries
0

另外,你会发现tcp_orphan_retries参数是0,但其实并不是不重试的意思。为0时,默认值为8. 也就是重试8次。

/* Calculate maximal number or retries on an orphaned socket. */
static int tcp_orphan_retries(struct sock *sk, int alive)
{
    int retries = sysctl_tcp_orphan_retries; /* May be zero. */
    /* We know from an ICMP that something is wrong. */
    if (sk->sk_err_soft && !alive)
        retries = 0;
    /* However, if socket sent something recently, select some safe
     * number of retries. 8 corresponds to >100 seconds with minimal
     * RTO of 200msec. */
    if (retries == 0 && alive)
        retries = 8;
    return retries;
}

当然如果服务端重试发第三次挥手FIN的过程中,还是同样的端口和IP,起了个新的客户端,这时候服务端重试的FIN被收到后,客户端就会认为是不正常的数据包,直接发个RST给服务端,这时候两端连接也会断开。


参考资料

查资料的时候发现小林大佬已经写过,而且写的巨好,感兴趣的可以看下他的这篇文章。

《 如何优化 TCP?》

https://xiaolincoding.com/network/3_tcp/tcp_optimize.html#%E4%B8%BB%E5%8A%A8%E6%96%B9%E7%9A%84%E4%BC%98%E5%8C%96

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
2月前
|
前端开发 网络协议 JavaScript
|
4月前
|
消息中间件 Kubernetes 网络协议
知识巩固源码落实之2:tcp服务端接收处理半包和粘包
知识巩固源码落实之2:tcp服务端接收处理半包和粘包
37 0
|
4月前
|
网络协议
TCP三次握手,四次挥手策略
TCP三次握手,四次挥手策略
19 0
|
5月前
|
网络协议
07 tcp三次握手、四次挥手、十种状态
07 tcp三次握手、四次挥手、十种状态
253 0
|
7月前
|
网络协议 数据安全/隐私保护
TCP协议握手挥手
TCP握手挥手
33 2
|
8月前
|
网络协议
断开连接的四次挥手
网络请求时断开连接是咋么进行挥手的呢?
90 1
|
网络协议
TCP协议为什么是3次握手,4次挥手
TCP(Transport Control Protocol)是一个传输层协议,提供Host-To-Host数据的可靠传输,支持全双工是一个连接导向的协议。 TCP/IP五层模型 应用层 传输层 网络层 数据链路层 物理层 TCP是在传输层的协议,主要实现主机到主机通信,前提是需要知道主机们的网络地址(IP地址),但是TCP不负责实际地址到地址的传输,因此TCP协议把IP地址给底层的网络层处理。
46 0
|
缓存 网络协议 安全
TCP三次握手四次挥手及常见问题解决方案
TCP三次握手四次挥手及常见问题解决方案
TCP三次握手四次挥手及常见问题解决方案
|
网络协议 数据处理 Apache
TCP - 断开连接,四次挥手(图文版)
TCP - 断开连接,四次挥手(图文版)
153 0
TCP - 断开连接,四次挥手(图文版)

热门文章

最新文章