当前位置: 首页 > news >正文

CS 144 check3: the TCP sender

Lecture Notes

Exercises

现在,在check3中,您将实现连接的另一边。

TCPSender是一种工具,它从出站字节流转换为将成为不可靠数据报的有效负载的段。

TCP sender的任务是确保receiver至少收到每个bytes一次。任务:

1、跟踪window size

2、填满window

3、跟踪有哪些片段receiver没有回应,这些片段叫做outstanding片段

4、重新发送outstanding片段。

TCPSender如何知道一个片段丢失了?

TCPSender将会发送一堆TCPSenderMessage。每个都将包含一个来自输出字节流的(可能是空的)子字符串,用序列号索引以指示其在流中的位置,在流的开头用SYN标志标记,在结尾用FIN标记。具体来说,

  1. 每隔几毫秒,TCPSender的tick方法将被调用,该参数告诉它自上次调用该方法以来已经经过了多少毫秒。使用此功能来维护TCPSender已活动的总毫秒数的概念。请不要尝试从操作系统或CPU中调用任何“时间”或“时钟”函数——tick方法是您对时间流逝的唯一访问权限。这使得事物具有确定性和可测试性。

  2. 当构造TCPSender时,它会给出一个参数,告诉它重传超时(RTO)的“初始值”。RTO是在重新发送未完成的TCP段之前要等待的毫秒数。RTO的值会随着时间的推移而变化,但“初始值”保持不变。启动器代码将RTO的“初始值”保存在一个名为initial_RTO_ms的成员变量中。

  3. 你将实现retransmission timer:一个可以在特定时间启动的警报,一旦RTO过去,警报就会关闭(或“expires”)。我们强调,时间流逝的概念来自于被调用的tick方法——而不是通过获得一天中的实际时间。

  4. 每次发送包含数据的段(序列空间中的非零长度)(无论是第一次还是重传),如果计时器未运行,则启动它运行,以便在RTO毫秒后过期(对于RTO的当前值)。我们所说的“expire”的意思是,时间将在未来耗尽一定数量的毫秒。

  5. 在确认了所有未完成的数据后,请停止retransmission timer。

  6. 如果调用了tick,并且retransmission timer已expired:

    a) retransmit尚未被TCP receiver完全确认的最早(最低序列号,ISN)段。您需要在一些内部数据结构中存储未完成的段,以便实现这一点。

    b) 如果窗口大小非零:

    • i. 跟踪连续重传的次数,并增加它,因为您只是重传了一些内容。您的TCP连接将使用此信息来决定连接是否无望(一行中连续重传输太多),是否需要中止。

    • ii. RTO值乘2。这被称为“exponential backoff”——它减缓了糟糕网络上的重传,以避免进一步的工作。

    c) 重置retransmission timer并启动它,使其在RTO毫秒后过期(考虑到您可能刚刚将RTO的值翻了一倍!)。

  7. 当接收方给发送方一个确认成功接收新数据的ackno时(ackno反映的是比以前任何ackno都大的绝对序列号):

    a) 将RTO设置回其“初始值”。

    b) 如果发送方有任何未完成的数据,请重新启动retransmission timer,使其在RTO毫秒后(对于RTO的当前值)将expire。

    c) 将“连续重传”的计数重置为零。

参考:

  1. CS 144
  2. CS144 | Winter 2024, Lab 0~7 记录(已开源)
http://www.lryc.cn/news/507224.html

相关文章:

  • Deepin/Linux clash TUN模式不起作用,因网关导致的问题的解决方案。
  • Tomato 靶机(通关攻略)
  • 服务器被入侵登录不上怎么办?
  • 达梦官方工具 SQLark数据迁移(oracle->达梦数据库)
  • redis数据类型:list
  • .NET周刊【12月第2期 2024-12-08】
  • C#—扩展方法
  • 金碟中间件-AAS-V10.0安装
  • sql server 查询对象的修改时间
  • Qt之串口设计-线程实现(十二)
  • 探索 Seaborn Palette 的奥秘:为数据可视化增色添彩
  • Linux创建普通用户和修改主机名
  • 在 Spring Boot 3 中实现基于角色的访问控制
  • 二八(vue2-04)、scoped、data函数、父子通信、props校验、非父子通信(EventBus、provideinject)、v-model进阶
  • 配置PostgreSQL用于集成测试的步骤
  • 【ComfyUI + 铅笔素描画风】艺术家DaTou发布了的彩色铅笔素描风格生成(真实感超强)
  • Unity-Editor扩展GUI基本实现一个可拖拉放的格子列表
  • 后摩尔定律时代,什么将推动计算机性能优化的发展?
  • SQL进阶技巧:如何计算商品需求与到货队列表进出计划?
  • linux普通用户使用sudo不需要输密码
  • Mac配置 Node镜像源的时候报错解决办法
  • R语言的数据结构-数据框
  • 分布式全文检索引擎ElasticSearch-数据的写入存储底层原理
  • react中实现导出excel文件
  • 有监督学习 vs 无监督学习:机器学习的两大支柱
  • c4d动画怎么导出mp4视频,c4d动画视频格式设置
  • 差分矩阵(Difference Matrix)与累计和矩阵(Running Sum Matrix)的概念与应用:中英双语
  • 全面解析 Golang Gin 框架
  • 全脐点曲面当且仅当平面或者球面的一部分
  • CSS学习记录18