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数量的请求。

目录
相关文章
|
23天前
|
缓存 应用服务中间件 网络安全
Nginx中配置HTTP2协议的方法
Nginx中配置HTTP2协议的方法
55 7
|
2月前
|
域名解析 网络协议 数据库
TCP/IP服务器
【10月更文挑战第20天】TCP/IP服务器
123 65
|
10天前
|
存储 编解码 应用服务中间件
使用Nginx搭建流媒体服务器
本文介绍了流媒体服务器的特性及各种流媒体传输协议的适用场景,并详细阐述了使用 nginx-http-flv-module 扩展Nginx作为流媒体服务器的详细步骤,并提供了在VLC,flv.js,hls.js下的流媒体拉流播放示例。
79 1
|
19天前
|
负载均衡 监控 应用服务中间件
配置Nginx反向代理时如何指定后端服务器的权重?
配置Nginx反向代理时如何指定后端服务器的权重?
37 4
|
2月前
|
网络协议 Java API
【网络】TCP回显服务器和客户端的构造,以及相关bug解决方法
【网络】TCP回显服务器和客户端的构造,以及相关bug解决方法
65 2
|
2月前
|
存储 网络协议 Java
【网络】UDP和TCP之间的差别和回显服务器
【网络】UDP和TCP之间的差别和回显服务器
70 1
|
2月前
|
网络协议 Python
Python创建一个TCP服务器
Python创建一个TCP服务器
22 0
|
3月前
|
网络协议 数据处理 C语言
利用C语言基于poll实现TCP回声服务器的多路复用模型
此代码仅为示例,展示了如何基于 `poll`实现多路复用的TCP回声服务器的基本框架。在实际应用中,你可能需要对其进行扩展或修改,以满足具体的需求。
91 0
|
17天前
|
存储 人工智能 弹性计算
阿里云弹性计算(ECS)提供强大的AI工作负载平台,支持灵活的资源配置与高性能计算,适用于AI训练与推理
阿里云弹性计算(ECS)提供强大的AI工作负载平台,支持灵活的资源配置与高性能计算,适用于AI训练与推理。通过合理优化资源分配、利用自动伸缩及高效数据管理,ECS能显著提升AI系统的性能与效率,降低运营成本,助力科研与企业用户在AI领域取得突破。
35 6
|
22天前
|
人工智能 弹性计算 编解码
阿里云GPU云服务器性能、应用场景及收费标准和活动价格参考
GPU云服务器作为阿里云提供的一种高性能计算服务,通过结合GPU与CPU的计算能力,为用户在人工智能、高性能计算等领域提供了强大的支持。其具备覆盖范围广、超强计算能力、网络性能出色等优势,且计费方式灵活多样,能够满足不同用户的需求。目前用户购买阿里云gpu云服务器gn5 规格族(P100-16G)、gn6i 规格族(T4-16G)、gn6v 规格族(V100-16G)有优惠,本文为大家详细介绍阿里云gpu云服务器的相关性能及收费标准与最新活动价格情况,以供参考和选择。