Nagle算法
根据创建者John
Nagle命名。该算法用于对缓冲区内的一定数量的消息进行自动连接。该处理过程(称为Nagling),通过减少必须发送的封包的数量,提高了网络应用
程序系统的效率。Nagle算法,由Ford Aerospace And Communications Corporation
Congestion Control in IP/TCP internetworks(IETF RFC
896)(1984)定义,最初是用于缓冲Ford的私有TCP/IP网络拥塞情况,不过被广泛传播开来。
Nagle的文档定义了一种他称之为小封包问题的解决方法。当某个应用程序每次只产生一字节的数据,就会导致网络由于这样的小封包而过载(该情况通
常被称为“发送端SB窗口并发症”),从而产生该问题。一个源自键盘的单一字符-1字节的数据-可能导致一个41字节的封包被传送,该封包包含了1字节的
有用数据和40字节的头部数据。这种4000%过载的情况,在像APRANET这样只有很轻负载的网络中是可以接受的,但在像Ford这样的负载很重的网
络中,可能强制重传,导致封包丢失,并且通过过度拥挤交换节点和网关降低了传播速度。更进一步,当连接被丢弃时,吞吐量可能被降低。Nagle算法-通常
的实现方法是在一个TCP程序中插入两行代码-在发送方,对标识为没有回应的数据进行缓冲(存储)(这句怪怪的,其实应该是对未发送数据按顺序进行缓冲,在发送时进行拼接)。顺序发送的数据将被保持到接收到被标识数据的回应或者一整包有价值的数据需要被发送。
虽然Nagle算法用于解决Ford网络内产生的问题,但同样的问题也出现在APRANet。通过网络,Nagling被广泛实现,包括
internet,并且产生了巨大的效用-虽然某些时候在高交互性环境如一些C/S情况下不希望进行该处理。在这种情况下,可以通过
TCP_NODELAY套接字选项关闭Nagling。
注:Nagle虽然解决了小封包问题,但也导致了较高的不可预测的延迟,同时降低了吞吐量。
实际上这就的你动手来自己实现以下Nagle算法了。实际上Nagle算法并不是很复杂,他的主要职责是数据的累积,实际上有两个门槛:一个就是缓
冲区中的字节数达到了一定量,另一个就是等待了一定的时间(一般的Nagle算法都是等待200ms);这两个门槛的任何一个达到都必须发送数据了。一般
情况下,如果数据流量很大,第二个条件是永远不会起作用的,但当发送小的数据包时,第二个门槛就发挥作用了,防止数据被无限的缓存在缓冲区不是好事情哦。
了解了TCP的Nagle算法的原理之后我们可以自己动手来实现一个类似的算法了,在动手之前我们还要记住一个重要的事情,也是我们动手实现Nagle算
法的主要动机就是我想要紧急发送数据的时候就要发送了,所以对于上面的两个门槛之外还的增加一个门槛就是紧急数据发送。现在可以开始工作了,我们这里主要
给出思路:
- 首先我们必须在SOCKET之上再建立一层,来定义我们的自己的传输控制,我们的Nagle算法也是在这层里面实现的。
- Disable哪个TCP的Nagle算法,都自己动手写了,要它干吗
- 使
用Select函数来查看是否可以发送数据,当然我们实质是否可写的fd_set的时候需要加入我们的三个门槛,首先是按照字节和紧急数据来检查,一般情
况下这两个条件就搞定了,然后再按照时间来决定。我们可是使用一个累积字节记数器和一个等待时间计时器。累积字节记数器在每次添加数据到我们的控制层的时
候就累加一下,发送完毕的时候减去响应的字节数;而计时器在第一次将数据提交给控制层的时候启动(可以使用Windows的GetTickcount来得
到当前的时间),然后在每次发送数据完毕的时候重新复位一下。
- 实际上这样就已经实现了Nagle算法,而且不需要经常调用GetTickCount而降低了系统的性能。
TCP_CORK
TCP链接的过程中,默认开启Nagle算法,进行小包发送的优化。优化网络传输,兼顾网络延时和网络拥塞。这个时候可以置位TCP_NODELAY关闭
Nagle算法,有数据包的话直接发送保证网络时效性。在进行大量数据发送的时候可以置位TCP_CORK关闭Nagle算法保证网络利用性。尽可能的进
行数据的组包,以最大mtu传输,如果发送的数据包大小过小则如果在0.6~0.8S范围内都没能组装成一个MTU时,直接发送。如果发送的数据包大小足
够间隔在0.45内时,每次组装一个MTU进行发送。如果间隔大于0.4~0.8S则,每过来一个数据包就直接发送。
分享到:
相关推荐
Nagle算法 TCP_NODELAY和TCP_CORK.zip
SO_REUSEADDR配置 & TCP_NODELAY1
NODELAY如何影响小包延时, 如何增加小包传输的实时性
Nagle算法规定,一个tcp链接上最多只能有一个未被确认的小分组。 如果ack响应到达前,tcp暂时收集待发数据,等到响应ack到达后使用一个分组将待发数据发送出去。 Nagle算法启动的条件,...Tcp提供TCP_NODELAY关闭nag
Echo service using TCP sockets between two systems with socket options SO_REUSEADDR, SO_KEEPALIVE, TCP_NODELAY and SO_LINGER
client_body_timeout 3m; send_timeout 3m; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65;
ffmpeg win版,用于测试rtmp
tcp_nodelay 超时 解析器 resolver_timeout 允许 否定 访问日志 方向对齐 client_body_buffer_size lua_code_cache lua_package_path lua_package_cpath process_by_lua process_by_lua_file lua_socket_...
#设定mime类型,类型由mime.type文件定义 ... tcp_nodelay on; #开启gzip压缩 gzip on; gzip_disable "MSIE [1-6]."; #设定请求缓冲 client_header_buffer_size 128k; large_client_header_buffers 4 128k;
* TCP_NODELAY set * Connected to localhost (127.0.0.1) port 8000 (#0) > GET / HTTP/1.1 > Host: localhost:8000 > User-Agent: curl/7.61.0 > Accept: */* , 14 Nov 2023 14:35:10 GMT Hello, Falcon!
## Wakanda软件包管理器## 要查看简单的演示,请点击此链接 ###预安装Linux(作业系统... tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; # server_tokens off; # server_names_hash_bucket_size 64
tcp_nodelay on; } } 【注】 1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载使用体验! 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等...
LwIP协议栈源码详解LwIP协议栈源码详解
TcpNoDelayMod 我的世界1.7.2、1.7.10和1.8的伪造mod,将TCP_NODELAY设置为true,而不是常规的false。 这样可以减少游戏延迟,并提供更流畅的游戏体验。 在1.8.1及更高版本中不需要此mod,因为minecraft已经进行了...
然后为这个 socket 设置 TCP_NODELAY 属性,禁用 Nagle 算法 然后创建一个可读的文件事件用于监听这个客户端 socket 的数据发送 最大连接数 在 Redis2.4 中,最大连接数是被直接硬编码在代码里面的,而在2.6版本中...
proxy-istio-demo ...* TCP_NODELAY set * Connected to localhost (::1) port 8888 (#0) > GET / HTTP/1.1 > Host: localhost:8888 > User-Agent: curl/7.64.1 > Accept: */* > < HTTP>: java < respon
默认启用TCP_NODELAY 无障碍 用法 npm i fetch-enhanced node-fetch const nodeFetch = require ( "node-fetch" ) ; const fetch = require ( "fetch-enhanced" ) ( nodeFetch ) ; await fetch ( ...
* TCP_NODELAY set * Connected to localhost (127.0.0.1) port 8000 ( # 0) > GET / ? url=https://marcusnoble.co.uk/ HTTP/1.1 > Host: localhost:8000 > User-Agent: curl/7.64.1 > Accept: * / * > < ...
警告:正在进行中入门启动zuul服务器./src/test/java/rocks/devmesh/spring/cloud/zuul/Application#main请求到'/ healthcheck'端点$ curl http://localhost:7001/healthcheck -v* Trying ::1...* TCP_NODELAY set*...
客户端设置套接字选项TCP_NODELAY=true以防止写入小消息时出现多毫秒延迟。 对 1.4.0 的更改 SDK 支持 StreamManager 客户端。 对 1.3.1 的更改 改进的日志级别粒度。 对 1.3.0 的更改 SDK 支持 SecretsMa