TCP连接中启用和禁用TCP_NODELAY有什么影响?
TCP/IP协议中针对TCP默认开启了Nagle算法。Nagle算法通过减少需要传输的数据包,来优化网络。在内核实现中,数据包的发送和接受会先做缓存,分别对应于写缓存和读缓存。
启动TCP_NODELAY,就意味着禁用了Nagle算法,允许小包的发送。对于延时敏感型,同时数据传输量比较小的应用,开启TCP_NODELAY选项无疑是一个正确的选择。比如,对于SSH会话,用户在远程敲击键盘发出指令的速度相对于网络带宽能力来说,绝对不是在一个量级上的,所以数据传输非常少;而又要求用户的输入能够及时获得返回,有较低的延时。如果开启了Nagle算法,就很可能出现频繁的延时,导致用户体验极差。当然,你也可以选择在应用层进行buffer,比如使用java中的buffered stream,尽可能地将大包写入到内核的写缓存进行发送;vectored I/O(writev接口)也是个不错的选择。
对于关闭TCP_NODELAY,则是应用了Nagle算法。数据只有在写缓存中累积到一定量之后,才会被发送出去,这样明显提高了网络利用率(实际传输数据payload与协议头的比例大大提高)。但是这又不可避免地增加了延时;与TCP delayed ack这个特性结合,这个问题会更加显著,延时基本在40ms左右。当然这个问题只有在连续进行两次写操作的时候,才会暴露出来。
连续进行多次对小数据包的写操作,然后进行读操作,本身就不是一个好的网络编程模式;在应用层就应该进行优化。
对于既要求低延时,又有大量小数据传输,还同时想提高网络利用率的应用,大概只能用UDP自己在应用层来实现可靠性保证了。好像企鹅家就是这么干的。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。(一个连接会设置MSS参数,因此,TCP/IP希望每次都能够以MSS尺寸的数据块来发送数据)。
Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。
Nagle算法的基本定义是任意时刻,最多只能有一个未被确认的小段。 所谓“小段”,指的是小于MSS尺寸的数据块,所谓“未被确认”,是指一个数据块发送出去后,没有收到对方发送的ACK确认该数据已收到。
举个例子,比如之前的blog中的实验,一开始client端调用socket的write操作将一个int型数据(称为A块)写入到网络中,由于此时连接是空闲的(也就是说还没有未被确认的小段),因此这个int型数据会被马上发送到server端,接着,client端又调用write操作写入‘/r/n’(简称B块),这个时候,A块的ACK没有返回,所以可以认为已经存在了一个未被确认的小段,所以B块没有立即被发送,一直等待A块的ACK收到(大概40ms之后),B块才被发送。整个过程如图所示:
这里还隐藏了一个问题,就是A块数据的ACK为什么40ms之后才收到?这是因为TCP/IP中不仅仅有nagle算法,还有一个ACK延迟机制 。当Server端收到数据之后,它并不会马上向client端发送ACK,而是会将ACK的发送延迟一段时间(假设为t),它希望在t时间内server端会向client端发送应答数据,这样ACK就能够和应答数据一起发送,就像是应答数据捎带着ACK过去。在我之前的时间中,t大概就是40ms。这就解释了为什么'/r/n'(B块)总是在A块之后40ms才发出。
如果你觉着nagle算法太捣乱了,那么可以通过设置TCP_NODELAY将其禁用 。当然,更合理的方案还是应该使用一次大数据的写操作,而不是多次小数据的写操作。
TCP连接中启用和禁用TCP_NODELAY有什么影响?相关推荐
- 禁用服务器网络协议怎么设置,如何在Windows操作系统中启用和禁用DHCP?
原标题:如何在Windows操作系统中启用和禁用DHCP? 无论在公共场所还是家中,WiFi可以为您的计算机提供网络连接.我们出行或者参加会议时需要携带计算机.计算机操作系统具有可操作的DHCP,让大 ...
- 禁用计算机服务LanmanServer,[如何]在Windows 10中启用或禁用SMB协议 | MOS86
服务器消息块(SMB)协议基本上是Windows中存在的文件共享协议.它允许应用程序读取/写入文件,并敦促服务器管理器为网络连接的计算机提供服务请求.此协议有三个版本,SMB版本1(SMBv1),SM ...
- TCP连接中time_wait在开发中的影响-搜人以鱼不如授之以渔
根据TCP协议定义的3次握手断开连接规定,发起socket主动关闭的一方socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),T ...
- Linux数据链路tcp失败,TCP连接中的异常断开情况处理
1.TCP连接中可能出现的异常断开情况 假设存在这样一种情况:在两个不同的主机Machine1.Machine2系统上分别运行两个应用程序Application1.Application2,在Appl ...
- TCP连接中TIME_WAIT连接过多
2019独角兽企业重金招聘Python工程师标准>>> TCP连接中TIME_WAIT连接过多 转载于:https://my.oschina.net/meowmeow/blog/36 ...
- 几种TCP连接中出现RST的情况
UNIX网络编程上说:产生RST的三个条件是:目的地为某端口的SYN到达,然而在该端口上并没有正在监听 的服务器:TCP想取消一个已有链接:TCP接收到一个根本不存在的连接上的分节. 几种TCP连接中 ...
- 【网络通信与信息安全】之深入解析TCP连接中如何确定客户端的端口号
一.前言 在 TCP 连接中,客户端在发起连接请求前会先确定一个客户端的端口,然后用这个端口去和服务器端进行握手建立连接.那么在 Linux 上,客户端的端口到底是如何被确定下来的呢? 事实上,我们平 ...
- 网络基础2-3(TCP协议,三次握手,四次挥手,TIME_WAIT状态的作用,TCP如何保证可靠传输,TCP连接中状态转化,滑动窗口,流量控制,快速重传,拥塞窗口,延迟应答,捎带应答,粘包问题)
TCP协议 TCP协议概念 TCP全称为 "传输控制协议(Transmission Control Protocol"). 人如其名, 要对数据的传输进行一个详细的控制 TCP协议 ...
- gitlab项目中启用或禁用 GitLab CI/CD Pipeline
默认情况下,GitLab CI/CD 在新安装上会默认启用,要关闭的话,有两种方式: 需要在每个项目下单独关闭. 通过修改源安装和 Omnibus 安装中的设置.(未验证) 1.每个项目单独关闭 要在 ...
最新文章
- Python算术运算符及用法详解
- java什么是函数式编程,Java 函数式编程(一)初识篇
- 报错引发的版本对应——tensorflow+keras+python版本对应(全)
- 在Linux下常用的命令
- chmod g+s 、chmod o+t 、chmod u+s
- java减治法深度优先查找_排序|减治法实现排序
- python numpy遍历_NumPy 迭代数组
- 分布式、集群的概念、区别
- 微软智能语音多情感技术升级,晓晓中文语音突破14种风格
- iframe关闭当前窗口_iframe 、 a标签、input标签
- Qt学习之路系列教程目录
- 在计算机系统中 cpu指什么地方,在计算机中cpu指的是什么
- 电子工程师是怎样的成长之路?
- Teams App 资源中心种草指南
- 医咖会stata 笔记(自己能看懂版
- 休闲平台,何去何从?(1)
- mysql 季度统计_mysql 按年度、季度、月度、周、日SQL统计查询
- 问题:vscode 中用matplotlib 绘图时无法弹窗,不显示图像
- thinkphp phpmailer发送邮件
- 微信分享点击回到原APP却仍然留在微信的问题
热门文章
- 《炬丰科技-半导体工艺》硅片超精密清洗干燥技术
- shell常用正则表达式
- 2016.9.14小程序---多态练习2
- H.266的目前探索的情况
- tesseract ocr训练样本库以及样本库使用
- 【设计模式】模板设计模式与适配器设计模式
- 计算机体系结构——流水线技术
- mysql like escape_mysql like语句用法详解 含通配符使用方法
- Motion Guided Attention for Video Salient Object Detection论文详读
- 荣耀s20能不能升级鸿蒙系统,华为Mate40概念机:2K满溢屏+麒麟1020+鸿蒙OS系统 三星S20遭挑战...