网络问题之TCP/UDP协议

news2025/4/15 14:38:41

1. TCP是什么?

TCP(Transmission Control Protocol,传输控制协议)是互联网核心协议之一,属于传输层协议,为应用程序提供可靠的、面向连接的字节流服务。

基本特性

  • 可靠性:通过确认机制、重传机制、校验和等确保数据准确送达

  • 面向连接:通信前需建立连接(三次握手),结束后断开连接(四次挥手)

  • 字节流服务:将数据视为无结构的字节序列,不保留消息边界

  • 全双工通信:双方可同时发送和接收数据

  • 流量控制:通过滑动窗口机制防止发送方淹没接收方

  • 拥塞控制:动态调整发送速率避免网络拥塞

2.UDP是什么?

UDP(User Datagram Protocol,用户数据报协议)是互联网核心协议之一,与TCP同属传输层协议,但提供完全不同的服务模型。

基本特性

  • 无连接:通信前不需要建立连接,直接发送数据

  • 不可靠传输:不保证数据送达、不保证顺序、没有确认机制

  • 无拥塞控制:发送速率完全由应用层控制

  • 面向报文:保留应用程序定义的报文边界

  • 轻量级:头部开销小(仅8字节)

  • 支持广播/多播:可以向多个接收者同时发送数据

3. 与UDP的对比

特性TCPUDP
连接方式面向连接(需握手)无连接
可靠性可靠传输(确认+重传)不可靠传输
数据顺序保证顺序不保证顺序
传输效率相对较低(有控制开销)较高(头部仅8字节)
流量控制有(滑动窗口)
典型应用Web浏览、文件传输、邮件视频流、DNS查询、游戏

    4.TCP为啥要三次握手 四次挥手

    三次握手的必要性

    TCP需要三次握手(3-way handshake)建立连接的原因:

    1. 防止历史重复连接初始化造成的混乱
    • 如果只有两次握手,当网络中存在延迟的旧连接请求到达服务器时,服务器会误认为这是新的连接请求而建立连接

    • 三次握手机制下,客户端可以识别出这是历史重复连接(RST置位),从而拒绝该连接

    2. 同步双方的初始序列号(ISN)
    • 每次TCP连接双方都需要随机生成初始序列号

    • 三次握手确保双方的序列号能被可靠同步:

      复制

      客户端发送:SYN=1, seq=x
      服务端回复:SYN=1, ACK=1, seq=y, ack=x+1
      客户端确认:ACK=1, seq=x+1, ack=y+1
    3. 避免资源浪费
    • 如果是两次握手,服务器收到SYN就会分配资源建立连接

    • 当客户端不响应时会造成服务器资源浪费

    • 三次握手确保双方都有发送和接收能力后才建立连接

    技术本质

    三次握手是保证可靠数据传输的最小通信次数,确保:

    1. 双方都能确认对方的收发能力正常

    2. 双方就初始序列号达成一致

    3. 防止历史连接干扰

    四次挥手的必要性

    TCP需要四次挥手(4-way handshake)断开连接的原因:

    1. TCP的全双工特性
    • TCP连接是双向的,每个方向必须单独关闭

    • FIN表示"我没有数据要发送了",但还可以接收数据

    • 因此需要两个方向的分别关闭:

      复制

      客户端发送FIN → 服务器回复ACK
      服务器发送FIN → 客户端回复ACK
    2. 确保数据能够完整传输
    • 当一方发送FIN时,可能还有数据在传输途中

    • 四次挥手设计允许在收到FIN后继续发送剩余数据

    • 对比直接同时关闭(RST)的暴力断开方式更加优雅

    3. TIME_WAIT状态的重要性
    • 主动关闭方会进入2MSL(报文最大生存时间)的TIME_WAIT状态

    • 两个重要作用:
      a) 确保最后一个ACK能到达对端(如果丢失,对端会重发FIN)
      b) 让网络中残留的该连接报文都失效,避免影响新连接

    特殊情况

    在某些情况下可以合并为三次挥手:

    • 当服务器收到客户端的FIN后,如果也没有数据要发送了,可以将自己的FIN和ACK合并发送

    • 但这不是标准做法,多数实现还是保持四次挥手

    常见问题解答

    Q: 为什么不能合并第二次和第三次握手?
    A: 因为第二次握手是服务端的SYN+ACK,表示服务端的序列号初始化和对客户端SYN的确认。第三次握手是客户端对服务端SYN的确认,两者目的不同。

    Q: 为什么TIME_WAIT需要2MSL时间?
    A: 1MSL确保主动方的ACK能到达对端,另1MSL确保对端重传的FIN能到达。2MSL确保两个方向上的残留报文都消失。

    Q: 如果第三次握手丢失会怎样?
    A: 服务端会超时重传SYN+ACK,客户端收到后会再次发送ACK。如果多次重传失败,服务端最终会关闭这个半连接。

    Q: 为什么建立连接是三次而关闭连接是四次?
    A: 建立连接时服务端的SYN和ACK可以合并发送,但关闭连接时服务端收到FIN后可能还有数据要发送,所以ACK和FIN不能立即合并发送。

    5.TCP为啥会粘包

    tcp 粘包可能发生在发送端或者接收端,分别来看两端各种产生粘包的原因:

    • 发送端粘包:发送端需要等缓冲区满才发送出去,造成粘包;
    • 接收方粘包:接收方不及时接收缓冲区的包,造成多个包接收。

    6.如何解决TCP粘包问题

    tcp粘包/拆包的解决办法
    TCP粘包/拆包的解决方法主要包括协议设计优化和框架级解码器支持,核心思路是为数据包定义明确的边界规则。‌

    主要解决方案

    ‌固定长度法‌
    发送方将每个数据包封装为固定长度(如200字节),不足部分填充特定字符(如空格或0)。接收方按固定长度读取数据,避免粘包/拆包。 ‌1
    示例:设定每个数据包长度为100字节,发送端填充不足部分,接收端每次读取100字节。

    ‌特殊分隔符法‌
    在数据包末尾添加特定分隔符(如\r ),接收方根据分隔符拆分数据。例如FTP协议使用换行符作为边界。 ‌1
    适用场景:文本协议或需要人工可读的数据格式。

    ‌消息头定义长度法‌
    在数据包头部添加长度字段(如4字节的int值),接收方先读取长度信息,再按该长度读取完整数据包。 ‌1
    优势:灵活适配变长数据,广泛应用于自定义协议设计。

    ‌应用层协议封装‌
    设计更复杂的协议规范,例如将消息分为消息头和消息体,头部包含校验、版本等信息,消息体按业务逻辑扩展。 ‌12
    典型应用:Netty等框架通过:ml-search[LengthFieldBasedFrameDecoder]支持此类协议。

    ‌框架级解码器支持‌
    使用网络框架(如Netty)内置的解码器自动处理粘包/拆包:

    FixedLengthFrameDecoder:固定长度解码; ‌3
    LineBasedFrameDecoder:基于换行符分割;
    DelimiterBasedFrameDecoder:自定义分隔符;
    LengthFieldBasedFrameDecoder:头部含长度的通用方案。 ‌
    优势:减少手动处理复杂度,提升开发效率。
    其他补充

    ‌HTTP协议的解决方案‌:通过Content-Length明确数据长度,或使用chunked编码分块传输,天然规避粘包问题。 ‌
    ‌UDP无粘包问题‌:因其面向数据报且自带消息边界保护。
    ‌建议结合具体场景选择方案‌:简单文本通信可用分隔符法,高性能场景推荐消息头长度法或Netty框架集成。

    7.TCP的拥塞控制机制是如何工作的?

    TCP拥塞控制包含四个核心算法:

    1. 慢启动(Slow Start)

      • 初始拥塞窗口(cwnd)为1 MSS

      • 每收到一个ACK,cwnd指数增长(1,2,4,8...)

      • 当cwnd达到慢启动阈值(ssthresh)时进入拥塞避免阶段

    2. 拥塞避免(Congestion Avoidance)

      • cwnd线性增长(每RTT增加1 MSS)

      • 当检测到丢包时,调整ssthresh为当前cwnd的一半

    3. 快速重传(Fast Retransmit)

      • 收到3个重复ACK时立即重传丢失的报文段

      • 不等待超时重传计时器

    4. 快速恢复(Fast Recovery)

      • 重传丢失的报文段后,cwnd = ssthresh + 3 MSS

      • 每收到一个重复ACK,cwnd增加1 MSS

      • 当收到新数据的ACK时,退出快速恢复

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

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

    相关文章

    vue3腾讯云直播 前端拉流(前端页面展示直播)

    1、引入文件&#xff0c;在index.html <link href"https://tcsdk.com/player/tcplayer/release/v5.3.2/tcplayer.min.css" rel"stylesheet" /><!--播放器脚本文件--><script src"https://tcsdk.com/player/tcplayer/release/v5.3.2/t…

    【MYSQL从入门到精通】数据库基础操作、数据类型

    目录 一些基础操作语句 创建库名 选择要操作的数据库 删除数据库 磁盘中删除文件的原理 数据库安全的各种措置 查看MYSQL的帮助 数值类型 字符串类型 日期类型 一些基础操作语句 1.使用客户端工具连接数据库服务器&#xff1a;mysql -uroot -p 2.查看所有数据库&am…

    论文阅读笔记——Multi-Token Attention

    MTA 论文 在 Transformer 中计算注意力权重时&#xff0c;仅依赖单个 Q 和 K 的相似度&#xff0c;无法有效捕捉多标记组合信息。&#xff08;对于 A、B 两个词&#xff0c;单标记注意力需要分别计算两个词的注意力分数&#xff0c;再通过后处理定位共同出现的位置或通过多层隐…

    vue3 antdesign table表格特定单元格背景变色

    效果&#xff1a; <a-table :columns"columnsAll" :data-source"tableAllData"bordered size"middle" :scroll"{ x: 100,y: 600 }" :pagination"false"style"margin: 0 10px 10px 10px;" ><template #…

    【C语言】--- 编译和链接

    编译和链接 1. 翻译环境和运行环境2. 翻译环境2.1 预处理2.2 编译2.2.1 词法分析2.2.2 语法分析2.2.3 语义分析 2.3 汇编2.4 链接 3. 运行环境 1. 翻译环境和运行环境 计算机只能运行二进制指令&#xff0c;所以我们的.c的文本程序需要先翻译为二进制程序才能被计算机执行。在…

    深入解析Python爬虫技术:从基础到实战的功能工具开发指南

    一、引言:Python 爬虫技术的核心价值 在数据驱动的时代,网络爬虫作为获取公开数据的重要工具,正发挥着越来越关键的作用。Python 凭借其简洁的语法、丰富的生态工具以及强大的扩展性,成为爬虫开发的首选语言。根据 Stack Overflow 2024 年开发者调查,68% 的专业爬虫开发者…

    前端 Vue: Cannot find module XX or its corresponding type declarations.

    记一个常见错误&#xff0c;每次创建完新的vuetsvite项目&#xff0c;在配置路由的时候总会找不到vue文件&#xff0c;我用的是Webstorm&#xff0c;在设置里面修改以下设置&#xff0c;即可消除警告。

    数字内容体验案例解析与行业应用

    数字内容案例深度解析 在零售行业头部品牌的实践中&#xff0c;数字内容体验的革新直接推动了用户行为模式的转变。某国际美妆集团通过搭建智能内容中台&#xff0c;将产品信息库与消费者行为数据实时对接&#xff0c;实现不同渠道的动态内容生成。其电商平台首页的交互式AR试…

    HBuilderX中uni-app打包Android(apk)全流程超详细打包

    一、Android生成打包证书 1、Android平台签名证书(.keystore)生成指南_android 签名生成-CSDN博客&#xff08;如果不上架应用商店可以跳过&#xff0c;可以使用云端证书&#xff09; 二、打开manifest.json配置基础设置 三、配置安卓应用图标 四、配置安卓启动页图片 五、…

    多模态大模型重塑自动驾驶:技术融合与实践路径全解析

    目录 1、 引言&#xff1a;AI与自动驾驶的革命性融合 2、五大领先多模态模型解析 2.1 Qwen2.5-Omni&#xff1a;全模态集大成者 2.2. LLaVA&#xff1a;视觉语言理解专家 2.3. Qwen2-VL&#xff1a;长视频理解能手 2.4. X-InstructBLIP&#xff1a;跨模态理解框架 2.5. …

    vue2 el-element中el-select选中值,数据已经改变但选择框中不显示值,需要其他输入框输入值才显示这个选择框才会显示刚才选中的值。

    项目场景&#xff1a; <el-table-column label"税率" prop"TaxRate" width"180" align"center" show-overflow-tooltip><template slot-scope"{row, $index}"><el-form-item :prop"InquiryItemList. …

    OFDM CP 对解码影响

    OFDM符号间会存在ISI&#xff0c;为了解决该问题在符号间插入了循环前缀&#xff0c;可以说这个发明是OFDM能够实用的关键&#xff0c;在多径信道中CP可以有效的解决符号间干扰。3GPP中对于不同SCS 定义了不同的CP长度&#xff1a; 5G Cyclic Prefix (CP) Design -5G Physical …

    Vue3.5 企业级管理系统实战(十四):动态主题切换

    动态主题切换是针对用户体验的常见的功能之一&#xff0c;我们可以自己实现如暗黑模式、明亮模式的切换&#xff0c;也可以利用 Element Plus 默认支持的强大动态主题方案实现。这里我们探讨的是后者通过 CSS 变量设置的方案。 1 组件准备 1.1 修改 Navbar 组件 在 src/layo…

    解决Ubuntu20.04安装ROS2的问题(操作记录)

    一、ROS 系统安装版本选择 每版的Ubuntu系统版本都有与之对应ROS版本&#xff0c;每一版ROS都有其对应版本的Ubuntu版本&#xff0c;切记不可随便装。ROS 和Ubuntu之间的版本对应关系如下&#xff1a;&#xff08; 可以从这个网站查看ROS2的各个发行版本的介绍信息。&#xff…

    C# 设置Excel中文本的对齐方式、换行、和旋转

    在 Excel 中&#xff0c;对齐、换行和旋转是用于设置单元格内容显示方式的功能。合理的设置这些文本选项可以帮助用户更好地组织和展示 Excel 表格中的数据&#xff0c;使表格更加清晰、易读&#xff0c;提高数据的可视化效果。本文将介绍如何在.NET 程序中通过C# 设置Excel单元…

    RPA VS AI Agent

    图片来源网络 RPA&#xff08;机器人流程自动化&#xff09;和AI Agent&#xff08;人工智能代理&#xff09;在自动化和智能化领域各自扮演着重要角色&#xff0c;但它们之间存在显著的区别。以下是对两者区别的详细分析&#xff1a; 一、定义与核心功能 RPA&#xff08;机…

    uniapp大文件分包

    1. 在pages.json中配置 "subPackages":[{"root":pagesUser,"pages":[{"path":mine/xxx,"style":xxx },{"path":mine/xxx,"style":xxx}]},{"root":pagesIndex,"pages":[{"p…

    Spark-core编程

    sortByKey 函数说明 join 函数说明 leftOuterJoin 函数说明 cogroup 函数说明 RDD行动算子&#xff1a; 行动算子就是会触发action的算子&#xff0c;触发action的含义就是真正的计算数据。 reduce 函数说明 collect 函数说明 foreach 函数说明 count 函数说明 first …

    2025年的Android NDK 快速开发入门

    十年前写过一篇介绍NDK开发的文章《Android实战技巧之二十三&#xff1a;Android Studio的NDK开发》&#xff0c;今天看来已经发生了很多变化&#xff0c;NDK开发变得更加容易了。下面就写一篇当下NDK开发快速入门。 **原生开发套件 (NDK) **是一套工具&#xff0c;使开发者能…

    基于springboot的“嗨玩旅游网站”的设计与实现(源码+数据库+文档+PPT)

    基于springboot的“嗨玩旅游网站”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;springboot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 局部E-R图 系统首页界面 系统注册…