当前位置: 首页 > news >正文

网络传输的实际收发情况及tcp、udp的区别

问题:

应用层数据准备好之后 交给传输层 tcp 按道理 这里应该会建立tcp连接 而建立连接的过程 就相当于走了接下来的网络 数据链路层 物理层 连接成功后 有原路返回到传输层 连接建立成功之后呢 应用层再把数据发给传输层 通过操作系统 sokect套接字 然后又走一遍 所以说 相当于走了两遍?


核心逻辑是对的——TCP 连接建立(三次握手)和后续应用层数据传输,确实都需要完整经过 “传输层→网络层→数据链路层→物理层” 的向下传递,以及接收方 “物理层→数据链路层→网络层→传输层” 的向上返回。但要注意两个细节修正:一是 “连接建立时还没有应用层数据”,二是 “应用层通过 Socket 交给操作系统的传输层”。

我们可以拆成 “TCP 连接建立” 和 “应用层数据传输” 两个阶段,一步步看清楚 “到底走了多少遍”:

阶段 1:TCP 连接建立(三次握手)—— 先 “建通道”,再 “传数据”

你说的 “建立连接的过程走后续层级” 完全正确,但有个前提:此时应用层还没传实际数据,只是发起了 “建连接的请求”
TCP 连接是 “端到端” 的(比如你的电脑 ↔ 服务器),建立连接需要双方通过 3 次 “控制报文”(不是应用数据)确认,这 3 次报文都要完整经过 “传输层→网络层→数据链路层→物理层”,具体流程如下:

握手步骤发起方报文内容(核心)层级传递路径目的
1. 第一次握手(SYN)你的电脑(客户端)“我想和你建立连接,我的初始序号是 X”客户端:传输层(TCP 生成 SYN 报文)→ 网络层(加 IP 头)→ 数据链路层(加 MAC 头)→ 物理层(发信号)→ 服务器:物理层→数据链路层→网络层→传输层(TCP 接收 SYN)客户端向服务器 “申请建连接”
2. 第二次握手(SYN+ACK)服务器(服务端)“我收到你的请求了,我的初始序号是 Y,确认你的序号 X”服务器:传输层(TCP 生成 SYN+ACK)→ 网络层→数据链路层→物理层→ 客户端:物理层→...→传输层(TCP 接收 SYN+ACK)服务器 “同意建连接” 并回复
3. 第三次握手(ACK)你的电脑(客户端)“我收到你的同意了,确认你的序号 Y”客户端:传输层(TCP 生成 ACK)→ 网络层→数据链路层→物理层→ 服务器:物理层→...→传输层(TCP 接收 ACK)客户端 “确认收到同意”,连接正式建立

从这个流程能看出:

  • 连接建立的 3 次握手,每次报文都完整走了 “向下→向上” 的层级(比如第一次握手是 “客户端向下发→服务器向上收”,第二次是 “服务器向下发→客户端向上收”),相当于 “3 次完整的层级传递”,而不是简单的 “1 去 1 回 = 2 遍”。
  • 这一步的核心是 “打通数据传输的通道”,全程没有应用层数据参与,只有 TCP 层的 “控制信号”。

阶段 2:应用层数据传输 ——“通道通了,再传货”

当 TCP 连接建立后,应用层才会通过Socket(套接字) 把实际数据交给传输层,开始真正的数据传输。这一步确实是 “又走了一遍层级”,但和握手阶段的 “控制报文” 完全独立:

  1. 数据发送端(你的电脑)

    • 应用层(比如浏览器)准备好数据(如 HTTPS 请求内容),通过Socket 接口(操作系统提供的 “应用层→传输层” 的桥梁),把数据交给操作系统的传输层(TCP)。
    • TCP 层会做两件事:① 把应用层数据分成合适的 “数据段”(避免数据太大);② 给每个数据段加 “TCP 头”(标注序号、确认号等,确保可靠传输)。
    • 然后数据段向下传递:网络层(加 IP 头,标源 IP / 目标 IP)→ 数据链路层(加 MAC 头,标相邻设备 MAC)→ 物理层(转成电信号 / 无线电波发送)。
  2. 数据接收端(服务器)

    • 物理层接收信号→数据链路层拆 MAC 头→网络层拆 IP 头→传输层(TCP)拆 TCP 头,验证数据是否完整(丢了就要求重传)。
    • 确认数据完整后,TCP 通过 Socket 把数据交给服务器的应用层(比如 Web 服务器程序)。
  3. 服务器回复数据

    • 服务器应用层处理后(比如生成网页内容),会按同样的流程(应用层→Socket→TCP→网络层→...→物理层)把数据发回给你的电脑,最终浏览器显示网页。

这一步的核心是 “传输应用层的实际数据”,每一次数据发送(不管是客户端→服务器,还是服务器→客户端),都要完整走一遍 “向下→向上” 的层级,相当于 “N 次完整的层级传递”(N 取决于数据交互次数)。

总结:不是 “简单两遍”,而是 “两个阶段的多次传递”

你的核心观察 “建立连接走一遍,传数据再走一遍” 是对的,但更精准的理解是:

  • 连接建立阶段:通过 3 次 “控制报文” 的层级传递(3 次向下→向上),打通 “客户端↔服务器” 的 TCP 通道,此时无应用数据。
  • 数据传输阶段:应用层数据通过 Socket 交给 TCP,每次数据交互(客户端发请求 / 服务器回响应)都要完整走一遍层级(向下→向上),这是 “新的传递流程”,和连接阶段独立。

可以类比成 “打电话”:

  1. 你拨号(第一次握手)→ 对方听到铃声接起(第二次握手)→ 你说 “喂,能听到吗”(第三次握手)—— 这 3 步是 “建连接”,没聊正事,但每一步都要通过 “手机→基站→运营商网络→对方手机”(对应 TCP/IP 层级)。
  2. 建完连接后,你说 “我想查个东西”(应用层数据)→ 对方回复 “好的,结果是 XXX”(应用层数据)—— 这两步是 “传数据”,同样要通过 “手机→基站→...→对方手机”,和之前的 “拨号阶段” 是独立的流程。

UDP和TCP的区别:

你的理解完全正确!TCP 的 “复杂流程”(三次握手、确认重传等)本质是为了可靠传输,而 UDP 放弃了这些机制,换来的就是速度快、开销小。这种 “可靠” 与 “快速” 的取舍,正是 TCP 和 UDP 设计差异的核心,背后是为了满足不同场景的需求 —— 比如浏览网页需要 “确保内容不丢”,而看直播需要 “确保画面不卡”,二者的优先级完全不同。

一、为什么 TCP 要设计成 “可靠传输”?—— 因为很多场景 “不能丢数据”

TCP 的核心目标是:让数据像 “寄快递” 一样,确保准确、完整地送到对方手里,哪怕中间经过无数路由器、网络波动。如果没有这些设计,数据在复杂的互联网中会频繁丢失、错乱,导致很多应用完全无法使用。

具体来说,TCP 的 “可靠机制”(也是它流程复杂的原因)包括 3 个关键部分,正好对应你的疑问:

  1. 三次握手建立连接:先 “确认双方通信能力正常”,再传数据
    就像打电话时,你先拨过去(“喂,能听到吗?”),对方回复(“能听到,你呢?”),你再确认(“我也能听到,开始说吧”)—— 这一步是为了避免 “你对着一个断网的设备发了半天数据,对方根本没收到”,白耗资源。

  2. 确认重传机制:对方没收到,就重新发
    TCP 每次发数据后,都会等对方回一个 “确认消息(ACK)”;如果超过时间没收到 ACK,就默认数据丢了,立刻重发。
    比如你传一个 100KB 的文件,分成 10 个 “数据段” 发送:如果第 5 段丢了,服务器会告诉客户端 “第 5 段没收到,重发”,直到所有段都确认收到,才会交给应用层。
    没有这个机制,一旦网络波动丢了一段数据,文件就会损坏、网页就会加载一半卡住。

  3. 顺序与流量控制:确保数据不乱序、不 “撑爆” 对方

    • 顺序:TCP 会给每个 “数据段” 编序号,哪怕中间数据段因为路由不同导致 “先发的后到”,服务器也能按序号重新排好,再交给应用层(比如序号 1、3 先到,服务器会等序号 2 到了再一起处理)。
    • 流量控制:如果客户端发数据太快,服务器来不及处理(比如服务器 CPU 占用 100%),会告诉客户端 “慢点发”,避免数据堆积丢失。

这些机制的代价是:额外的控制报文(如握手、ACK)、延迟(等确认的时间)、系统资源消耗,但换来了 “数据 100% 可靠”—— 这对网页浏览(HTTP/HTTPS)、文件传输(FTP)、聊天消息(微信文字)等场景至关重要:你肯定不希望下载的文件损坏、发的消息对方收不到。

二、UDP 为什么 “快”?—— 因为它放弃了所有 “可靠机制”,只做 “简单转发”

UDP 的设计思路完全相反:“我只负责把数据发出去,至于对方收没收到、数据有没有乱序,我一概不管”。它的流程简单到几乎没有额外开销,因此速度远快于 TCP。

具体来说,UDP 的 “快” 体现在 3 个方面:

  1. 不需要建立连接:应用层数据准备好,直接交给 UDP,UDP 加个 “UDP 头”(只标源端口、目标端口,没有序号、确认号),就交给网络层发出去 —— 跳过了 TCP 的 “三次握手”,节省了建立连接的时间。
    比如直播时,主播的画面每帧都是实时数据,UDP 不需要先 “握手”,直接把帧数据发出去,延迟极低。

  2. 不需要确认重传:UDP 发完数据就 “不管了”,不会等对方的 ACK,也不会重发 —— 少了 “等确认” 的延迟,也少了 “重发” 的资源消耗。
    比如视频通话时,即使丢了一两帧画面,你可能只会觉得 “卡了一下”,但不会影响后续画面;如果用 TCP,为了重传丢失的帧,反而会导致 “画面卡住等重传”,体验更差。

  3. 头部开销极小:TCP 头最小 20 字节,UDP 头只有 8 字节 —— 同样的带宽下,UDP 能传输更多 “实际数据”,减少了数据在网络中的传输时间。

三、TCP vs UDP:核心差异与应用场景对比

通过 “可靠” 和 “快速” 的取舍,TCP 和 UDP 分别适配了不同需求的场景,我们可以用表格清晰对比:

对比维度TCP(传输控制协议)UDP(用户数据报协议)
连接方式面向连接(需三次握手建立连接)无连接(直接发,不建连接)
可靠性可靠(确认重传、顺序控制、流量控制)不可靠(发完不管,可能丢包、乱序)
速度较慢(额外控制开销、等待确认)极快(无额外开销,无等待)
适用场景需确保数据完整的场景需低延迟、可容忍少量丢包的场景
典型应用举例- 网页浏览(HTTP/HTTPS)
- 文件传输(FTP)
- 聊天文字(微信 / QQ)
- 数据库交互(MySQL)
- 直播 / 视频通话(抖音直播、Zoom)
- 实时游戏(王者荣耀、LOL)
- 广播 / 组播(IPTV)
- 物联网传感器数据(温度 / 湿度,丢 1 条不影响)

总结:设计的本质是 “按需取舍”

TCP 的 “复杂” 不是为了麻烦,而是为了 “在不可靠的互联网中,提供可靠的数据传输”;UDP 的 “简单” 也不是为了简陋,而是为了 “在需要低延迟的场景中,牺牲一点可靠性换速度”。

就像现实中的 “快递”:

  • TCP 相当于 “顺丰特快”—— 全程跟踪、丢件必赔、送货上门(可靠),但价格高、速度稍慢;
  • UDP 相当于 “同城闪送”—— 不跟踪、丢件不赔,但速度极快、价格低,适合送 “晚了就没用” 的东西(比如生鲜、紧急文件)。

正是这种 “按需设计”,让 TCP 和 UDP 共同支撑起了整个互联网的应用生态。


文章转载自:

http://CZA0U3E6.rLbfp.cn
http://qHU1JsK4.rLbfp.cn
http://0HPBhhEX.rLbfp.cn
http://0X8fUUyU.rLbfp.cn
http://2Mb5nuuI.rLbfp.cn
http://y5jiiHaf.rLbfp.cn
http://jBH9V3pG.rLbfp.cn
http://Y02tFcHu.rLbfp.cn
http://Ng97Dsv4.rLbfp.cn
http://jrCtf9PH.rLbfp.cn
http://QwK5PXAq.rLbfp.cn
http://2jKQRzKO.rLbfp.cn
http://Vmc21HxM.rLbfp.cn
http://Sehrv0Bb.rLbfp.cn
http://TIQ36L1u.rLbfp.cn
http://RjYAy6ie.rLbfp.cn
http://K3NXXqiG.rLbfp.cn
http://OCGu6K5X.rLbfp.cn
http://EMuRaUOk.rLbfp.cn
http://uSqaTIb9.rLbfp.cn
http://eksFU8i4.rLbfp.cn
http://hwKmP1C6.rLbfp.cn
http://GqhZBIKw.rLbfp.cn
http://c7Flbibm.rLbfp.cn
http://UViGW7yZ.rLbfp.cn
http://iOHkhk6h.rLbfp.cn
http://ZcbDOGse.rLbfp.cn
http://PVAazwnu.rLbfp.cn
http://QFDvyctc.rLbfp.cn
http://fh9ckr7n.rLbfp.cn
http://www.dtcms.com/a/363587.html

相关文章:

  • python 创建websocket教程
  • 异常处理小妙招——1.别把“数据库黑话”抛给用户:论异常封装的重要性
  • GitHub每日最火火火项目(9.2)
  • 使用谷歌ai models/gemini-2.5-flash-image-preview 生成图片
  • Python/JS/Go/Java同步学习(第一篇)格式化/隐藏参数一锅端 四语言输出流参数宇宙(附源码/截图/参数表/避坑指南/老板沉默术)
  • 下载速度爆表,全平台通用,免费拿走!
  • Linux中断实验
  • VibeVoice 部署全指南:Windows 下的挑战与完整解决方案
  • 为什么需要锁——多线程的数据竞争是怎么引发错误的
  • 梯度消失问题:深度学习中的「记忆衰退」困境与解决方案
  • 从C语言入门到精通:代码解析与实战
  • 零知开源——STM32红外通信YS-IRTM红外编解码器集成灯控与显示系统
  • Obsidian本地笔记工具:构建知识网络关联笔记,支持Markdown与插件生态及知识图谱生成
  • 95%企业AI失败?揭秘LangGraph+OceanBase融合数据层如何破局!​
  • 【前端面试题✨】Vue篇(一)
  • 【XR技术概念科普】什么是注视点渲染(Foveated Rendering)?为什么Vision Pro离不开它?
  • 使用gsoap实现简单的onvif服务器:1、编译
  • SpringBoot 整合 RabbitMQ 的完美实践
  • @ZooKeeper 详细介绍部署与使用详细指南
  • 网站搭建应该选择什么服务器?
  • 人体姿态估计与动作分类研究报告
  • 四.shell脚本编程
  • 在时间序列中增加一个阶跃对长期趋势变化的影响
  • 大批量文件管理操作的linux与windows系统命令行终端命令
  • Linux内核进程管理子系统有什么第四十回 —— 进程主结构详解(36)
  • 【网络安全入门基础教程】网络安全行业,未来两年就业和再就业都会很难
  • git: 取消文件跟踪
  • Linux Shells
  • ubuntu24.04网络无法访问(网络问题)NAT网关写错了
  • MSVC, GCC, Clang