TCP/UDP的学习总结(三)

xiaoxlm 2018-08-10 原文

TCP/UDP的学习总结(三)

TCP的流量控制

1.利用滑动窗口实现流量控制

所谓流量控制,就是让发送方的发送速率不要太快,要让接收方来得及接收。利用下图来说明如何利用滑动窗口机制进行流量控制:

一开始(connect后),B告诉A: 我的接收窗口rwnd=400,TCP的窗口单位是字节,不是报文段。报文段序号初始值设为1。

接收方B进行来3次流量控制。第一次把窗口减小到rwnd=300,第二次又减到rwnd=100,最后减到rwnd=0,即不允许发送方再发送数据了。这种情况,发送方A暂停发送的状态将持续到B重新发出一个新的窗口值为止。

还应注意到,B向A发送的三个报文段都设置来ACK(报文段头部的确认位)=1,只有ACK=1时,确认号字段才有意义。小写的ack表示确认字段的值=接收到最后一个报文段+1。

考虑一种情况,在上图,B向A发送了零窗口的报文段不久后,B的接收缓存又有了一些空间,于是B发送的rwnd=400的回复确认报文段。然而在传输过程中丢失了,那么A会一直等待B发送非零窗口的通知,B也一直等待A发送数据,这样就形成来一个死锁的局面!

为了解决这个问题,TCP为每一个连接设有一个持续计时器。只要TCP连接的一方(A)收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到了,该方(A)就发送一个零窗口探测报文段(仅携带1字节的数据),而对方(B)就在确认这个探测报文段时给出了现在的窗口值(rwnd=400)。如果窗口仍是零,那么收到这个报文段的一方(A)重新设置持续计时器。如果窗口不是零,死锁的僵局就打破了。

2. 考虑传输效率

上一章节讲到,应用进程把数据传送到TCP的发送缓存后,剩下的发送任务就由TCP来控制了。

TCP用不同的机制来控制TCP报文段的发送时机:

1. 只要缓存中存放的数据等于MSS(最大报文段长度)时,就组装成一个TCP报文段发送出去。

2. 计时器到了,就把当前已有的缓存数据装入报文段,发送出去。

3. 由发送方的应用进程指明要发送的报文段,即TCP支持的push操作。

如何控制TCP发送报文段的时机仍然是一个较为复杂的问题,TCP一般是使用的Nagle算法:

若发送应用进程要把要发数据逐个字节发送到TCP的发送缓存,则TCP发送方就把第一个数据字节发送出去(内核操作), 把后面到达的字节都缓存起来(存在发送缓存中)。当发送方收到对第一个字节确认的报文段后,再把发送缓存中的所有数据组装成一个报文段发送出去,同时继续对随后到达的数据进行缓存。

Nagle算法还规定,当到达的数据已达到发送窗口大小的一半或报文段最大长度时,就立即发送一个报文段!

糊涂窗口综合症(silly window syndrome)

设想一种情况: TCP接收方的缓存已经满了,而交互式的应用进程一次只从接收缓存中读取1个字节(这样接收缓存空间仅腾出1个字节空间),然后发送确认,并把窗口值大小设为1个字节(但发送的数据报是40字节长)。接着发送方又发来1个字节的数据。接收方发回确认,仍然将窗口设置为1个字节。这样下去,网络的效率很低。

解决办法:

1.接收方: 等到接收缓存已经容纳了一个最长的报文段,或者等到接收缓存已有一半空闲的控制。只要有两种情况之一,接收方就发出确认报文.

2.发送方: 发送方不要发送太小的报文段,而是把数据累计成足够大的报文段,或达到接收方缓存的空间的一半大小,再发送数据。

上述两种方法配合使用,可以最大化提升信道利用率

发表于 2018-08-10 14:17 xiaoxlm 阅读() 评论() 编辑 收藏

 

版权声明:本文为xiaoxlm原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/xiaoxlm/p/9454721.html

TCP/UDP的学习总结(三)的更多相关文章

  1. PHP魔术方法(2)

    PHP魔术方(2)1、_ _toString 和 invoke (tostring 和 invoke 两者的触发形式接近。)2、_ _call( ) 用来检测所调用的成员方法是否存在。3、_ _callStatic( )4、_ _get...

  2. php期末总结

    使用php总结(用php开发网站,MVC模式)View层用到的知识点:$arr=array(1,3,45,'zzx'=>'大帅哥','java','php',3244,'31') //数组的建立if($arr!=null){//判断...

  3. 大陆居民身份证、港澳台居民居住证 Composer 包:验证、获取基本信息以及生成假数据

    IdValidator.php 中华人民共和国居民身份证、中华人民共和国港澳居民居住证以及中华人民共和国台湾居 […]...

  4. 【PHP】生成验证码

    <?php/*** @description 生成指定长度的随机字符串* @param int $num 长度* @return string 字符串*/function create_code($num=4){$str = "3456...

  5. PHP系列 | PHP中的stdClass是什么?

    简介stdClass 是 PHP 中的空类,用于将其他类型转换为对象。它类似于 Java 或 Python 对象。 stdClass 不是对象的基类转换为对象如果将一个对象转换成对象,它将不会有任何变化。如果其它任何类型的值被转换成...

  6. 总结一下,php会面试哪些内容 ?

    基础知识1、PHP语言的一大优势是跨平台,什么是跨平台?PHP的运行环境最优搭配为Apache+MySQL+PHP,此运行环境可以在不同操作系统(例如windows、Linux等)上配置,不受操作系统的限制,所以叫跨平台 2、WE...

  7. 为了省钱,我用1天时间把PHP学了!

    作者:小傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!...

  8. PHP版谷歌验证(Google Authenticator)

    什么是谷歌验证?谷歌验证是一种用户登录时需要进行的额外的二次验证以保证更加安全的一种安全手段,它是由手机端生成的一次性验证码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密...

随机推荐

  1. 【原创】Innodb中mysql如何快速删除2T的大表

    小漫画 来,先来看小漫画陶冶一下情操 OK,这里就说了。假设,你有一个表erp,如果你直接进行下面的命令 dr […]...

  2. WCF入门四[WCF的通信模式]

    一、概述   WCF的通信模式有三种:请求/响应模式、单向模式和双工通信。 二、请求/响应模式   请求/响应 […]...

  3. 记一次WMS的系统改造(1)-分析问题

    记一次WMS的系统改造(1)-分析问题 海外落地中的困境 目前面临主要的问题是“人”,仓储系统主要辅助仓储人 […]...

  4. MySQL备份还原

    mysql备份还原 1.1 备份恢复-说明 运维工作的核心简单概括就两件事: 第一个:是保护公司的数据. 第二 […]...

  5. 【数字图像处理】图像边缘锐化之梯度锐化

      关于具体在实际场景的使用和图像会慢慢更新。 梯度锐化方法 图像平滑往往使图像中的边界、轮廓变得模糊,为了减 […]...

  6. Ubuntu中设置中英文输入法切换快捷键 – ZhangZhihuiAAA

    Ubuntu中设置中英文输入法切换快捷键 posted on 2020-04-29 10:05  ZhangZ […]...

  7. Linux学习篇(一):Linux从零开始

    一:安装系统  先安装一个 Ubuntu(乌班图)/ Deepin(深度)/ Ukylin(优麒麟) 的桌面版 […]...

  8. 通信编程的几种类型

    一、分类 1、网络通信;七层模型+网络协议 2、进程间通信; 3、平台间通信 4、模块间通信 5、组件间通信 […]...

展开目录

目录导航