网络编程实战
盛延敏
前大众点评云平台首席架构师
44207 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 40 讲
网络编程实战
15
15
1.0x
00:00/00:00
登录|注册

13 | 小数据包应对之策:理解TCP协议中的动态数据传输

使用writev函数
关闭Nagle算法的影响
延时ACK
交互式场景
糊涂窗口综合症
拥塞窗口的调整
多个连接共享带宽的控制
TCP的生产者-消费者模型
发送窗口和接收窗口
数据被发送到网络的时机
数据发送接口调用
最新的TCP拥塞控制算法研究
Linux下一次性最多允许数组的大小
将写操作合并
禁用Nagle算法
有趣的场景
拥塞控制和数据传输
流量控制和生产者-消费者模型
数据流的发送和接收
TCP Keep-Alive机制
思考题
TCP协议中的动态数据传输

该思维导图由 AI 生成,仅供参考

你好,我是盛延敏,这里是网络编程实战第 13 讲,欢迎回来。
在上一篇文章里,我在应用程序中模拟了 TCP Keep-Alive 机制,完成 TCP 心跳检测,达到发现不活跃连接的目的。在这一讲里,我们将从 TCP 角度看待数据流的发送和接收。
如果你学过计算机网络的话,那么对于发送窗口、接收窗口、拥塞窗口等名词肯定不会陌生,它们各自解决的是什么问题,又是如何解决的?在今天的文章里,我希望能从一个更加通俗易懂的角度进行剖析。

调用数据发送接口以后……

在前面的内容中,我们已经熟悉如何通过套接字发送数据,比如使用 write 或者 send 方法来进行数据流的发送。
我们已经知道,调用这些接口并不意味着数据被真正发送到网络上,其实,这些数据只是从应用程序中被拷贝到了系统内核的套接字缓冲区中,或者说是发送缓冲区中,等待协议栈的处理。至于这些数据是什么时候被发送出去的,对应用程序来说,是无法预知的。对这件事情真正负责的,是运行于操作系统内核的 TCP 协议栈实现模块。

流量控制和生产者 - 消费者模型

我们可以把理想中的 TCP 协议可以想象成一队运输货物的货车,运送的货物就是 TCP 数据包,这些货车将数据包从发送端运送到接收端,就这样不断周而复始。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

TCP协议中的动态数据传输涉及发送窗口、接收窗口和拥塞窗口等概念,构成了TCP的生产者-消费者模型,确保数据传输的协同速率。文章还探讨了Nagle算法和延时ACK机制的组合,以及如何通过禁用Nagle算法和合并写操作来优化数据传输。通过对TCP流量控制的生产者-消费者模型的讲解,强调了发送窗口和阻塞窗口的重要性,以及小数据包对网络带宽的影响。最后,提出了两个思考题,引发读者对TCP拥塞控制算法的进一步思考。 总的来说,本文深入探讨了TCP协议的复杂性和需要考虑的多方面因素,以及如何有效利用网络带宽。同时,通过具体的例子和代码演示,使读者更容易理解TCP协议中的关键概念和优化方法。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《网络编程实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(30)

  • 最新
  • 精选
  • 张立华
    非阻塞socket,对于write和send, 返回实际发送的字节数。所以一般在while里不断发送,直到全部发送完毕。 send根据只要根据要发送的buf做个偏移,很方便。 而writev 就很繁琐了啊

    作者回复: 你说的不错,一般我们只在合并缓冲区的时候才需要,绝大多数都是使用write和send 。

    2019-08-30
    23
  • Donkey
    请教老师一个愚钝问题:大数据循环发送时,那接收方怎么接收才能接收完整的包?不会发生粘包等现象呢?

    作者回复: 我觉得这个问题不愚钝。 每个包都有一个序列号,通过序列号按顺序就可以还原这个数据流;这个数据流本身也有例如checksum,序号大小等数据,这个数据流所有序列号的包都收到了,就可以完成数据流的拼装了。 解决粘包问题的关键是区分出数据的边界,我在第16降:如何理解TCP的“流”里讲到了这部分内容,你可以参考一下。

    2019-09-18
    5
    18
  • 许童童
    TCP 拥塞控制算法,我知道最新的有BBR算法,这个算法在网络包填满路由器缓冲区之前就触发流量控制,而不在丢包后才触发,有效的降低了延迟。

    作者回复: 嗯,我也是刚知道这个算法。

    2019-08-30
    4
    12
  • 一凡
    telnet是使用Nagle 算法的吗,但是远程操作是实时性的呀?额

    作者回复: 默认是使用的,批量发送小数据包在系统层面显然是得到充分的优化的,并不是我们想象中的经过很长时间之后才会发送出来,在telnet操作下,这个时间对操作人员是无感的。

    2020-04-13
    2
    9
  • mgxian
    问题1 : grep 'IOV_MAX' /usr/include/limits.h

    作者回复: 赞

    2019-09-18
    4
    7
  • 衬衫的价格是19美元
    拥塞控制算法的话,应该是bbr吧,已经被合入linux  4.9内核了。与传统的reno, cubic等策略相比,最大的不同是,bbr不会因为链路噪声而执行乘性减窗,导致延迟过大。实际上,目前gwf的随机丢包的策略也是链路噪声。

    作者回复: Google出品,名声不小。

    2019-10-04
    6
  • 不动声色满心澎湃
    writev是减少write的使用次数吧。一次writev中的数据也有可能分多个包发出去。我说的对吗老师

    作者回复: 当然,我们决定不了发包的次数。只不过合并写的方式,让操作系统可以一次性发送出去的几率更大。

    2019-08-31
    6
  • D
    就拥塞控制算法这块,记得前一阵阿里发布一个HPCC算法,盛老师点评一下?谢谢

    作者回复: 哈哈,研究性质的算法,应该还不错吧,不知道什么时候可以实际使用

    2019-08-30
    6
  • LDxy
    下载软件通常使用多线程建立多个TCP连接来下载一个大文件,是不是也是为了尽量避免TCP拥塞控制带来的影响,从而充分利用带宽?因为从实际使用来看,下载软件一旦跑满带宽,其他软件基本是是抢不过它的

    作者回复: 这是为了加速下载的时间,说白了就是抢带宽。

    2019-08-30
    4
  • 问题一:Linux中最多允许1024个元素 请教一个问题,tcp中有各种窗口,很头晕,比如,发送窗口,接收窗口,通告窗口(Advertised window),滑动窗口,拥塞窗口。为什么要弄这么多窗口呢?都是为了做流量控制吗?如何去理解呢?

    作者回复: 发送窗口和接收窗口都是通过滑动窗口机制来实现的,这是为了流量控制而引入的概念;而拥塞窗口则是为了拥塞控制而引入的概念。

    2019-08-30
    3
    3
收起评论
显示
设置
留言
30
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部