第19章 交互数据流
交互数据总是以小于最大报文段长度(MSS,Maximum Segment Size)的分组(一般也称为微小分组,tinygram)发送。
经受时延的确认
通常TCP在收到数据时并不立即发送 ACK,它会推迟发送,以便将 ACK 与需要沿该方向发送的数据一起发送(这种现象也称为数据捎带 ACK)。绝大多数实现采用的时延是200ms。
Nagle 算法
Nagle 算法要求一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。相反,TCP收集这些少量的分组,并在确认到来时以一个分组的方式发出去。该算法的优越之处在于它是自适应的:确认到达的越快,数据也就发送得越快。在希望减少微小分组数目的低速广域网上,则会发送更少的分组。
对于低延时的应用则需要关闭Nagle 算法,可以通过 TCP_NODELAY 选项来关闭。
在发送的报文段中如果包含了丢失的报文段中的数据,则称为重新分组化。
窗口大小通告
假如在 SYN 报文段中通告的窗口大小为 4096,在后续的某个通告中窗口大小为4095,则表示有 4096 - 4095 = 1
个字节的数据没有被应用程序读取。
第20章 成块数据流
TFTP使用的停止等待协议允许发送方在发送下一个数据块之前需要等待接收对方对已发送数据的确认。
TCP使用的窗口滑动协议允许发送方在停止并等待确认前可以连续发送多个分组。
使用TCP的滑动窗口协议,接收方不必确认每一个收到的分组。在TCP中,ACK是累积的,它们表示接收方已经正确收到了一直到确认序号减1的所有字节。
窗口更新:如果一个ACK报文段并不确认任何数据,只是用来增加窗口的右边沿(有空间可接收新数据),则称为窗口更新。
滑动窗口
窗口在数据流上滑动:
接收方通告的窗口称为提出窗口(offered window),覆盖了从第4字节到第9字节的区域,表明接收方已经确认了包括第3字节在内的数据,且通告窗口大小为6。窗口大小是与确认序号相对应的。发送方计算它的可用窗口,该窗口表明多少数据可以立即被发送。
窗口左右边沿的运动:
- 窗口左边沿向右靠近为窗口合拢,这种现象发生在数据被发送和确认时。
- 窗口右边沿向右移动时将允许发送更多的数据,称为窗口张开。这种现象发生在另一端的接收进程读取已经确认的数据并释放了TCP的接收缓存时。
- 当右边沿向左移动时,称为窗口收缩。
发送方不必发送一个全窗口大小的数据报;
来自接收方的报文段确认数据并把窗口向右滑动,这是因为窗口大小是相对于确认序号的。
由接收方提供的窗口大小通常可以由接收进程控制,将影响TCP的性能。
PUSH 标志
PUSH 标志通知接收方将所收到的数据全部提交给接收进程。这里的数据包括与PUSH一起传送的数据以及接收方TCP已经为接收进程收到的其他数据。
慢启动
慢启动(slow start)算法通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作。
慢启动为发送方的TCP增加了另一个窗口:拥塞窗口(congestion window),记为cwnd。
当与另一个网络的主机建立TCP连接时,拥塞窗口被初始化为1个报文段(即另一端通告的报文段大小)。每收到一个ACK,拥塞窗口就增加一个报文段(cwnd以字节为单位,但是慢启动以报文段大小为单位进行增加)。发送方取拥塞窗口与通告窗口中的最小值作为发送上限。
拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。
发送方开始时发送一个报文段,然后等待ACK。当收到该ACK时,拥塞窗口从1增加到2,既可以发送两个报文段。当收到这两个报文段的ACK时,拥塞窗口就增加为4。这是一种指数增加的关系。
欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。