计算机网络 - TCP协议

通过一些问题来讨论 TCP 协议

  • 什么是 TCP ?举几个应用了 TCP 协议的例子
  • TCP协议如何保证可靠性?
  • tcp如何保证不会接受重复的报文?
  • Tcp粘包拆包问题了解吗?介绍一下,如何解决?
  • TCP拥塞控制与流量控制区别?
  • 现在我们视频面试用到哪些协议

1. 什么是 TCP ?举几个应用了 TCP 协议的例子

TCP 就是连接控制协议,是面向连接的,可靠的,基于字节流的传输层通信协议。

其中面向连接一定是一对一的连接。可靠性指无论网络链路中出现了什么状况,TCP 都会尽力保证一个报文能够无损坏,无冗余,按序到达。基于字节流是指用户消息通过 TCP 协议传输时,会被操作系统分组成多个 TCP 报文,并且这些报文之间是有序的

像我们平时用到的最多的网页中的 HTTP 协议,传输层协议就是 TCP。类似用到 TCP 的应用层还有 FTP 文件传输协议,SMTP 简单邮件传输协议和 SSH,它们的传输层都需要 TCP 来做可靠性保证

2. TCP协议如何保证可靠性?

首先 TCP 每次建立连接都需要三次握手,释放连接需要四次挥手来确保建立的传输通道是可靠的

其次,TCP 采用了连续 ARQ 协议来保证数据传输的正确性,同时还使用了滑动窗口机制来控制发送方的发送速率,保证接收方一定能接受到发送的数据,也就是流量控制机制

还有,TCP 利用序列号和校验和,来分别确保数据传输的有序性和完整性

最后在整个网络层面上,TCP 还使用慢启动,拥塞避免,快速重传和快速恢复来进行拥塞控制,避免网络阻塞带来的数据接好问题

3. tcp如何保证不会接受重复的报文?

这个是由 TCP 报文中的“序列号”字段保证的,TCP 在建立连接时,客户端和服务端都会将一个内核生成的随机数作为自己的初始序列号。在建立连接完成后,开始发送数据时,发送的一端会将“上次发送的序列号”加上“上次发送的数据长度”作为“本次报文的序列号”发送给对端。对端在收到数据包时,会根据序列号来确定接收到数据的顺序和是否重复,如果重复收到某个序列号的报文,则只会接收一次,其他的都丢弃

需要注意的是,在三次握手和四次挥手阶段,发送端序列号的值就不是“上次发送的序列号”加上“上次发送的数据长度”的值,而是“上次发送的序列号”加上 “1”

还有,序列号除了确保数据接收的“有序性”,还有用于 TCP 的流量控制中。具体的,TCP 连接的两端都会维护一个发送窗口和接受窗口。发送方根据 TCP 报文的序列号和发送窗口的大小来确定可以发送的数据量。接收方使用序列号和接收窗口大小来确定可以接收的数据量,并通知发送方来控制发送速率,以此来确保双方数据都能够被顺利接收。

4. Tcp粘包拆包问题了解吗?介绍一下,如何解决?

首先 TCP 是处在传输层的面向流的协议的协议,它本身不会按照应用开发者的期望,保持每次发送时都带有一个数据的边界,这可能导致接收端一次收到了多个应用层报文,需要应用开发者自己分开,也就是需要自己去实现“流”到“数据报”的功能。具体的解决,可以用“特殊字符作为边界”,也就是我们对于应用层的每个信息后面都加上一些特殊字符用来代表信息结束。当读到了这些特殊字符,就意味着已经读完了一个完整的消息。比如 HTTP 通过设置回车符和一个换行符来作为 HTTP 报文协议的边界。但需要注意的是,如果信息内容中刚好出现了这些字符,可能会导致信息提前结束和数据错乱,这时我们可以对这些个字符进行转义,避免这种情况。

其实还有一种“粘包”的含义:就是 TCP 在实现的时候,为了解决大量小报文场景下,包头比数据还大,导致传输的性价比太低的情况,采用了一种叫 Nagle 的算法。这个算法的效果就是将开发者多次发送的小数据,粘在同一个 TCP 报文中发出。这样可能就会导致先被发送的数据可能需要等待一段时间,才能跟后面才被发送的数据一起组成报文发送出去。但在实际中这种算法带来的延迟几乎可以忽略不计,绝大多数情况都是无感知的。只有在频繁进行超短信息的交互,比如只有几个字节的场景,禁用 Nagle 算法才能显著降低延迟。

5. TCP拥塞控制与流量控制区别?

两者诞生的原因就不同:

需要流量控制的原因是,端到端在通信时,发送方的速率与接收方的速率不一致,如果发送方发的速率太快,会导致接收方处理不过来;而如果发送方发送的太慢,数据就会有一定的延迟。那么此时就需要通过一种方法来控制发送方的速率,这个方法就叫“流量控制”

而拥塞控制不同于流量控制,它主要强调的是网络的拥塞,导致发送方发的数据包被堵在了半路,而接收方迟迟没收到数据包并返回接收到的最后一个包的确认报文,会让发送方误以为这个包丢了并重新发送,这不仅会浪费信道资源,还会使原来拥塞的网络雪上加霜。

6. 现在我们视频面试用到哪些协议

考虑到视频时对于延迟很敏感,所以应该具有 UDP 传输速度快的特性,但又能允许一定程度的丢包。但又不能丢包率太高,还应具备 TCP 有关数据传输可靠性的保证,确保不会视频着视频着突然画面就没有了的情况。所以我觉得应该是同时结合了 TCP 可靠性和 UDP 速度快的优点,这类协议我了解的是谷歌提出的 QUIC 协议。

QUIC 协议全称是“快速 UDP 互联网”连接,相比与当前应用多的 http2 + tcp + tls,它的优势主要在减少了 TCP 三次握手以及 TLS 握手的时间,拥有改进后的拥塞控制,以及拥有避免队头阻塞的多路复用。

首先由于 UDP 本身没有连接的概念,不需要三次握手,QUIC 在此基础上实现了 0 RTT 的安全握手,并且在大部分情况下也只需 0 RTT 就能实现数据发送。

为了保证可靠性传输,QUIC 在 TCP 关于拥塞控制方面的四个算法,包括慢启动,拥塞避免,快速重传,快速回复都做了相应的改进。比较突出的特点就是,QUIC 使用 packet number 代替了 TCP 的 sequence number,且每个 packet number 都严格递增。加上同样是 QUIC 提出的 Stream Offset,确保数据的顺序性和可靠性。

除此之外,QUIC 还在 Connection 和 Stream 两个级别都提供了流量控制。Stream 可以理解为一条 http 请求,Connection 可以类比一条 TCP 连接。QUIC 的多路复用就是指在一条 Connection 上同时存在多条 Stream,且多条 Stream 之间没有顺序依赖,也就消除了 TCP 中队头阻塞的问题。

大致只了解这么多。


诚恳欢迎大家提出意见

......(待续未完

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/77117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Fiddler 进行断点测试:调试网络请求

目录 一、什么是断点测试? 二、Fiddler 的断点功能 三、如何在 Fiddler 中设置断点? 步骤 1:启动 Fiddler 步骤 2:启用断点 步骤 3:捕获请求 步骤 4:修改请求或响应 四、案例:模拟登录失…

OpenCv高阶(三)——图像的直方图、图像直方图的均衡化

目录 一、直方图 1、计算并显示直方图 2、使用matplotlib方法绘制直方图(不划分小的子区间) 3、使用opencv的方法绘制直方图 (划分16个小的子亮度区间) 4、绘制彩色图像的直方图,将各个通道的直方图值都画出来 二、…

Flutter 与原生通信

Flutter 与原生之间的通信主要基于通道机制,包括 MethodChannel、EventChannel 和 BasicMessageChannel。 MethodChannel:用于 Flutter 与原生之间的方法调用,实现双向通信,适合一次性的方法调用并获取返回值,如 Flut…

前端面试-Vue篇

核心概念 Vue 3的响应式原理与Vue 2有何本质区别?Vue中虚拟DOM的diff算法优化策略有哪些?Vue组件间通信方式有哪些?适用场景分别是什么?Vue的生命周期钩子在Composition API中如何替代?Vue的模板编译过程是怎样的&…

光刻机研发与市场现状分析报告

1. 引言 光刻机(Lithography Machine)是半导体制造的核心设备,其技术水平和市场供应能力直接影响全球芯片产业的发展。随着人工智能(AI)、5G、高性能计算(HPC)和自动驾驶等技术的兴起&#xff0…

Missashe考研日记-day21

Missashe考研日记-day21 1 专业课408 学习时间:4h学习内容: 今天先把昨天学的内容的课后习题做了,整整75道啊,然后学了OS第二章关于CPU调度部分的内容,这第二章太重要了,以至于每一小节的内容都比较多&am…

【玩转全栈】—— Django+vue3+讯飞星火API 实现前端页面实时AI答复

技术栈:vue3 element-plus axios pinia router Django5 websocket 讯飞星火API 本文将实现一个 AI 聊天对话功能,将前端用户输入问题以及之前对话发送给后端,通过 api 访问大模型,返回前端实时对话数据。 调用 讯飞星火API…

广东广州一家IPO资产重组疑点重重,信息披露真实性存疑

作者:Eric 来源:IPO魔女 4月18日,广州瑞立科密汽车电子股份有限公司(简称“瑞立科密”)将接受深交所主板IPO上会审核。公司保荐机构为中信证券,拟募集资金为15.2162亿元。 瑞立科密过往资产重组疑点重重&a…

银河麒麟(Kylin) - V10 SP1桌面操作系统ARM64编译QT-5.15.12版本

银河麒麟(Kylin) - V10 SP1桌面操作系统ARM64编译QT-5.15.12版本 原因 测试Kylin-Desktop-V10-SP1-General-Release-2303-arm64系统下,编译QT-5.15.12版本已做测试。 测试环境 测试板配置 型号:LM-D2000-NONE-1w-V01-pc_A2150 CPU:飞腾D20…

查看前端项目依赖树型结构关系图的详细方法,涵盖 命令行工具 和 可视化工

以下是查看前端项目依赖树型结构关系图的详细方法&#xff0c;涵盖 命令行工具 和 可视化工具&#xff1a; 一、命令行工具生成依赖树 1. npm # 查看项目依赖树&#xff08;文本形式&#xff09; npm ls# 查看指定包的依赖树 npm ls <package-name># 生成JSON格式的依…

Ollama高并发测试

本文主要来测试一下ollama的高并发能力。 具体配置如下&#xff1a; 一、Ollama默认参数执行 我们打开4个窗口&#xff0c;然后分别让DeepSeek “给我讲一个笑话” &#xff0c;看下不同窗口的答题顺序。 通过答题顺序可以看到&#xff0c;在不进行参数设置时&#xff0c;模…

资源管理与HPA:让Kubernetes应用自动伸缩

引言&#xff1a;从“手动挡”到“自动驾驶” 想象我们驾驶一辆汽车&#xff0c;手动调节油门和换挡不仅费力&#xff0c;还难以应对突发状况。我们的应用服务也一样&#xff0c;在面对突然的流量增长&#xff0c;内存使用暴涨该如何应对。HPA&#xff08;Horizontal Pod Auto…

Windows 下 MongoDB ZIP 版本安装指南

在开发和生产环境中&#xff0c;MongoDB 是一种非常流行的 NoSQL 数据库&#xff0c;以其灵活性和高性能而受到开发者的青睐。对于 Windows 用户来说&#xff0c;MongoDB 提供了多种安装方式&#xff0c;其中 ZIP 版本因其灵活性和轻量级的特点&#xff0c;成为很多开发者的首选…

【Linux网络与网络编程】11.数据链路层mac帧协议ARP协议

前面在介绍网络层时我们提出来过一个问题&#xff1a;主机是怎么把数据交给路由器的&#xff1f;那里我们说这是由数据链路层来做的。 网络上的报文在物理结构上是以mac帧的形式流动的&#xff0c;但在逻辑上是以IP流动的&#xff0c;IP的流动是需要mac帧支持的。 数据链路层解…

多模态思维链AI医疗编程:从计算可持续性到开放域推理的系统性解决方案

多模态思维链AI医疗编程:从计算可持续性到开放域推理的系统性解决方案 医疗AI领域的多模态思维链技术正在重塑临床决策支持、医学影像分析和医疗流程优化的范式。本指南从计算可持续性、错误传播控制、伦理安全防护和通用性扩展四大维度,系统解析医疗大模型落地落地的关键要…

代理模式深度解析

目录 一 静态代理 1.1 优点 1.2 缺点 1.3 适用场景 二 JDK动态代理 1 JDK动态代理的工作原理 1.1 创建代理类 1.2 加载代理类 1.3 实现方法调用 2. Proxy.newProxyInstance() 的核心工作流程 方法签名 工作步骤 3. 代理类的生成与加载 3.1 代理类生成的关键方法 …

Spring Cache与Redis集成原理

一、核心架构图解 #mermaid-svg-aiWGQLhmWx7kOfLz {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-aiWGQLhmWx7kOfLz .error-icon{fill:#552222;}#mermaid-svg-aiWGQLhmWx7kOfLz .error-text{fill:#552222;stroke:#5…

编程技能:调试02,设置断点与删除断点

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏&#xff0c;故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 &#xff08;一&#xff09;WIn32 专栏导航 上一篇&#xff1a;编程技能&#xff1a;调试01&#xff0c;调试介绍 回到目录 下…

flink写doris时的优化

1.概念 doris并不擅长高频、小量数据的导入&#xff1b; 因为doris每一次数据导入都会在be节点上生成数据文件&#xff1b;如果高频导入小量数据&#xff0c;就会在存储层产生大量的小文件&#xff08;必然会影响到后续的查询效率&#xff0c;也会对系统产生更多的compaction…

ElementNotInteractableException原因及解决办法

在自动化测试中,ElementNotInteractableException是一个常见的异常,它通常发生在尝试与网页上的某个元素进行交互(例如点击、输入等操作)时,但由于该元素当前不可交互。这可能由多种原因引起,以下是一些常见的原因及其解决方法: 元素未完全加载 如果尝试与页面上的元素交…