1.TCP默认使用的窗口协议下,是选择的回退N帧还是选择重传?
上面这两个协议是非常基础的协议,属于特别抽基础那种,实际应用是有所改进的
一般TCP结合了这两种重传机制(而非单一):
(1)累计确认:使用accumulative acknowledgement,即发回的ACK相当于对之前发送的很多packet进行确认。
(2)只设一个timer,对应的是发送方所有未确认的packet里最早发送的那个。如果发生timeout或者3 duplicates,则只重传最早的那一个。
(3)如果接收方收到了新的确认,则重置计时器,并继续把它跟所有未确认的packet里最早发送的那个联系起来。
(4)有快传,快传不会影响计时器(即计时机继续计时)。另外,快传说的是收到3个重复的ACK,不算最初的那一个有效的ACK,即一共应该是4个相同的ACK(如下图)。
(5)接收方窗口不是固定的1,而且发送方和接收方窗口都不是固定的,都是不断变化的,这是对两协议的改进
(6)有选择重传:通过SACK实现
注:解释一下这里首部长度选项最多40字节,每个边界4字节,为什么选项中只能指明4个字节块的边界信息?
因为这里包含SACK允许选项字段和SACK字段(均在TCP首部的选项字段,不足4n字节用0填充)
(1)SACK允许选项(声明使用SACK)
SACK特性是TCP的一个可选特性,是否启用需要收发双发进行协商,通信双发在SYN段或SYN+ACK段中添加SACK允许选项通知对端本端是否支持SACK,如果双发都支持,那么后续连接态通信过程中就可以使用SACK选项了。所以SACK允许选项只能出现在SYN段中。
SACK允许选项格式如下图:
(2)SACK选项(SACK的具体信息)
连接建立后,如果出现开头所述的情况,接收方就可以通过SACK选项告诉发送方字节的实际接收情况。SACK选项格式如下:
可见除了每个字节块2个边界共需8个字节外,至少还有SACK允许选项(2字节),所以总共40字节最多容纳4组边界,这就占用了4*8+2=34字节,不足以容纳另外1组边界了。所以并非简单想想的5*8=40
持续更新中(直到期末结束)