博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]TCP滑动窗口详解
阅读量:6337 次
发布时间:2019-06-22

本文共 1720 字,大约阅读时间需要 5 分钟。

TCP滑动窗口详解  
http://lyjdamzwf.blog.163.com/blog/static/75206837201193373226/
TCP滑动窗口(Sliding Window

 

滑动窗口协议可以用图四来形象表示。

TCP滑动窗口详解 - Zark - Fighter Power

 

 图中我们已经将字节进行了111的编号。由接收者通告的窗口称为提议窗口(offered window),它覆盖了第4到第9个字节,意味着接收方已经确认了第3字节之前(包括第3字节)的数据,并且通告窗口的大小是6。窗口大小与确认的顺序号(acknowledged sequence number)有关。发送者计算它的可用窗口(usable window),用以度量它可以立即发送多少数据。

随着接收者对收到数据的确认,滑动窗口随时向右移动。窗口两端的相关运动增加或减少着窗口大小。我们使用3个术语来描述窗口边缘(edge)的左右运动。

1.              当窗口左边缘靠近右边缘时称窗口闭合(window closes)。窗口闭合发生在数据已经发送并被确认的情况下。

2.              当窗口右边缘向右移动时称窗口打开(window opens)。窗口打开发生在另一端的接收进程读取已确认数据的时候,它释放了TCP接收缓冲区的空间。

3.              当窗口右边缘向左移动时称窗口收缩(window shrinks)。Host Requirement RFC强烈不鼓励这种做法,但TCP必须能够在一端发生这种情况时进行处理。

 

     图五表示了这三个术语。由于窗口的左边缘是受从连接另一端收到的确认号来控制的,因此它不会向左移动。如果收到一个ACK要求将左边缘向左移动,那么它是一个重复的(duplicate)的确认,并被丢弃。

TCP滑动窗口详解 - Zark - Fighter Power

 

如果窗口左边缘重合了右边缘,就称它为零窗口(zero window)。它将停止发送者传输任何数据。

示例

图六显示了图一数据传输中TCP滑动窗口的动态变化

TCP滑动窗口详解 - Zark - Fighter Power

 

 以此图为例,我们可以总结几个要点:

1.  发送者不必传送满窗口大小的数据。

2.  收到接收者对数据的确认后,窗口向右滑动。这是由于窗口大小与确认顺序号相关。

3.  从段7到段8的变化,可以看出窗口可以减小,但窗口右边缘不能向左移动。

4.  接收者不必等待窗口被填满才发送确认。在许多实现中,接收者每收到两个段发送一个确认。

 

 

TCP滑动窗口和socket缓冲区之间的关系 

一、TCP的滑动窗口大小实际上就是socket的接收缓冲区大小的字节数

 

二、对于server端的socket一定要在listen之前设置缓冲区大小,因为,accept时新产生的socket会继承监听socket的缓冲区大小。对于client端的socket一定要在connet之前设置缓冲区大小,因为connet时需要进行三次握手过程,会通知对方自己的窗口大小。在connet之后再设置缓冲区,已经没有什么意义。

 

三、由于缓冲区大小在TCP头部只有16位来表示,所以它的最大值是65536,但是对于一些情况来说需要使用更大的滑动窗口,这时候就要使用扩展的滑动窗口,如光纤高速通信网络,或者是卫星长连接网络,需要窗口尽可能的大。这时会使用扩展的32位的滑动窗口大小。

 

四、滑动窗口移动规则:

1、窗口合拢:在收到对端数据后,自己确认了数据的正确性,这些数据会被存储到缓冲区,等待应用程序获取。但这时候因为已经确认了数据的正确性,需要向对方发送确认响应ACK,又因为这些数据还没有被应用进程取走,这时候便需要进行窗口合拢,缓冲区的窗口左边缘向右滑动。注意响应的ACK序号是对方发送数据包的序号,一个对方发送的序号,可能因为窗口张开会被响应(ACK)多次。

2、窗口张开:窗口收缩后,应用进程一旦从缓冲区中取出数据,TCP的滑动窗口需要进行扩张,这时候窗口的右边缘向右扩张,实际上窗口这是一个环形缓冲区,窗口的右边缘扩张会使用原来被应用进程取走内容的缓冲区。在窗口进行扩张后,需要使用ACK通知对端,这时候ACK的序号依然是上次确认收到包的序号。

3、窗口收缩,窗口的右边缘向左滑动,称为窗口收缩,Host Requirement RFC强烈建议不要这样做,但TCP必须能够在某一端产生这种情况时进行处理。

 

转载地址:http://vexoa.baihongyu.com/

你可能感兴趣的文章
音频视频组件Audio DJ Studio for .NET更新至v10.0.0.0丨附下载
查看>>
线上问题处理(一)
查看>>
在Centos7 系统中使用supermin制作CentOS6 的Docker镜像
查看>>
select2和bootstrap模态框使用时出现的bug以及解决方案
查看>>
EOS cleos 链接节点命令
查看>>
4.39-Nginx日志不记录静态文件
查看>>
写出企业要求的 Python 代码风格
查看>>
OSChina 周四乱弹 —— 如何正确地请客吃饭
查看>>
OSChina 周三乱弹 ——所有的酒,都不如你
查看>>
Pig的输入输出及foreach,group关系操作
查看>>
TechParty - Code For Public - sz
查看>>
emacs 前端插件推荐[emmet-mode]
查看>>
dnsmasq配置文件
查看>>
Unity链接SqlServer数据库并进行简单的数据查询
查看>>
23种设计模式
查看>>
原生javascript学习:用循环改变div颜色
查看>>
ABBYY FineReader 12内置的自动化任务
查看>>
ab 测试 和 apache 修改 并发数 mpm
查看>>
Nginx 的软件负载均衡详解
查看>>
TIMED OUT WAITING FOR OHASD MONITOR
查看>>