nagle算法在网络编程的作用
来源:互联网 发布:电商erp软件 编辑:程序博客网 时间:2024/05/11 14:55
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将其禁用 。当然,更合理的方案还是应该使用一次大数据的写操作,而不是多次小数据的写操作。
- nagle算法在网络编程的作用
- 网络编程中Nagle算法和Delayed ACK的测试
- 网络编程中Nagle算法和Delayed ACK的测试
- 网络编程中Nagle算法和Delayed ACK的测试
- 网络编程之nagle算法和TCP_NODELAY
- 网络编程之nagle算法和TCP_NODELAY
- 网络编程之nagle算法和TCP_NODELAY
- 网络编程之nagle算法和TCP_NODELAY
- 网络编程nagle算法和TCP_NODELAY
- 网络--- Nagle算法理解
- 网络编程中Nagle算法和Delayed ACK的测试(转)
- 网络编程(27)—— 再谈Nagle算法
- tcp的Nagle算法
- 网络编程(10)—— 通过设置可选项取消socket的TImeWait状态以及开启Nagle算法
- TCP的Nagle算法介绍
- 网络编程中的Socket详解---Delayed Ack(Ack确认延迟) && Nagle Algorithm(纳格算法)
- 网络编程中的Socket详解---Delayed Ack(Ack确认延迟) && Nagle Algorithm(纳格算法)
- 网络编程中的Socket详解---Delayed Ack(Ack确认延迟) && Nagle Algorithm(纳格算法)
- 由于登陆失败 无法启动服务(MSSQL2000)
- Codeblocks的中文支持
- linux 解压缩命令
- 据传:Google 正在为 Android 创建一个类似于 iOS 的“Game Center”
- codeblocks中Error:new types may not be defined in a return type错误
- nagle算法在网络编程的作用
- vtk库的依赖关系
- Qt Creator 2.2.1 发布,支持 Meego 开发
- perl教程
- itk库依赖关系
- Linux内核模块导出后无法调用问题解决(模块间函数调用通讯)
- ubuntu不识别 android手机问题
- 一个DSP开发者的感受 (经典动力篇)
- eclipse ,cdt setup wxWidgets