计算机网络之TCP的可靠传输

news/2025/2/23 2:26:05/

上一篇内容可能比较多,显得比较杂乱,这一篇简单总结一下TCP是靠什么实现可靠传输的吧。

校验和

TCP是端到端的传输,由发送方计算校验和,接收方进行验证,目的是为了验证TCP首部和数据在发送过程中没有任何改动,一旦发现校验和有差错,直接丢弃TCP段并重新发送。

序列号/确认应答

TCP传输时发送方对每一个发送的消息都会编号,也就是序列号seq。接收方在每次接收到消息后回复确认应答号ACK,不仅告诉接收到哪些数据,还包括下一次消息从哪里发送。只要发送方没有接收到确认应答号ACK,都会重新发送数据。

超时重传

发送方发送完数据后会等待一定的时间,如果在这个时间内没有接收到ACK,就会重传数据。如果是发送方发生了丢包,那么接收方在接收到数据后会回复ACK,如果是接收方回复的ACK丢失了导致的重传,那么根据校验和和序列号知道该数据已经接收,丢弃该数据并发送ACK。

连接管理

三次握手和四次挥手。

流量控制(滑动窗口控制)

发送方发送数据的快慢取决于接收方接收能力。TCP的报文信息中有一个16位字段来标识滑动窗口,窗口大小就是接收方剩余缓冲区大小,在回复ACK时,接收方将自己剩余缓冲区大小填入。发送方根据窗口大小来调整自己的发送速度,如果缓冲区大小为0,那么发送方会停止发送数据。并且发送方定期会发送探测报文,来获取缓冲区大小。

快速重传

当接收端收到比期望号大的seq时候,就会发送冗余ACK,在超时重传之前如果收到三个相同的冗余ACK,那么就知道哪段报文发生了丢包,重传该段报文即可,避免了超时重传。

拥塞控制

网络可能刚开始很拥塞,如果在网络传输过程中开始就发送大量数据的话,会发生丢包和超时重传,所以需要慢启动算法、拥塞避免算法、快速重传和快速恢复。

慢启动算法

一开始不发送大量数据,而是应该先发一小部分探测数据,然后由小到大逐渐增大发送窗口。通常在刚刚开始发送报文段时,先把拥塞窗口 cwnd 设置为1,每次接收到报文之后将窗口大小翻倍。如果指数增长到避免拥塞算法的门限ssthresh,则改用避免拥塞算法。

  • 初始化设置 cwnd = 1,并开始传输数据
  • 收到回馈的 ACK,会将 cwnd 加 1
  • 当发送端一个 RTT 后且未发现有丢包重传,就会将 cwnd = cwnd * 2
  • 当 cwnd >= ssthresh 或发生丢包重传时慢启动结束,进入拥塞避免状态

避免拥塞算法

每当收到一个 ACK 时,cwnd 增加 1/cwnd,变为线性增长。一但发现丢包和超时重传,就进入拥塞处理状态。

拥塞发生

网络出现拥塞,也就是会发生数据包重传,重传机制主要有两种:超时重传和快速重传。

ssthresh 和 cwnd 的值会发生变化

  • ssthresh 设为 cwnd/2
  • cwnd 重置为 1

发送三次前一个包的 ACK,于是发送端就会快速地重传,不必等待超时再重传。TCP 认为这种情况不严重,因为大部分没丢,只丢了一小部分,则 ssthresh 和 cwnd 变化如下:

  • cwnd = cwnd/2 ,也就是设置为原来的一半
  • ssthresh = cwnd
  • 进入快速恢复算法

快速恢复

  • 拥塞窗口 cwnd = ssthresh + 3 ( 3 的意思是确认有 3 个数据包被收到了)
  • 重传丢失的数据包
  • 如果再收到重复的 ACK,那么 cwnd 增加 1
  • 如果收到新数据的 ACK 后,把 cwnd 设置为第一步中的 ssthresh 的值,原因是该 ACK 确认了新的数据,说明从 duplicated ACK 时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态

具体详细内容请见https://blog.csdn.net/qq_45444343/article/details/145670595?spm=1001.2014.3001.5501


http://www.ppmy.cn/news/1574304.html

相关文章

oracle apex post接口

日常记录 使用到了apex_json方式接收 、、、1 首先,接口通过body传递过来,成功接收到, 数据格式为 JSON_OBJECT_T l_json : JSON_OBJECT_T.parse(:body); 这里我用参数接收到 然后 里面是包含了 "data" 我用 继续接收到这个 l…

【算法】002、编程实现社会问题

【算法】002、编程实现社会问题 文章目录 一、模拟1.1 模拟 二、多语言解法 // 一开始有100个人,每个人都有100元 // 在每一轮都做如下的事情 : // 每个人都必须拿出1元钱给除自己以外的其他人,给谁完全随机 // 如果某个人在这一轮的钱数为0&#xff0c…

unplugin-vue-components,unplugin-auto-import,借用ai去学习

好的,我现在需要帮助用户理解他们提供的这段Vite配置代码。用户之前已经询问过关于ElementPlusResolver的导入问题,现在他们展示了在vite.config.ts中使用该解析器的具体配置。我需要逐步分析这段代码,并解释每个部分的作用。 首先&#xff…

人工智能泡沫效应

1.1 泡沫效应的经济学解释 泡沫效应是指资产价格持续超出其内在价值的现象,通常由过度投机、市场预期不合理等因素引起。在经济学中,泡沫的形成往往伴随着资产价格的快速上涨,而这种价格上涨并非基于基本面的支撑,而是由于投资者…

基本认证 vs OAuth 2.0 vs OpenID Connect

目前 Authing 有三种可以选择的认证方式: 基本认证是基于 API 接口,通过发送账密、手机验证码到 服务器 后端的方式直接完成用户认证。提供 MFA、忘记密码等功能。 OAuth 2.0 协议主要用于资源授权。 OpenID Connect 协议,简称 OIDC,是 OAuth 2.0 协议的超集,能够认证用户…

QPainter绘制3D 饼状图

先展示图片 核心代码如下&#xff1a; pie.h #ifndef Q3DPIE_H #define Q3DPIE_H#include <QtGui/QPen> #include <QtGui/QBrush>class Pie { public:double value; QBrush brush; QString description; double percentValue;QString p…

【云安全】云原生- K8S 污点横移

什么是“污点横移”&#xff1f; 在 K8S 中&#xff0c;利用污点&#xff08;Taint&#xff09;进行横向移动渗透是指攻击者通过操纵或绕过集群中的污点和容忍&#xff08;Toleration&#xff09;机制&#xff0c;将恶意负载&#xff08;Pod&#xff09;调度到原本受保护的节点…

普通人使用生成式语言模型的几个阶段

随着生成式语言模型&#xff08;如 ChatGPT、Grok 等&#xff09;逐渐走进大众生活&#xff0c;普通人从最初的懵懂尝试&#xff0c;到熟练运用&#xff0c;再到理性判断其输出结果是否可靠&#xff0c;经历了一个逐步进阶的过程。以下&#xff0c;我将详细描述普通人使用生成式…