`
grzrt
  • 浏览: 188788 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Nagle算法 TCP_NODELAY和TCP_CORK

 
阅读更多

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算 法的主要动机就是我想要紧急发送数据的时候就要发送了,所以对于上面的两个门槛之外还的增加一个门槛就是紧急数据发送。现在可以开始工作了,我们这里主要 给出思路:

  1. 首先我们必须在SOCKET之上再建立一层,来定义我们的自己的传输控制,我们的Nagle算法也是在这层里面实现的。
  2. Disable哪个TCP的Nagle算法,都自己动手写了,要它干吗
  3. 使 用Select函数来查看是否可以发送数据,当然我们实质是否可写的fd_set的时候需要加入我们的三个门槛,首先是按照字节和紧急数据来检查,一般情 况下这两个条件就搞定了,然后再按照时间来决定。我们可是使用一个累积字节记数器和一个等待时间计时器。累积字节记数器在每次添加数据到我们的控制层的时 候就累加一下,发送完毕的时候减去响应的字节数;而计时器在第一次将数据提交给控制层的时候启动(可以使用Windows的GetTickcount来得 到当前的时间),然后在每次发送数据完毕的时候重新复位一下。
  4. 实际上这样就已经实现了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则,每过来一个数据包就直接发送。
分享到:
评论

相关推荐

    tcp/ip协议之 Nagle算法 TCP_NODELAY和TCP_CORK.zip

    在TCP/IP协议中,Nagle算法、TCP_NODELAY和TCP_CORK是用于优化TCP连接传输效率的关键机制,它们对数据传输过程中的各种性能问题提供了针对性的解决方案。 Nagle算法是一种网络数据传输优化算法,它主要用于减少TCP...

    SO_REUSEADDR配置 & TCP_NODELAY1

    SO_REUSEADDR配置和TCP_NODELAY是两种重要的网络协议配置选项,分别用于解决TCP连接中的端口重用和数据传输效率问题。 SO_REUSEADDR配置 在TCP连接中,主机A断开连接时,会发送FIN包给主机B,主机B收到FIN包后,会...

    small_packet_delay.zip_NODELAY_TCP/IP_small package delay

    标题中的"small_packet_delay.zip_NODELAY_TCP/IP_small package delay"提到了TCP/IP协议中的小包延迟问题以及NODELAY选项的影响。在TCP/IP通信中,小包(通常指小于MTU,即最大传输单元的包)的传输可能会面临额外...

    nginx_tcp_proxy_module-master

    7. **Nagle算法控制**:`tcp_nodelay`可以控制是否启用Nagle算法,优化传输效率。 **使用注意事项** - 仔细阅读`readme`文件,了解模块的最新更新、使用限制和配置示例。 - 测试配置前,确保Nginx配置文件没有语法...

    Linux或Windows下判断socket连接状态

    这个函数允许我们获取Socket选项,包括`SOCKET_TCP_NODELAY`、`SOCKET_SNDBUF`、`SOCKET_RCVBUF`等。其中,`TCP_INFO`结构体可以提供更详细的信息,包括连接状态(如ESTABLISHED、CLOSE_WAIT等)。我们可以通过以下...

    Java_TCP_IP_Socket编程(原书第2版)

    10. **套接字选项与网络参数**:Java的Socket类还可以设置套接字选项,如SO_LINGER(控制linger时间)、TCP_NODELAY(禁用Nagle算法)等,以优化网络通信性能。 以上只是Java TCP/IP Socket编程的一些基本概念和...

    socket tcp如何防止多次send的包被合成一个包(粘包)发送.zip

    - 文件"2使用TCP_NODELAY选项,告诉内核尽快将该数据包发送出去.txt"和"2连接进行TCP_NODELAY选项的设置,关闭Nagle算法,这样就会像telnet一样,不管有多少数据会立即发送,没有延迟.txt"提到了这个方法。`TCP_...

    log_tcp_源码

    1. **SOCKET选项**:在编程中,我们可以通过设置socket选项来修改TCP的行为,如TCP_NODELAY(禁用Nagle算法,减少小包延迟)、TCP_QUICKACK(快速确认,提高效率)和TCP_KEEPALIVE(保持连接活动,检测死连接)。...

    Echo-service-using-TCP-sockets-.rar_Keepalive_Linger_SO_KEEPALIV

    Echo service using TCP sockets between two systems with socket options SO_REUSEADDR, SO_KEEPALIVE, TCP_NODELAY and SO_LINGER

    Java_TCP_IP_Socket开发指南

    此外,TCP/IP通信中还会涉及到异常处理、连接超时、套接字选项设置(如TCP_NODELAY禁用Nagle算法)、多线程并发处理等多个复杂问题。开发者在实际项目中需要根据具体需求,灵活运用这些知识进行优化。 总之,"Java_...

    Programming_TCP__in_C++___

    另外,了解TCP的拥塞控制算法(如慢启动、快速重传和快速恢复)和TCP选项(如TCP_NODELAY和TCP_QUICKACK)也是深入理解TCP编程的关键。 总的来说,"Programming TCP in C++ for the Beginner"涵盖了网络编程的基础...

    TCP.zip_DEMO_LINUX TCP _linux 网络通信_linux 网络_linux 网络编程

    7. **套接字选项**:使用`setsockopt()`和`getsockopt()`可以设置和查询套接字的选项,例如TCP_NODELAY(禁用Nagle算法)和SO_REUSEADDR(允许立即重用地址)。 8. **服务器并发模型**:有两种常见的服务器模型:单...

    TCP文件传输_tcp_

    此外,还可以考虑使用Nagle算法来减少网络中的小数据包数量,或者使用TCP_NODELAY选项禁用Nagle算法以实现更快的响应。 8. **安全性**: 考虑到网络安全,可以使用SSL/TLS对TCP连接进行加密,提供安全的文件传输。...

    我提出来的主要有数据交换

    `TCP_NODELAY` 和 `TCP_CORK` 都是针对TCP协议中Nagle算法的配置项,用于控制数据发送行为。 **TCP_NODELAY:** - **作用:** 禁用Nagle算法,使得小的数据包能够立即发送而不是等待累积足够大的数据量再发送。 - *...

    TCP_and_C.zip

    9. **性能优化**:可能会涉及到TCP选项的设置,如TCP_NODELAY(禁用Nagle算法)以减少小包延迟,或者根据实际需求调整TCP缓冲区大小。 10. **安全性**:虽然这个项目没有明确提到,但实际应用中,传输数据的安全性...

    tcp_file_transfer(文件传输)_labviewtcp文件传送_

    7. **优化与安全**:为了提高效率,可以考虑使用TCP的滑动窗口机制来调整发送速率,或者使用TCP_nodelay选项减少延迟。另外,如果需要,可以通过SSL/TLS加密数据,确保文件传输的安全性。 通过LabVIEW实现TCP文件...

    tcp-Nagle算法讲解

    Nagle算法规定,一个tcp链接上最多只能有一个未被确认的小分组。 如果ack响应到达前,tcp暂时收集待发数据,等到响应ack到达后使用一个分组将待发数据发送出去。 Nagle算法启动的条件,...Tcp提供TCP_NODELAY关闭nag

    Lwip之TCP实现.pdf

    - `TCP_NODELAY`: 如果定义,则不延迟发送来合并数据包。 - `TCP_KEEPALIVE`: 定义了keep-alive选项,用于维持空闲连接。 - `TCP_KEEPDEFAULT`: 7200 秒 (2 小时),默认的keep-alive探测发送前的等待时间。 - `...

    TCP-IP Winsock编程要点

    1. **Nagle算法与TCP_NODELAY选项** Nagle算法是一种TCP优化策略,旨在减少网络上的小数据包发送,通过合并多个小的数据段为一个大的数据包,从而减少网络拥塞。然而,这种算法可能会导致小数据包的发送速度变慢,...

    Linux TCP简单聊天程序

    本项目提供了一个简单的TCP聊天程序示例,包括服务器端(tcp_chat_server.c和tcp_chat_server)和客户端(tcp_chat_client.c和tcp_chat_client)。下面我们将详细探讨这个聊天程序涉及的关键知识点。 1. **TCP协议*...

Global site tag (gtag.js) - Google Analytics