字节网络问题
# 一.tcp如何保证可靠传输
# 1. ARQ协议
自动重传请求(Automatic Repeat-reQuest,ARQ)是OSI模型中数据链路层和传输层的错误纠正协议之一。它通过使用确认和超时这两个机制,在不可靠服务的基础上实现可靠的信息传输。如果发送方在发送后一段时间之内没有收到确认帧,它通常会重新发送。ARQ包括停止等待ARQ协议和连续ARQ协议
# 停止等待ARQ协议
- 停止等待协议是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认(回复ACK)。如果过了一段时间(超时时间后),还是没有收到 ACK 确认,说明没有发送成功,需要重新发送,直到收到确认后再发下一个分组;
- 在停止等待协议中,若接收方收到重复分组,就丢弃该分组,但同时还要发送确认;
**优点:**简单
**缺点:**信道利用率低,等待时间长
# 连续ARQ协议
连续 ARQ 协议可提高信道利用率。发送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。接收方一般采用累计确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组都已经正确收到了。
**优点:**信道利用率高,容易实现,即使确认丢失,也不必重传。
**缺点:**不能向发送方反映出接收方已经正确收到的所有分组的信息。 比如:发送方发送了 5条 消息,中间第三条丢失(3号),这时接收方只能对前两个发送确认。发送方无法知道后三个分组的下落,而只好把后三个全部重传一次。这也叫 Go-Back-N(回退 N),表示需要退回来重传已经发送过的 N 个消息。
# 2. 校验和
TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
具体步骤:
分段准备:在计算校验和之前,数据被分成若干段。每个段由16位字(2个字节)组成,以便于高效计算。
填充:如果数据大小不是16位的整数倍,则在最后一个段中添加填充以使其达到16位。
校验和计算:发送方通过将数据视为一系列16位字并对它们求和来计算校验和。然后取这个和的反码作为最终的校验和值。
下面是计算校验和的步骤: a. 初始化一个校验和变量为0。 b. 从数据中取出第一个16位字。 c. 将这个16位字加到校验和中。 d. 如果在加法中产生了进位位(carry bit),将它加回到校验和中。 e. 继续处理下一个16位字,重复步骤b到d,直到处理完所有字。 f. 如果16位字的数量是奇数(由于填充导致的),则将最后一个8位与0相加,并加到校验和中。 g. 取校验和的反码(反转所有比特位)得到最终的校验和值。
校验和插入:发送方计算出校验和后,将这个16位值插入到TCP头中专门为校验和保留的字段中。
校验和验证:在接收方,对接收到的数据执行相同的过程,以重新计算校验和。然后将计算出的校验和与TCP头中接收到的校验和值进行比较。如果两者相匹配,则认为数据没有错误。如果两者不匹配,则表明数据可能存在错误,接收方可能会请求重新传输数据。
# 3. 三次握手四次手
# 4. 重传机制
# 5. 滑动窗口
# 6. 流量控制
# 7.拥塞控制
https://xiaolincoding.com/network/3_tcp/tcp_feature.html#%E9%87%8D%E4%BC%A0%E6%9C%BA%E5%88%B6
https://segmentfault.com/a/1190000022944999
https://cloud.tencent.com/developer/article/1679937
- http如何保证可靠传输
- quic如何保证可靠传输
- https证书有几类,单向还是多向
- mysql如何设计索引,如何不设计索引,给出实际场景
- 如何分库分表,根据什么键来,实际场景
- 分布式id生成?雪花算法
- kafka如何保证有序消费
- 分布式限流如何实现
- 调度算法
- 如何设计优先级调度算法