CS 144 check3: the TCP sender

embedded/2024/12/31 1:12:16/

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.ppmy.cn/embedded/147606.html

相关文章

跨站脚本攻击(XSS)可能存在的位置与实操演示

免责申明 本文仅是用于学习研究XSS攻击的原理,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》【学法时习之丨网络安全在身边一图了解网络安全法_中央网络安…

图文社区用户搜索关系表设计方案:空间换时间的权衡与抉择

背景 我们来聊一个解决方案:我们做了一个和抖音产品类似的图文社区,社区有一个搜索栏,通过名字搜索用户,搜索出来的用户需要体现出其与当前用户的关系:1.当前用户的粉丝。2.当前用户关注的人。3.互相关注。目前总用户…

CPU性能优化-基于源代码的CPU调优

一 在第二部分,我们将讨论如何使用CPU监控特性寻找CPU上运行的代码中可被调优的位置。对于性能敏感型应用程序,如大型分布式云服务,科学高性能计算软件,3A 级游戏等,了解底层硬件的工作原理是非常重要的。若在程序开发…

11篇--图像边缘检测

图像梯度 要学习图像边缘检测,要先了解图像梯度的概念,我们正是通过梯度值来区分边缘像素点的 处于边缘附近的像素点与周围像素点的差距很大(不然不会有边缘呈现),所以给边缘附近的的梯度之变化很快,通过…

git使用和gitlab部署

1.ci,cd,DevOps ci:持续集成:开发的代码集成到代码仓库 cd:持续交互:从代码仓库拉取代码到部署到测试环境 cd:持续部署:从代码仓库拉取代码到部署到生产环境 DevOps:开发写完的代码自动集成&#xff0c…

ResNext-50模型进行图像识别

本文为为🔗365天深度学习训练营内部文章 原作者:K同学啊 import numpy as np from keras.preprocessing.image import ImageDataGenerator from keras.utils import to_categorical from keras.models import Sequential from keras.layers import Input…

linux-----数据库

Linux下数据库概述 数据库类型: 关系型数据库(RDBMS):如MySQL、PostgreSQL、Oracle等。这些数据库以表格的形式存储数据,表格之间通过关系(如主键 - 外键关系)相互关联。关系型数据库支持复杂的…

MCU驱动使用

一、时钟的配置: AG32 通常使用 HSE 外部晶体(范围:4M~16M)。 AG32 中不需要手动设置 PLL 时钟(时钟树由系统自动配置,无须用户关注)。用户只需在配置文件中给出外部晶振频率和系统主频即可。 …