TCP ------ 滑动窗口协议

在TCP的滑动窗协议中,我们可以把字节流看做四部分:
已经发送并确认的、已经发送未确认的、能够发送的、不能发送的,这四部分。
TCP ------ 滑动窗口协议_第1张图片
整体的窗口大小(即就是滑动窗口的大小)是按照通告方的窗口大小决定的,窗口里面分为两部分,一部分是等待确认的数据,一部分是可以发送的数据,首先,确认的话,是等待TCP回复一个确认报文段,确认已经收到了对端的数据,并且经过头部的16位校验和的数据校验之后,发现数据是正确的,才会给发送端回复确认报文段,发送端接收到这个确认报文段中的确认信息之后,滑动窗口的左边沿就会向右偏移,窗口的两个边沿的相对运动增加或减少了窗口的大小。我们使用三个术语来描述
(1)称窗口左边沿向右边沿靠近为“窗口合拢”。这种现象发生在数据被发送并确认时
(2)当窗口右边沿向右移动时将允许发送更多的数据,我们称之为“窗口张开”。这种现象发生在另一端的接受进程读取已经确认的数据并释放了 TCP的接收缓存时。
(3)当右边沿向左移动时,称为“窗口收缩”。这种情况一般不会发生。
问题1:
在TCP头部中有16位的窗口大小,这是TCP流量控制的一种手段,代表的是接收通告窗口(RWND),它告诉对方,本端TCP接收缓冲区还能容纳多少字节的数据。
窗口的最大值是65535字节。(经过实测,我的readhat 6.3版本 默认的TCP接收缓冲区的大小是16384字节,所以滑动窗口初始值是16384字节)
问题2:
当收到确认之后,滑动窗口左边沿就会向右移动,而且滑动窗口只能向右移动,因为窗口的大小是相对于序列号的。
问题3:
TCP可以表述为一个没有选择确认或否认的滑动窗口协议,TCP缺少选择确认是因为,TCP首部中的确认序号表示已经成功收到数据,但是不包含已经确认序号所指的数据,当前还无法对数据流中选定的部分进行确认,(确认就是校验和,判断数据是否和发送时一致)如果不正确TCP将丢弃这个报文段和不确认收到此报文段,(希望发送端超时并重发)

你可能感兴趣的:(Linux网络编程)