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

目录
相关文章
|
7月前
|
应用服务中间件 Linux 网络安全
Centos 8.0中Nginx配置文件和https正书添加配置
这是一份Nginx配置文件,包含HTTP与HTTPS服务设置。主要功能如下:1) 将HTTP(80端口)请求重定向至HTTPS(443端口),增强安全性;2) 配置SSL证书,支持TLSv1.1至TLSv1.3协议;3) 使用uWSGI与后端应用通信(如Django);4) 静态文件托管路径设为`/root/code/static/`;5) 定制错误页面(404、50x)。适用于Web应用部署场景。
757 87
|
6月前
|
C# 图形学 开发者
Unity开发中使用UnityWebRequest从HTTP服务器下载资源。
总之,UnityWebRequest就是游戏开发者手中的万能钓鱼竿,既可以获取文本数据,也能钓上图片资源,甚至是那声音的涟漪。使用UnityWebRequest的时候,你需要精心准备,比如确定URL、配置请求类型和头信息;发起请求;巧妙处理钓获的数据;还需要机智面对网络波澜,处理各种可能出现的错误。按照这样的过程,数据的钓取将会是一次既轻松愉快也效率高效的编程钓鱼之旅。
315 18
|
6月前
|
应用服务中间件 网络安全 数据安全/隐私保护
网关服务器配置指南:实现自动DHCP地址分配、HTTP服务和SSH无密码登录。
哇哈哈,道具都准备好了,咱们的魔术秀就要开始了。现在,你的网关服务器已经魔法满满,自动分配IP,提供网页服务,SSH登录如入无人之境。而整个世界,只会知道效果,不会知道是你在幕后操控一切。这就是真正的数字世界魔法师,随手拈来,手到擒来。
362 14
|
5月前
|
JSON 前端开发 Go
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。
|
5月前
|
Go
如何在Go语言的HTTP请求中设置使用代理服务器
当使用特定的代理时,在某些情况下可能需要认证信息,认证信息可以在代理URL中提供,格式通常是:
407 0
|
8月前
|
Python
使用Python实现multipart/form-data文件接收的http服务器
至此,使用Python实现一个可以接收 'multipart/form-data' 文件的HTTP服务器的步骤就讲解完毕了。希望通过我的讲解,你可以更好地理解其中的逻辑,另外,你也可以尝试在实际项目中运用这方面的知识。
386 69
|
8月前
|
JSON API 数据安全/隐私保护
使用curl命令在服务器上执行HTTP请求
总的来说,curl是一个非常强大的工具,它可以让你在命令行中发送各种类型的HTTP请求。通过学习和实践,你可以掌握这个工具,使你的工作更加高效。
680 30
|
7月前
|
存储 数据库 Python
使用HTTP POST协议将本地压缩数据发送到服务器
总的来说,使用HTTP POST协议将本地压缩数据发送到服务器是一个涉及多个步骤的过程,包括创建压缩文件,设置HTTP客户端,发送POST请求,以及服务器端的处理。虽然这个过程可能看起来复杂,但一旦你理解了每个步骤,就会变得相对简单。
273 19
|
7月前
|
存储 安全 数据安全/隐私保护
HFS-快速创建HTTP服务器
鉴于HFS的操作简便和方便快捷,它在满足快速,临时的文件分享和传输需求上,能够发挥出巨大的作用。只要明确了以上的安全警告,并做好了必需的安全设置,HFS将是一款实用的HTTP服务器工具。
628 9
|
8月前
|
安全 网络安全 定位技术
网络通讯技术:HTTP POST协议用于发送本地压缩数据到服务器的方案。
总的来说,无论你是一名网络开发者,还是普通的IT工作人员,理解并掌握POST方法的运用是非常有价值的。它就像一艘快速,稳定,安全的大船,始终为我们在网络海洋中的冒险提供了可靠的支持。
257 22