- 01010011+01100110=10111001;
10111001+01110100=00101110;
00101110的反码是11010001;
UDP的checksum的工作原理是将这些字分别相加,如果有加法溢出,即需要被回卷.如果该分组中没有引入差错,则显然在接收方处该和将是8个1,在16位下将是16个1.如果这些比特之一是0,那么该分组中即有差错.
校验和使用反码求和的优点是:
(1)不依赖系统的字节序是大端小端。即二进制反码和字节序无关.
(2)求和过程中,先对校验序列求反码序列再循环进位求和,等于先二进制循环进位求和以后再对求和结果求反码,而先二进制循环进位求和以后再对求和结果求反码会大大减少求反码的次数.
如果这些待校验序列中有1比特的差错,那么在循环进位求和的过程中,无论如何求和进位,这1比特的差错都会对最后的求和结果造成影响;而如果是有2比特位的差错的话,这个2比特的差错有可能检验不出来,因为在循环进位求和阶段该差错可能恰好被掩盖.
如果这个确认报文分组号的ACK发送信息被删除的话,当发送方发送了某一分组0,会进入等待ACK0的状态;此时,接收方的本来需要从一直等待来自下层的0的状态发生的变化,但这个状态变化需要对这个分组0进行ACK码的发送;
但是,当ACK码发送的步骤被删除时,所以,发送方不会收到接收方任何ACK码的信息,而发送方仅当接收到ACK并且离开该状态时才能再发生rdt_send事件.所以不能删除,这样发送方和接收方的状态改变依赖于二者的相互等待.
对于发送方偶尔发送数据,在只使用NAK的协议下,发送方确认数据包是否发送成功只可以根据NAK的消息判断,例如当发送方收到了关于packet3的NAK消息时,不外加其他条件,发送方才知道packet3的发送失败,发送方才得以继续发送.
对于很少丢包的发送方发大量数据时,NAK协议会比只使用ACK更好,因为这样会减少额外确认码的发送,一并减少了发送开销.
- 设计的该SR协议的FSM

说明,因为一次发送一对包,所以00,和10,即一左一右的状态逻辑相同.
以00和01表示一对分组中第一个包的新旧状态.
以10和11表示一对分组中第二个包的新旧状态.

而对于该SR协议的接收方,只需要在发送方的等待ACK功能替换为等待数据的过程.
下面对该SR协议的接收方和发送方分别描述.
发送方:
- 等待上层数据和上层调用,检查下一个可用于该对分组的序号.如果序号位于发送方的窗口内,则将该对分组打包并发送.
- 超时:设置定时器,一对分组中的每个分组必须拥有自己的逻辑定时器.
- 收到ACK,一对被发送的分组中,倘若该分组序号在窗口内,则SR发送方进行标记,若一对分组中的两个包都被ACK确认,则SR发送方标记为该对已接收,进行窗口的滑动.
接收方:
同样维护以对为单位的接收窗口.如果收到的分组属于接收窗口内,则一个ACK进行发送,如果不位于窗口内,则暂时缓存.当接收窗口也进行滑动时,进行一对包的交付.
如果收到的分组属于接收窗口内,则必须进行一个ACK进行发送,用来确认该对的上一对分组包.
其他情况,进行忽略.
设计适合该机制的协议的FSM

- a.发送窗口内的报文序号可能是多少,一种边界情况是,对k-1号分组及之前的所有分组都进行了确认,即k分组是发送方的窗口的第一个,所以,此时发送窗口的报文序号是k,k+1,k+2,k+3;另一种边界情况是发送方未收到ACK,即k-4,k-3,k-2,k-1;
b. 因为接受方在等待分组k,那么说明接受方已经接受和确认了k-1及k-1之前的所有分组.如果包含这些分组的窗口大小及4个ACK确认没有到达发送方时,故ACK所有可能的值是k-4,k-3,k-2,k-1;但是因为发送方发送分组k-4,k-3,k-2,k-1的前提是收到了ACK(k-5),由累计确认的原则,ACK字段的所有可能的值是[k-5,k-1];
- 对于SR协议而言,为了避免新来的分组和重发的分组无法区分的情况,必须使窗口长度小于或等于序号空间大小的一半.
因为序号空间是[0,k]/[0,k]重复应用的.设序号空间大小的一半为w,则w=k/2.
当WinSize>k/2时,

如本图所示,假设发送过程中,分组0,1,..,w都没有被收到ACK确认,此时第一个发送的分组0因超时而需要重传分组,故此时发送方需要发送分组0,而此时接受方因为实质是收到了分组0,1,..,w,只是他们对发送方的ACK码没有被发送方收到而已,故此时的接受方的窗口已经滑动到了w+1,…,w+WinSIze,这个序列的窗口段,这个序列的窗口段的分组序号为,w+1,w+2,…,k,…(如果有了最大的k,则需要从1处进行重置.)
此时,接受方的窗口和分组序号的对应关系为:
| 接收方窗口移动 | 分组序号 |
|---|---|
| w+1 | w+1 |
| w+2 | w+2 |
| w+3 | … |
| w+w(因为w=k/2) | k |
| w+w+1(假设此时还未到WINSIZE) | 0 |
| … | … |
| w+WinSize | Winsize-w-1 |
由这个对照关系所知,当WinSize>k/2时,此时在分组序号和k的交接处,因为w+w+1=k+1<w+WinSIze,即此时接收方的窗口中会同时收到分组序号0的包(仅举例),而对于这个包和从接收方的角度来看,接收方无法分别这个包是新的一个序号0的包,还是一组新的重传.
所以对于SR协议而言必须使窗口长度小于或等于序号空间大小的一半.
- 对于为什么要3个冗余ACK后启动重传:
结论:两次duplicated ACK时乱序造成的,而丢包会造成3次冗余的ACK.
假设AB两个通信双方,A向B发送4个TCP Segment给B;
发送方A以1,2,3,4的顺序进行发送.
此时B方到达的顺序是:(仅发生乱序)
Case1: 1,2,3,4则A收到1个ACK(N);[各一个]
Case2: 1,2,4,3,则A收到会收到两个ACK(2)’
Case3: 1,3,2,4,则A会收到两个ACK;
Case4: 1,3,4,2则A会收到3个ACK(1);
…
此时B方到达的顺序是:(仅发生丢包)
Case1:1,3,4,会收到3个ACK(1)
Case2:1,4,3,仍是会收到3个ACK(1)
总结如上,当TCP包乱序时,有概率可以收到3次重复ACK,而当TCP丢包时,则一定会收到ACK,此时如果针对这种情况启动快速重传则会很好的起到快速恢复的效果.
- 比较GBN,SR和TCP
| SR | TCP | GBN | |
|---|---|---|---|
| 应答方式 | 不累计应答 | 累计应答下一个字节的sequence | 累计应答 |
| 缓存机制 | 缓存 | 缓存 | 不缓存,直接扔掉 |
| 0 | ACK0 | ACK1 | ACK0 |
| 1 | 发送丢失 | 发送丢失 | 发送丢失 |
| 2 | ACK2(缓存) | ACK2(包2缓存) | ACK0 |
| 3 | ACK3(缓存) | ACK2(包3缓存) | ACK0 |
| 4 | ACK4(缓存) | ACK2(包4缓存) | ACK0 |
| 1重发 | ACK1 | ACK2,ACK5 | (1-4全重发)ACK1,ACK2,ACK3,ACK4 |
| 总ACK数目 | 5 | 6 | 8 |
b .根据题目假设,超时的区间设置的很长,所以由上比较可知,当TCP收到3次duplicated ACK后会进行快速重传和恢复机制,所以TCP事件最短