在TCP传输数据流中,存在两种类型的TCP报文段,一种包含成块数据(通常是满长度的,携带一个报文段最多容纳的字节数),另一种则包含交互数据(通常只有携带几个字节数据)。

对于成块数据的报文段,TCP采用正常的流程发送即可,因为数据利用率很高。而对于交互数据的报文段,数据利用率就显得很低,在网络环境不好的情况下容易加重网络负担。所以TCP必须对交互数据单独处理

交互数据实际上就是字节数很少的数据,比如客户端调用10次send操作,每次只发送一个字节的数据。

Nagle算法

nagle算法用于处理小报文段(微小分组)的发送问题

nagle算法的核心思想是允许网络中最多只能有一个小分组被发送,而待发送的其它小分组会被重新分组成一个”较大的”小分组,等收到上一个小分组的应答后再发送

nagle算法可以减少网络中微小分组的数量,比如客户端需要依次向服务器发送大小为1,2,3,1,2字节的5个分组

在没有开启nagle算法的情况下,这些小分组会被依次发送(不需要等待上一个小分组的应答,因为没启动nagle),总共发送的报文段(分组)个数为5

当开启nagle算法时,客户端首先发送大小为1字节的第一个分组,随后其它分组到达发送缓冲区,由于上一个分组的应答还没有收到,所以TCP会先缓存新来的这4个小分组,并将其重新分组,组成一个大小为8(2+3+1+2)字节的”较大的”小分组。当第一个小分组的应答收到后,客户端将这个8字节的分组发送。总共发送的报文段(分组)个数为2

可以看到,当传输数据存在大量交互数据时,nagle算法可以有效减少网络中的报文段个数

下面通过wireshark抓包分析nagle算法,客户端服务器的执行流程为

  • 建立连接
  • 客户端将字符串”hello”发送给服务器,但是每次只发送一个字节(即连续调用5次send/write函数)
  • 服务器收到客户端的数据后将其缓存,等到全部收到后将其发回客户端
  • 通过wireshark观察网络中报文段的传输

不知道是操作问题还是客户端服务器处在一个主机上传输速度太快的原因,代码执行了好多次才有个别能体现nagle算法的结果

对图中结果进行分析

  • 1-3行是三次握手
  • 4-5行是发送字节’h’以及服务器的应答
  • 6-7行是发送字节’e’以及服务器的应答
  • 8-9行是发送字节’llo’以及服务器的应答
  • 10行是服务器发送的”hello”报文段
  • 11-14行是四次挥手

可以看到nagle算法确实将待发送的小分组重新分组,等到上一个小分组确认报文到达后一起发送

禁止Nagle

虽然nagle算法可以减少网络中小分组的个数,但是对于那些需要实时预览的通讯程序而言,客户端可能需要不断发送更新数据并得到服务器的响应,这种情况下nagle算法会造成客户端明显的延迟,所以需要禁用nagle算法

将套接字描述符设置TCP_NODELAY选项可以禁止nagle算法

#include <netinet/tcp.h>
...void cancel_nagle(int fd)
{int val = 1;::setsockopt(fd, SOL_TCP, TCP_NODELAY, &val, sizeof(val));
}

还是以上面的程序为例,这回将nagle算法禁止,观察wireshark抓包结果,预计客户端TCP可以连续发送小报文段而不需要等待上一个小报文段的确认

TCP/IP学习笔记(六)Nagle算法相关推荐

  1. 【TCP/IP学习笔记1】 C语言讲解

    TCP/IP学习笔记(一) 一. TCP/IP结构:      TCP/IP是一个四层协议,结构如下:      1.应用层:各种应用程序和协议,如Http.FTP等.      2.传输层:TCP和 ...

  2. TCP/IP学习笔记(一)(转载)

    一.TCP/IP结构:      TCP/IP是一个四层协议,结构如下:      1.应用层:各种应用程序和协议,如Http.FTP等.      2.传输层:TCP和UDP      TCP提供一 ...

  3. Ethernet/IP 学习笔记六

    Ethernet/IP 学习笔记六 EtherNet/IP defines two primary types of communications: explicit and implicit (Ta ...

  4. TCP / IP学习笔记(9)-dns域名系统

    TCP / IP学习笔记(9)-dns域名系统 前面已经提到了访问一台机器要靠IP地址和MAC地址,其中,MAC地址可以通过ARP协议得到,所以这对用户是透明的,但是IP地址就不行,无论如何用户都需要 ...

  5. TCP/IP学习笔记(一)分层模型概述

    简单来说,协议就是不同计算机之间进行通讯所遵循的标准,只有使用相同协议的计算机之间才可以实现网络通讯.这使得即使两台计算机之间的各种设备不同,只要使用的协议相同,就可以通讯 以两个人对话为例,协议可以 ...

  6. TCP IP学习笔记① 互联网通信过程

    文章目录 一.TCP/IP和OSI模型 二.协议分层 2.1 物理层 2.2 数据链路层 2.2.1 以太网协议 2.2.2 MAC地址 2.2.4 广播 2.3 网际层 2.3.1 IP地址     ...

  7. TCP/IP学习笔记(四)TCP超时重传及拥塞控制

    TCP是可靠的传输层协议,但这并不意味着一端发送的数据一定可以到达另一端,因为传输过程中遇到的情况是不可控的,很有可能就有某些数据发生丢失,所以"可靠"其实并不可靠. 不过毕竟现如 ...

  8. TCP/IP学习笔记(3)----IP,ARP,RARP协议

    把这三个协议放到一起学习是因为这三个协议处于同一层(网络层协议),ARP协议用来找到目标主机的Ethernet网卡Mac地址,IP则承载要发送的消息.数据链路层可以从ARP得到数据的传送信息,而从IP ...

  9. TCP/IP学习笔记:TCP/IP协议介绍

    TCP/IP的通讯协议 这部分简要介绍一下TCP/IP的内部结构,为讨论与互联网有关的安全问题打下基础.TCP/IP协议组之所以流行,部分原因是因为它可以用在各种各样的信道和底层协议(例如T1和X.2 ...

最新文章

  1. The working copy is locked due to a previous error.
  2. Struts2与Spring、Hibernate三者整合的过程示例
  3. hadoop伪分布式配置
  4. AUTOCAD建模足球实体
  5. adb命令刷机vivox20_求救VIVO X20的 ROOT可行的方法。
  6. Apizza-流程测试模式
  7. Visio Viewer 打开vsd文件
  8. 魔窗研发副总裁沈哲:移动端SDK的优化之路
  9. 大数据---房地产大数据分析!
  10. ai条码插件免安装_ai cs6条码插件 支持Illustrator cs6的条码生成脚本
  11. mysql索引原理记录
  12. Java解析idToken
  13. 【逗老师带你学IT】PRTG安装教程-部署简单功能强大的监控软件
  14. 深富策略:创业板如期大涨 市场正在酝酿大换挡
  15. 《(数学篇)》 复数运算
  16. 阅读text2sql论文《RAT-SQL: Relation-Aware Schema Encoding and Linking for Text-to-SQL Parsers》
  17. 与一位转行做滴滴司机的前程序员对话引发的思考
  18. echart 正负图
  19. 安装运行Hyperf
  20. linux打开icmp端口,linux – ICMP – 目的地不可达(端口不可达)

热门文章

  1. html+form+multipartform-data,表单 – 如何处理node.js中的multipart / form-data
  2. linux目录所属用户和组,管理用户所属的用户组《 Linux 文件与目录权限 》
  3. mysql load data into_MySQL 之 LOAD DATA INFILE 快速导入数据
  4. 日周月筛选器_举个栗子!Tableau 技巧(147):使用 动态参数 筛选到最新日期值...
  5. mezzanine安装配置
  6. Hadoop_计算框架MapReduce
  7. 用PHP实现丢手帕问题(约瑟夫问题)
  8. 逻辑漏洞-token绕过
  9. Kali下JDK1.8的安装过程
  10. [论文阅读] (11)ACE算法和暗通道先验图像去雾算法(Rizzi | 何恺明老师)