滑动窗口的工作方式

窗口通知: 
发送端维护发送窗口大小(不在包中传输),接收端在ACK中告知接收窗口大小;

发送窗口初始是发送缓冲区大小,接收窗口初始是接收缓冲区大小;缓冲区决定窗口的最大值;

发送窗口一般包括3个部分,从左到右:

  1. 已发送但未收到ACK的数据
  2. 可以立即发送的数据
  3. 空闲空间;

接收窗口就是接收缓冲区还剩多少空间,接收端处理能力越强,从缓冲区提取数据的速度就越快,接收窗口就越大;

发送窗口大小由接收窗口决定,发送端收到ACK后:

  1. 丢弃缓存中对应的数据,左沿向右移动;(收缩)
  2. 根据ACK告知的接收窗口看是否需要移动右沿;已发送未 ACK 的数据 + 可立即发送数据 + 空闲 = 接收窗口;(扩张)

作用:

  1. 提高效率,可以同时发送多个数据;
  2. 流量控制,适配不同处理能力的发送端和接收端

最优窗口大小(即发送/接收缓冲区大小)的计算:

  • 尽量将两端之间的信道填满;
  • 填满时,在信道上传输的数据 = 带宽(数据传输速度) * RTT,两个缓冲区应至少为这个大小

问题1:零窗口

接收端接收缓冲区满时,ACK中接收窗口为0,阻止发送端发送数据。发送方需要在接收方缓冲区空出来时得到通知,因此在发现零窗口后会进行窗口探测,即定时发送含有1字节内容的segment,通过其ACK查询接收方的接收窗口。

问题2:糊涂窗口综合症 (silly window syndrome)

现象:大量的小segment被传输(payload太小),造成网络利用率低下

发送端和接收端都有可能引起这种情况:

  1. 发送端每次只发送少量数据;
  2. 接收端的处理能力不够或应用层没有即时从接收缓冲区中取数据,接收窗口一直很小,发送端只能发小segment。

解决: 
* 发送端: nagle算法 *

  1. 只针对小segment的stop-wait协议,大segment不受影响;
  2. 在前一个 小segment(小于MSS)的ack未到来前,缓存并合并其他要发送的小segment;
  3. 如果ack回来的很快,合并不了多少数据;
  4. ack通常是delayed,会导致数据发送的延时;不适合实时性的应用(可以取消);
  5. 目的是减少segment数目。

* 接收端: * 
在接收端,当接收窗口小于一定阈值(如MSS一半)时,无论是数据确认ACK,还是对窗口探测的回应ACK,都宣告接收窗口为0,阻止发送端发送小报文段。

参考:

tcp内存的使用

高性能网络编程7--tcp连接的内存使用的更多相关文章

  1. 【转】高性能网络编程1----accept建立连接

    最近在部门内做了个高性能网络编程的培训,近日整理了下PPT,欲写成一系列文章从应用角度谈谈它. 编写服务器时,许多程序员习惯于使用高层次的组件.中间件(例如OO(面向对象)层层封装过的开源组件),相比 ...

  2. 高性能网络编程1----accept建立连接

    转 http://taohui.org.cn/tcpperf1.html  陶辉 taohui.org.cn 回到应用层,往往只需要调用类似于accept的API就可以建立TCP连接.建立连接的流程大 ...

  3. 如何在socket编程的Tcp连接中实现心跳协议

    from http://blog.csdn.net/nyist327/article/details/39586203 心跳包的发送,通常有两种技术方法1:应用层自己实现的心跳包 由应用程序自己发送心 ...

  4. 【转】高性能网络编程7--tcp连接的内存使用

    当服务器的并发TCP连接数以十万计时,我们就会对一个TCP连接在操作系统内核上消耗的内存多少感兴趣.socket编程方法提供了SO_SNDBUF.SO_RCVBUF这样的接口来设置连接的读写缓存,li ...

  5. Linux 系统TCP连接内存大小限制 调优

    系统TCP连接内存大小限制 TCP的每一个连接请求,读写都需要占用系统内存资源,可根据系统配置,对TCP连接数,内存大小,限制调优. 查看系统内存资源 记录内存 详情:cat /proc/meminf ...

  6. 高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少

    高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少     阅读(81374) | 评论(9)收藏16 淘帖1 赞3   JackJiang Lv.9    1 年前 | 前言 曾几何时我 ...

  7. 高性能网络编程(一)----accept建立连接

    编写服务器时,许多程序员习惯于使用高层次的组件.中间件(例如OO(面向对象)层层封装过的开源组件),相比于服务器的运行效率而言,他们更关注程序开发的效率,追求更快的完成项目功能点.希望应用代码完全不关 ...

  8. 【原创】高性能网络编程(二):上一个10年,著名的C10K并发连接问题

    1.前言 对于高性能即时通讯技术(或者说互联网编程)比较关注的开发者,对C10K问题(即单机1万个并发连接问题)应该都有所了解."C10K"概念最早由Dan Kegel发布于其个人 ...

  9. 高性能网络编程(1)—accept建立连接‍(转载,作者:陶辉)

    编 写服务器时,许多程序员习惯于使用高层次的组件.中间件(例如OO(面向对象)层层封装过的开源组件),相比于服务器的运行效率而言,他们更关注程序开发 的效率,追求更快的完成项目功能点.希望应用代码完全 ...

  10. Linux下面向TCP连接的C++ Socket编程实例

    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.即Socket提供了操作上述特殊文件的接口,使用这些接口可以实现网络编程. Socket通信流程图 TCP(Transmis ...

随机推荐

  1. Xcode6: CocoaPods 错误 target overrides the `OTHER_LDFLAGS`...

    CocoaPods 错误 target overrides the `OTHER_LDFLAGS`... Xcode 升级到 6.0 后,更新 CocoaPods,出现了如下的警告 [!] The ` ...

  2. 从vboot来看:virtualbox 和 vmware 虚拟化软件环境的兼容性(支持能力)的差距真是挺大的!

    仅仅就支持vboot启动来说:vwmare 完胜!! 熬了一周,(当前最新版本)用virtualbox 5.22 和 6.0 总是无法完成vboot的正常启动功能:不是蓝屏.就是死慢.要不就直接han ...

  3. ASP.NET MVC 4 (五) 视图

    视图引擎与视图 多数情况下控制器action方法返回ViewResult对象,MVC内建action调用器ControllerActionInvoker负责调用控制器action方法并调用视图引擎处理 ...

  4. 【Docker】文件拷贝

    从容器复制到主机sudo docker cp containerID:container_path host_path docker cp 5c6ce895b979:/root/LearnPaddle ...

  5. docker学习网站

    https://yeasy.gitbooks.io/docker_practice/content/compose/install.html docker compose scal 的应用举例 htt ...

  6. Sysfs文件系统接口调试

    首先需要初始化操作: s32 gtp_sysfs_init(void) { s32 ret ; debug_kobj = kobject_create_and_add("gtp", ...

  7. C#自定义Button按钮控件

    C#自定义Button按钮控件 在实际项目开发中经常可以遇到.net自带控件并不一定可以满足需要,因此需要自定义开发一些新的控件,自定义控件的办法也有多种,可以自己绘制线条颜色图形等进行重绘,也可以采 ...

  8. 企业邮箱绑定微信后,如何设置通过本地验证。(Foxmail)

    老的电脑不行了,换了台暗影精灵3plus顶配,需要把相应的资料移动过来. 然后就发现企业邮箱是绑定了微信的,不能再机器上的Foxmail直接登录,这个问题以前解决过结果自己忘记了,重新解决记录下. 解 ...

  9. php中memcached的使用

    文档所在:http://php.net/manual/zh/book.memcached.php 1.在php使用memcached操作之前要实例化memcached: [系统类]  2.添加服务器: ...

  10. [Android实例] Android Studio插件-自动根据布局生成Activity等代码1.4 (开源)(申明:来源于网络)

    [Android实例] Android Studio插件-自动根据布局生成Activity等代码1.4 (开源)(申明:来源于网络) 地址:http://www.eoeandroid.com/thre ...