计算机网络作业2
计算机网络作业2
#
一、双包发送协议设计同样是停等协议,但一个包带有两个分组。此处暂不考虑包裹出错的问题。在本协议中,发送方将维护一个可容纳两个分组的待机数据包,在数据包满的时候发送;接收方收到数据包后从包中解析出有序的两个分组,依次递交给下层协议。
#
1. 协议流程#
前言成对发送分组可能存在存在的问题是,当分组数为奇数,最后一个包裹会一直处于等待的状态。此处作补充说明:发送方在本次传输开始,即收到第一个分组的时候,开始维护一个计时器,在超过一定时间仍未收到上层传来新的分组时,认定为分组发送完毕。在将缓存区的分组也都发送完毕时,若待发送包裹未满未空,则额外添加一个null的分组,并把包裹发送出去。
当然,若上一层是一次性把需要发送的分组全都交给本层的话,只需在最后一个包裹中直接添加一个null分组即可,不用维护计时器。
#
发送方:- 初始化:
windowSize = 2windowUsed = 0dataArr[]watingACK = 0
- 事件处理
上层调用rdt_send(data),或等待上层调用rdt_send()超时:比较windowUsed和windowSize:
等于:缓存data。超时的话data为null,下同。
不等于:将data存入
dataArr[windowUsed]
,windowUsed自加,再次比较windowUsed- 等于:打包发送dataArr[] + waitingACK + chksum
- 不等于:等待下次调用
rdt_send()
。
收到ACK:清空dataArr,windowUsed归零,执行
waitingACK = (waitingACK+1) mod 2
等待ACK超时:重新发送pkgToSend
#
接收方- 初始化
expectedACK = 0
- 事件处理
收到包裹:检查包裹完整性和ACK匹配:
- 不完整或不匹配:发送NAK
- 完整:解包,得到
data[0] data[1] waitingACK
,依次调用deliver_data(data[i])
,发送ACK = waitingACK
,expectedACK = (expectedACK+1) mod 2
#
2. FSM#
发送方#
接收方#
3. 时序图等待成对数据满足并组装打包的流程将不在时序图中体现。
#
二、新TCP协议窗口分析#
分析- 慢启动周期为RTT:指数增长阶段
- 拥塞避免周期为10RTT
- 16轮后是出现了冗余ACK,
- 22轮后是出现了超时,cwnd设置为1
- 第一轮传递的ssthresh为32MSS
- 18轮的ssthresh为16轮的cwnd的一半,为
42/2=21 MSS
- 24轮的ssthresh为22轮的cwnd的一半,为
29/2=14.5 MSS
- 第70个报文段发送于:
1+2+4+8+16+32+7 ==> 第8轮
- 26轮时的cwnd为8,此时出现ACK冗余,ssthresh将设为
cwnd/2 = 4 MSS
,下一个cwnd设为1MSS
#
三、数学题#
解答#
1. 证明由于在一个周期内,吞吐量成线性增长逐次+1,
周期内发包总数
$$P = \frac{1}{2}(\frac{W}{2}+ W)(\frac{W}{2} + 1)=\frac{3}{8} W^2 + \frac{3}{4}W \tag{1}$$
丢包率
$$L = \frac{1}{P} = \frac{1}{\frac{3}{8} W^2 + \frac{3}{4}W} \tag{2}$$
#
2. 证明由1,平均吞吐量为
$$R = \frac{1}{2} \times (\frac{W}{2} + W) \div RTT = \frac{3W}{4RTT} \tag{3}$$
由(2),得到
$$W \approx \sqrt{\frac{8}{3L}} \tag{4}$$
将(4)代入(3),则有
$$L \approx \frac{1.22 \cdot MSS}{RTT \sqrt{L}} \tag{5}$$