tcp/http类nginx服务器keepalive_requests数据丢失问题

简介: tcp/http基于请求/响应式交互的上层协议服务器或反向代理服务一般有一个keepalive_requests参数可以指定一条tcp连接上最多能发送的请求数量,超过keepalive_requests数量时server端会关闭tcp连接, 在使用这个指令做服务端时可能导致与其连接的client端数据丢失问题.

tcp/http基于请求/响应式交互的上层协议服务器或反向代理服务一般有一个keepalive_requests参数可以指定一条tcp连接上最多能发送的请求数量,超过keepalive_requests数量时server端会关闭tcp连接,例如nginx的指令:

Syntax: keepalive_requests number;
Default: keepalive_requests 100;
Context: http, server, location
This directive appeared in version 0.8.0.
Sets the maximum number of requests that can be served through one keep-alive connection. After the maximum number of requests are made, the connection is closed.

在使用这个指令做服务端时可能导致与其连接的client端数据丢失问题,最直接的现象就是client和server端请求数量不一致,即server端数据有缺失。一些真实的案例:多个反向代理服务器串接在一起提供服务器时,非最后一个代理服务器使用的keepalive长连接常有一些请求502状态码记录,在后端服务器上排查日志时找不到对应记录。

问题简要分析如下:
配置keepalive_requests=1000,即server端一条tcp长连接上收到第1000请求并处理返回响应时判断已经达到keepalive_requests数量,直接调用close()关闭连接,tcp交互序列描述如下:

image

示例:下边的抓包是一条长连接上多个请求传输有丢数据,server端配置了keepalive_requests=1000;使用过滤条件 tcp.stream eq 0 && tcp.len==14 过滤出1000个请求的响应报文如下:其中11.x.226.82是server端ip地址。

image

image

根据tcp协议原理可知上图红色框中部分属于server端的半关闭,即server端不再接收数据,但是不会影响client端仍接收传输链路上的数据,tcp协议交互还在链路上继续,
丢数据问题就发生在server关闭报文到达client端这段链路时间开销中;

image

上图可以看出因为client端收到第1000个response后还没有立即接收到FIN+ACK关闭报文,所以继续发送第1001个request(注意:应用层面调用send或write函数可以返回写成功),而1001 request到达server后tcp已经半关闭,不会再接收处理数据发送rst以通告对方。

因为client发送数据到tcp协议缓存即调用send或write函数返回写成功,但数据不能被server接收处理,导致发送数据丢失而应用程序没有感知,这种情况下最好有应用层保障机制(失败重传机制),即每个请求发送后都根据响应做判断数据送达。或者client端主动控制发送少于server规定keepalive_requests数量的请求。

目录
相关文章
|
2月前
|
网络协议 安全 测试技术
手撕测试tcp服务器效率工具——以epoll和io_uring对比为例
手撕测试tcp服务器效率工具——以epoll和io_uring对比为例
41 2
|
2月前
|
缓存 负载均衡 应用服务中间件
如何在 CentOS 7 上为 NGINX 安装开源 HTTP 加速器:Varnish
如何在 CentOS 7 上为 NGINX 安装开源 HTTP 加速器:Varnish
71 1
如何在 CentOS 7 上为 NGINX 安装开源 HTTP 加速器:Varnish
|
26天前
|
弹性计算 网络安全 虚拟化
ECS数据问题之升级配置预防数据丢失如何解决
ECS(Elastic Compute Service,弹性计算服务)是云计算服务提供商提供的一种基础云服务,允许用户在云端获取和配置虚拟服务器。以下是ECS服务使用中的一些常见问题及其解答的合集:
|
1月前
|
网络协议 Java
【开源视频联动物联网平台】J2mod库写一个Modbus TCP 服务器
【开源视频联动物联网平台】J2mod库写一个Modbus TCP 服务器
65 0
|
2月前
|
数据挖掘 数据库 虚拟化
服务器数据恢复-异常断电导致服务器数据丢失的数据恢复案例
服务器数据恢复环境: dell某型号服务器中有一组通过raid卡组建的raid10,该raid阵列中一共有4块磁盘。上层部署XenServer虚拟化平台,作为网站服务器使用。 服务器故障: 服务器异常断电导致服务器上的一台虚拟机不可用。需要恢复这台虚拟机上的数据库数据。
服务器数据恢复-异常断电导致服务器数据丢失的数据恢复案例
|
2月前
|
网络协议 Java API
【JavaEE初阶】 TCP服务器与客户端的搭建
【JavaEE初阶】 TCP服务器与客户端的搭建
|
2月前
|
数据可视化 Linux
生存类游戏《幻兽帕鲁》从部署服务器到开始体验全过程
SteamDB数据显示,《幻兽帕鲁》上线24小时内,在线人数峰值便突破200万,跻身Steam历史排行榜第二位。随着热度进一步发酵,《幻兽帕鲁》官方发布推文称,游戏发售不到6天,销量已经突破了 800万份。欢迎大家在阿里云平台上一起体验
|
2月前
|
数据采集 网络协议 搜索推荐
网络编程【TCP单向通信、TCP双向通信、一对多应用、一对多聊天服务器】(二)-全面详解(学习总结---从入门到深化)
网络编程【TCP单向通信、TCP双向通信、一对多应用、一对多聊天服务器】(二)-全面详解(学习总结---从入门到深化)
53 0
|
3月前
|
网络协议 安全 Linux
腾讯三面:一台服务器,最大支持的TCP连接数是多少?
一个 TCP 对象占用的大小,等于它所包含的一些数据结构占用大小的总和,也是就把上面这些数据结构的大小累加起来,就是一个 TCP 连接占用的大小了。实际过程中的 TCP 连接,肯定不是静止状态的,还会进行发送数据和接收数据了,那么这些过程还是会额外消耗更多的内存资源的,8 GB 物理内存的服务器实际并发很难达到百万级别。
59 2
|
3月前
|
网络协议 安全 Go
TCP基础详解:Telnet回音服务器搭建
TCP基础详解:Telnet回音服务器搭建
30 0