12.TCP的成块数据流
1.滑动窗口协议
3.PUSH标志
4.慢启动算法
5.带宽延时乘积
6.紧急方式
TCP滑动窗口的可视化表示
2.窗口大小
我们将字节从1到11进行标号,接收方通告的窗口称为提供的窗口,它覆盖了第4字节到第9字节的数据,且通告窗口大小为6。发送方计算接收者的可用窗口,以便确定有多少数据可以被立即发送。当接收方确认数据后,这个滑动窗口向右移动。窗口两个边沿的相向运动有以下3种情况:
(1)在数据被发送和确认时,窗口左边沿向右边沿靠近,称为窗口合拢。
(2)在另一端接收进程读取已经确认的数据并释放了TCP接收缓存时,窗口右边沿向右移动,称为窗口张开,此时允许发送更多的数据。
(3)当右边沿向左移动时,称为窗口收缩。这种方式不被建议。
3种情况如下图所示:
如果左边沿到达右边沿,则称为0窗口,此时发送方不能发送任何数据。
接收方的窗口大小通常可以由接收进程控制,这将影响TCP的性能。对于以太网来说,默认的4096字节并不是最理想的大小,提高窗口的大小 有时 可以提高网络的吞吐量。
发送方使用该标志通知接收方将所收到的数据全部提交给接收进程,这里的数据包括与PUSH一起传送的数据 以及 接收方TCP已经为接收进程收到的其他数据。
特点:
(1)通过设置PUSH标志,客户进程通知TCP在向服务器发送一个报文段时不要因等待额外数据而使已提交数据在缓存中滞留。
(2)当服务器接收到设置了PUSH标志的报文段时,它需要立即将这些数据提交给服务器进程而不能等待判断是否还会有额外数据到达。
(3)如果待发送数据将清空发送缓存,则自动设置PUSH标志(大多数源自伯克利的实现)。
过程:
①当连接建立的时候,发送者用当前使用的最大数据段长度初始化拥塞窗口,然后发送一个最大的数据段
②如果在定时器超期之前收到确认,则将拥塞窗口翻倍, 然后发送两个数据段。。。。。。直至超时(或达到接收方窗口的大小)
③确定出拥塞窗口的大小
cwn--拥塞窗口
除了使用接收者窗口和拥塞窗口,TCP拥塞控制还使用第三个参数,阈值(threshold),初始化为64K。
<1>当一个超时发生时,阈值降为当前拥塞窗口的一半,同时将拥塞窗口设为一个最大数据段长度。
<2>然后使用慢启动算法来决定网络的容量,拥塞窗口增长到阈值时停止指数增长。
<3>从这个点开始,每次成功的传输都会让拥塞窗口线性增长(每次只增长一个最大数据段长度)。
例题:
如果:TCP慢启动中,初始阈值是8,当拥塞窗口升到 12的时候,发生了超时,开始新的慢启动,拥塞窗口 从头起CWND= 1。问:第14次传输时的拥塞窗口是多大? 答案:8
可以参考带宽延时乘积设置窗口大小,它代表网络通道的容量大小。
capacity(bit)=bandwidth(b/s)×round-trip time(s)
TCP提供了紧急方式,它使一端可以告诉另一端有些具有某些方式的"紧急数据"已经被放置在普通的数据流种。另一端被通知这个紧急数据已被放置在普通数据流中,由接收方决定如何处理。
通过设置TCP首部的两个字段来发出紧急数据。即将URG比特置1,将一个16bit的紧急指针置为一个正的偏移量。该偏移量与TCP首部的序号字段相加,得出紧急数据最后一个字节的序号<--Host Requirements RFC规定(然而大多数伯克利实现中,紧急指针被解释为紧急数据最后一个字节的下一字节)。
举例:
(Telnet和Rlogin)客户端通告服务器窗口为0,就在此时服务器进入紧急方式,尽管它不能发送任何数据,服务器TCP也会立即发送紧急指针和URG标志。当客户TCP接收到这个通知就会通知客户进程读取TCP缓存,打开窗口,和服务器继续通信。
我的github:
https://github.com/zhoudayang