概述
基于 tcp 网络传输机制
实验内容
-
TCP 拥塞控制机制
-
TCP 拥塞控制状态迁移
-
TCP 拥塞控制机制
- 数据包发送
- 拥塞窗口调整
- 重传数据包
-
-
TCP 拥塞控制机制实现
实验步骤
-
执行 create_randfile.sh,生成待传输数据文件 client-input.dat
-
运行给定网络拓扑(tcp_topo.py)
-
在节点 h1 上执行 TCP 程序
- 执行脚本(disable_tcp_rst.sh, disable_offloading.sh),禁止协议栈的相应功能
- 在 h1 上运行 TCP 协议栈的服务器模式 (./tcp_stack server 10001)
-
在节点 h2 上执行 TCP 程序
-
执行脚本(disable_tcp_rst.sh, disable_offloading.sh),禁止协议栈的相应功能
-
在 h2 上运行 TCP 协议栈的客户端模式 (./tcp_stack client 10.0.0.1 10001)
- Client 发送文件 client-input.dat 给 server,server 将收到的数据存储到文件 server-output.dat
-
-
使用 md5sum 比较两个文件是否完全相同
-
记录 h2 中每次 cwnd 调整的时间和相应值,呈现到二维坐标图中
设计思路
New Reno 方法拥塞控制状态机的实现
根据 TCP 拥塞控制状态迁移图,设计状态机的跳转。
TCP 初始状态为 OPEN
。
若收到新的 ACK
- 当 TCP 处于
DISORDER
状态时,则跳转回初始状态OPEN
。 - 当 TCP 处在
LOSS
状态时,若收到的 ACK 大于切换到LOSS
状态时的 snd_nxt 时,跳转回 OPEN。 - 当 TCP 处在
RECOVERY
状态时,若收到的 ACK 大于切换到RECOVERY
状态时的 snd_nxt 时,跳转回 OPEN。
若收到重复 ACK
- 当 TCP 处在
OPEN
状态下,收到重复 ACK 时,tsk->dupacks
加 1,状态切换到DISORDER
。 - 当 TCP 处在
OPEN
状态下,收到重复 ACK 时,tsk->dupacks
加 1,当tsk->dupacks = 3
时,状态切换到RECOVERY
。
拥塞控制
TCP 拥塞窗口增大
-
慢启动(Slow Start)
- 对方每确认一个报文段,cwnd 增加 1MSS,直到 cwnd 超过 ssthresh 值
- 经过 1 个 RTT,前一个 cwnd 的所有数据被确认后, cwnd 大小翻倍
-
拥塞避免(Congestion Avoidance)
- 对方每确认一个报文段,cwnd 增加(1 MSS)/CWND 1MSS
- 经过 1 个 RTT,前一个 cwnd 的所有数据被确认后, cwnd 增加 1 MSS
统计 CWND 的变化
PPT 中建议每当值发生改变时,就记录 CWND 的变化,但是这样需要在 TSK 中新增两个变量用来记录时间和 FILE 的句柄。因此在本设计中改为每间隔一段时间,就扫描当前 CWND 的值。另外需要注意的是,由于本实验中存在两个 tsk,因此统计值的时候需要指定统计客户端的 cwnd 即 tsk->parent 等于 NULL 的 tsk 的 CWND。
另外数据处理用了 ipynb 实现。
修复之间实验的问题
问题一
补充了流量控制,在之前的设计中,忘记改变 tsk->rwnd 的值,让他一直保持在初始默认状态,新设计中将其改为了,当写 ring_buffer 时,将 ring_buffer 的剩余空间赋值给 tsk->rwnd。
问题二
之前实验三中传输时间较慢,我以为是因为没有实现快重传。在本次实验实现了快重传后,发现 TCP 依旧总是需要超时重传,查看代码发现,之前 retrans 定时器 set 和 update 有问题,其 time_out 并没有赋值时,而是在编辑器自动补全时,变成了给 time_wait 的 timeout 赋值。这个问题在本次代码设计中被修复。
结果验证
本次实验传输的数据大小为 1,350,880B
,设置的丢包率为 5%
。
本次实验的传输结果如下:
上图可知,可知本次实验结果符合预期,客户端发送的文件与服务器端接受的文件一致。
CWND 的变化曲线如下:
与预期结果存在两点小的差异,原因如下:
- 不够平滑是因为本设计中改为每间隔一段时间,就扫描当前 CWND 的值,而扫描的时间间隔相比于 CWND 的变化稍大。
- 由于为测试该设计的鲁棒性,本实验环境的丢包率设置为 5%,这一数字相对较大,导致需要超时重传的次数也相对增多,最终导致很多时间下 CWND 的大小接近于
1
。
最后
以上就是温暖耳机为你收集整理的基于tcp网络传输机制基于 tcp 网络传输机制的全部内容,希望文章能够帮你解决基于tcp网络传输机制基于 tcp 网络传输机制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复