TCP可靠传输的实现

以字节为单位的滑动窗口

TCP的滑动窗口是以字节为单位的。 现假定A收到了B发来的确认报文段,其中窗口是20(字节)而确认号是31.根据这两个数据,A就构造出自己的发送窗口,位置如图:

假定A发送了序号为31~41的数据。这时发送窗口位置并未改变,但发送窗口内靠后面有11个字节(灰色小方框表示)表示已发送但未收到确认。而发送窗口内靠前面的9个字节(42~50)是允许发送但尚未发送的。

超时重传时间的选择

TCP的发送方在规定的时间内没有收到确认就要重传已发送的报文段。如果把超时重传时间设置得太短就会引起很多报文段的不必要的重传,使网络负荷增大。但若把超时重传时间设置得过长,则又使网络的空闲时间增大降低了传输效率。

方法: 报文段每重传一次,就把超时重传时间RTO增大一些。典型的做法是取新的重传时间为2倍的旧重传时间。当不再发生报文段的重传时再重新计算超时重传时间。

选择确认SACK

选择确认(Selective ACK)的工作原理:TCP的接收方在接受对方发送过来的数据字节流的序号不连续,结果就形成了一些不连续的字节块,如下图。序号1~1000收到了但序号1001~1500没有收到。接下来的字节流又收到了可是又缺少3001~3500。也就是说接收方收到了和前面的字节流不连续的两个字节块。如果这些字节的序号都在接收窗口之内那么接收方就先收下这些数据,但要把这些信息准确地告诉发送方使发送方不要再重复发送这些已收到的数据。

选择确认SACK

TCP的首部没有哪个字段能够提供上述这些字节的边界信息。如果要使用选择确认,那么在建立TCP连接时就要在TCP首部的选项中加上“允许SACK”的选项,而双方都必须事先商定好。