我是靠谱客的博主 温暖耳机,最近开发中收集的这篇文章主要介绍基于tcp网络传输机制基于 tcp 网络传输机制,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

基于 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 网络传输机制所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部