TCP DUP ACK

news/2024/5/17 18:50:55 标签: TCP

最近在跟一个CDN服务器端做对接,从CDN服务器下载内容(http),发现抓包出现非常多的Tcp Dup Ac​k异常提示。通过查阅质料得知Tcp Dup Ack xxx#y 代表了数据段丢失TCP状态,xxx代表数据丢失的位置,#后代表第几次丢失文。然后我我又再看了下报文,的确是2次数据发送到我这边,我才回复一次ack,但是这个ack回复是正确的

    对比对接其他地方的CDN的抓包,发现却是1次数据过来,回复一次ack,但是为什么对接这个CDN确实2次回复一个ACK呢?通过详细的对比报文,发现了问题所在。

TCP头部有一个标志位字段:

URG:紧急指针(urgent pointer)有效。

ACK:确认序号有效。

PSH:接收方应该尽快将这个报文段交给应用层。

RST:重建连接。

SYN:发起一个连接。

FIN:释放一个连接。

然而正常HTTP给数据的时候,这个标志位是ACK+PSH,但是这个CDN给数据的时候,却还是ACK,并没有带PSH。

TCP在处理交互数据流(即Interactive Data Flow,区别于Bulk Data Flow,即成块数据流,典型的交互数据流如telnet、rlogin等)时,采用了Delayed Ack机制以及Nagle算法来减少小分组数目

对于非交互应用应该禁止NAGLE算法,设置 TCP_NODELAY,



const char chOpt = 1;

int nErr = setsockopt(pContext->m_Socket, IPPROTO_TCPTCP_NODELAY, &chOpt, sizeof(char));

TCP延时确认时间通常为40毫秒(#define TCP_DELACK_MIN    ((unsigned)(HZ/25)) ),如果在延迟时间内有报文段要发送的话,ack附加到数据报文段一起发送;如果没有,那么当延迟时间到时,就单独发送ACK。

所以,当对方只带ACK而不带PSH的时候,系统认为这个是交互信令,从而延时回复。在第二次数据到来的时候一次性回复了。这个时候如果对方CDN对数据传输回复要求很严格,就会存在对方及时得不到ACK回复的问题。所以就会发送TCP DUP ACK过来了。

解决办法:

通过查阅资料,可以在每次recv到数据后,调用一次setsockopt函数,设置TCP_QUICKACK

setsockopt(fd, IPPROTO_TCP, TCP_QUICKACK, (int*)(1), sizeof(int)); 

TCP_QUICKACK为值为12。

通过这个设置之后,每一个报文都及时回复了ACK。解决了这个TCP DUP ACK问题。


http://www.niftyadmin.cn/n/1313400.html

相关文章

Tomcat4 源代码分析 (15) How Tomcat Works 第十五章

Chapter 15 : Digester 概览 在之前的章节中,我们用Bootstrap类来实例化connector, context, wrappers 以及其他的组件。当把组件注入到父级组件中时,我们使用的是set方法,比如说: connector.setContainer(context); context.setP…

应用程序无法正常启动0xc0150002解决方案

我也遇到过此问题,解决办法: 方案一: 在项目的“属性|配置属性|链接器|常规”中的“启用增量链接”选择“否”。此方法阻断了问题产生的源头,其每次生成exe文件时都直接嵌入清单文件&#xff0c…

学习 Docker 操作系统版本选择

近来有时间一直在捣鼓 Docker。因为服务器选择的是 CentOS 版本,所以实验的环境选择的一直是 CentOS。如果是个人玩 Docker,优先选择 ubuntu。如果需要选择 CentOS 的话,单机的话,可以选择 CentOS 7.0 和 CentOS 7.2 。如果想研究…

TCP 报文-wireshark抓包常见提示含义解析

wireshark抓包常见提示含义解析1.[Packet size limited during capture]当你看到这个提示,说明被标记的那个包没有抓全。以图1的4号包为例,它全长有171字节,但只有前96个字节被抓到了,因此Wireshark给了此提示。图1这种…

双11超级工程—阿里巴巴数据库技术架构演进

每年电商双11大促对阿里技术人都是一次大考,对阿里数据库团队更是如此。经过9年的发展,双11单日交易额从2009年的0.5亿一路攀升到2017年的1682亿,秒级交易创建峰值达到了32.5万笔/秒。支撑这一切业务指标的背后,是底层技术体系的一…

关于wireshark抓包的那点事儿

关于wireshark抓包的那点事儿三次握手172.18.254.177为客户 111.13.2.158为服务端 1、主动打开。发送SYN,协商window size 、TCP MSS seq0 len0 MSS1460 win65535最大窗口大小客户端为syn_sent服务端为syn_recv 2、接收到syn。回复syn ack seq0 ack101 确认自…

最全的Redis集群方案介绍

由于Redis出众的性能,其在众多的移动互联网企业中得到广泛的应用。Redis在3.0版本前只支持单实例模式,虽然现在的服务器内存可以到100GB、200GB的规模,但是单实例模式限制了Redis没法满足业务的需求(例如新浪微博就曾经用Redis存储…

mysql基础2(mysql安装与Navicat安装)

mysql安装流程 1 a:官网下载mysql安装程序 2 b:安装mysql服务端 3 c:安装mysql客户端 4 d:客户端连接服务端 5 e:通过客户端向服务器发送命令,执行对数据库文件的增删改差操作。 Windows版安装 1.下载&…