tcp/ip学习笔记--第22章 TCP persist timer
来源:互联网 发布:程序怎样烧进单片机 编辑:程序博客网 时间:2024/05/21 20:25
简介
TCP的接收方通过发送通告窗口大小来控制字节流的传输。如果发送的窗口大小为0,那么发送方将停止发送数据,等待接收方发送更新窗口的报文。
但是,如果接收方发送的更新窗口的报文丢了会发生什么呢?这个时候双方都会进入无限的等待状态:发送方等待更新窗口的报文,接收方等待发送方发送数据。
为了解决这个问题,增加了一个坚持定时器:当通告窗口变为0之后,就周期性的发送窗口探查报文,接收方接收到窗口探查报文后再次通告窗口大小。
窗口探查报文只包含一个字节的数据,而且这个字节的数据就是下一个要发送的数据。那么如果没有要发送的数据,又该发送什么呢?书上没有提及,也没有找到相关的资料,猜测是发送一个没有数据的报文吧。(** 这个标记表示此处有疑问,方便以后全文搜索)
窗口探测报文发送的时间间隔也遵守指数避让。即1.5,3,6,12,24,48,60,60......
但是由于TCP坚持定时器要求区间在5-60之间,所以变成了:5,5,6,12,24,48,60,60......
糊涂窗口综合症
表现为不断的发送长度很小的报文段,而不是最大长度的报文段。
发送方和接收方都可能导致这个问题:发送方发送小块的数据,而不是等数据积累到一定的长度再发送。接收方通告大小很小的窗口,而不是等窗口增加到一定大小再通告。
发送方和接收方都执行一些措施来避免这种情况的发生。(书上这一段写的有点晦涩,我试着写得更有条理一些)
接收方:不能通告太小的窗口。必须满足以下条件之一:1.窗口大小超过一个完整的报文段,2.窗口的大小超过缓冲区的一半。
发送方:实施nagle算法。
之前有介绍过nagle算法,算法内容如下:发送方只能有一个已经发送的,而未被确认的小报文段。当收到已发送的小报文段的ack确认时,才能再发送小段文段。当然值得注意的是ack确认不受此限制,而且ack确认可以携带数据。
那么问题来了,多小的报文算小呢?跟对接收方的限制一样,必须满足以下条件之一:1.窗口大小超过一个完整的报文段,2.窗口的大小超过接收方曾经广播过的最大的窗口大小(那不就是接收方缓冲区大小嘛)的一半。
当然,发送方可以选择关闭nagle算法,关闭了这个算法,想发多大的数据就发多大的数据。
其他知识点
1.尽管发送发和接收方都采取了措施来避免,但是还是会出现接收方通告小窗口的情况,这是因为:
比如说接收方B通告了一个大小为1500的窗口,但是发送方A只发送了1024个字节,如果这时候A通告一个大小为0的窗口,那么发送方的滑动窗口就会收缩(shrink),这是不被允许的,所以只能发送通告窗口大小为476的报文。
2.书上p329最后一段提到,接收方在接收到报文13(通告窗口大小为509)后,并没有立即发送数据,而是进行了一个坚持定时器溢出周期的等待(5s),然而奇怪的是nagle算法并没有这个限制,因为此时并没有任何未被确认的数据。不知道是什么规则施加的这个限制。
为什么不简单的让接收方重新发送更新窗口报文呢?
- tcp/ip学习笔记--第22章 TCP persist timer
- tcp/ip学习笔记--第23章 TCP keepalive Timer
- TCP-IP详解卷1-22:TCP的坚持定时器(persist timer )
- TCP持续定时器(TCP Persist Timer)
- 《TCP/IP详解》学习笔记-第22/23章 TCP坚持定时器,保活定时器
- 《TCP/IP详解》学习笔记-第3章 IP:网际协议
- TCP/IP学习笔记:TCP
- tcp/ip学习笔记--第24 TCP futures and performance
- 《TCP/IP详解》学习笔记-第1章 概述
- 《TCP/IP详解》学习笔记-第2章 链路层
- 《TCP/IP详解》学习笔记-第11章 UDP
- tcp/ip学习笔记--第4章 arp协议
- tcp/ip学习笔记--第6章ICMP
- tcp/ip学习笔记--第21章 Timeout and Retransmission
- TCP/IP学习笔记
- TCP/IP学习笔记
- tcp/ip 学习笔记
- Tcp ip学习笔记
- 不错的linux下通用的java程序启动脚本(转载)
- 程序员必须知道的十大基础实用算法及其讲解
- 自己总结的web前端知识体系大全【欢迎补充】
- 差值多项式的余项定理
- 单链表--uva 11988 Broken Keyboard 从入门到放弃
- tcp/ip学习笔记--第22章 TCP persist timer
- 置换加密法
- 链路层常见报文格式及长度
- JVM虚拟机有内存泄露怎么解决
- 网络编程是什么
- 数据算法-hadoop7 购物车分析
- 我的java自学经历
- Apriori
- C和指针之动态内存分配(读取范围在1和标准输入读取的size之前每个数据出现的次数)