数据包在网络中是怎么一步步传输的?

一、从输入网址到页面加载,中间发生了什么?

你在浏览器输入一个网址,按回车,页面加载完成。

这个过程涉及了哪些环节?

本文从数据包的角度,完整拆解一次网络请求的全过程------从发送端的数据封装开始,经过中间设备的转发,到接收端的解封装结束。

二、数据在发送端:自上而下的封装过程

当你在浏览器输入某个网址并按下回车,数据从应用层开始,逐层向下传递,每一层添加对应的控制信息。

2.1 应用层

浏览器构造一个HTTP请求报文,包含请求行、请求头和请求体。例如:

text

复制代码
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Chrome/...

这段文本就是应用层的数据。HTTP协议负责定义客户端与服务器之间通信的格式。

应用层将这段数据交给传输层处理。此时的数据单位称为数据(Data)

2.2 传输层(TCP/UDP)

传输层收到应用层的数据后,根据应用层的需求选择TCP或UDP协议。

这里以TCP为例。传输层将数据分割成适当大小的数据段,并封装TCP头部。TCP头部包含以下关键字段:

字段 说明
源端口(Source Port) 浏览器随机分配的端口号
目的端口(Destination Port) 80(HTTP)或443(HTTPS)
序列号(Sequence Number) 数据段的编号,用于接收端重组
确认号(Acknowledgment Number) 确认已收到的数据
标志位(Flags) SYN、ACK、FIN等控制标志

封装完成后,数据单元称为数据段(Segment),交给网络层处理。

2.3 网络层(IP)

网络层收到数据段后,进行以下操作:

  1. 在数据段前面封装IP头部

  2. 查询路由表,决定从哪个网卡发出

IP头部包含以下关键字段:

字段 说明
源IP地址(Source IP) 发送设备的IP地址
目的IP地址(Destination IP) 接收设备的IP地址
TTL(Time to Live) 数据包的生存时间(跳数限制)
协议号(Protocol) 标识上层协议(6=TCP,17=UDP)

封装完成后,数据单元称为数据包(Packet),交给数据链路层处理。

2.4 数据链路层(以太网)

数据链路层收到数据包后,进行以下操作:

  1. 在IP包前面封装MAC头部

  2. 在IP包后面添加FCS(帧校验序列)尾部

MAC头部包含以下关键字段:

字段 说明
源MAC地址 发送网卡的MAC地址
目的MAC地址 下一跳设备的MAC地址(网关或目标设备)
类型(Type) 标识上层协议(0x0800=IPv4)

FCS尾部包含CRC校验码,用于接收端检测数据是否在传输过程中出错。

封装完成后,数据单元称为数据帧(Frame),交给物理层处理。

2.5 物理层

物理层将数据帧转换为比特流(0和1的序列),通过物理介质(网线、光纤、WiFi)发送出去。

三、数据在传输路径上的转发过程

数据从发送端发出后,经过多个网络设备的处理,最终到达接收端。

3.1 交换机:二层转发

数据到达交换机时,交换机工作在数据链路层,只查看MAC头部:

  1. 检查目的MAC地址

  2. 查找MAC地址表,确定对应的端口

  3. 从该端口转发数据帧

如果MAC地址表中没有对应的记录,交换机将数据帧从除接收端口外的所有端口广播出去------称为"洪泛"(Flooding)。目标设备收到后回应,交换机据此学习并记录新的MAC地址映射。

交换机的核心功能:在同一网络内,根据MAC地址转发数据帧。

交换机不检查IP头部,不关心数据内容。

3.2 路由器:三层转发

如果数据的目的IP不在当前子网内,数据会被发送到网关(路由器)。路由器工作在网络层:

  1. 剥离MAC头部,查看IP头部

  2. 检查目的IP地址

  3. 查询路由表,确定下一跳地址

  4. 重新封装MAC头部(源MAC变为路由器出口的MAC,目的MAC变为下一跳设备的MAC)

  5. 从对应端口转发数据包

路由器的核心功能:在不同网络之间,根据IP地址转发数据包。

每经过一个路由器,MAC地址会变化,但IP地址保持不变。TTL值减1。

四、数据在接收端:自下而上的解封装过程

数据到达接收端服务器后,过程完全反过来。

4.1 物理层

物理层收到比特流,还原为数据帧,交给数据链路层。

4.2 数据链路层

数据链路层执行以下操作:

  1. 检查FCS校验码,确认数据在传输过程中没有出错

  2. 如果校验通过,剥离MAC头部和FCS尾部

  3. 查看MAC头部中的"类型"字段(0x0800=IPv4),确定上层协议

  4. 将数据包交给网络层

4.3 网络层

网络层执行以下操作:

  1. 检查IP头部,确认目的IP地址是否为本机

  2. 剥离IP头部

  3. 查看IP头部中的"协议"字段(6=TCP),确定上层协议

  4. 将数据段交给传输层

4.4 传输层

传输层执行以下操作:

  1. 检查TCP头部,确认目的端口号

  2. 检查序列号是否连续,确认没有丢包

  3. 剥离TCP头部

  4. 将数据交给应用层

4.5 应用层

应用层收到原始数据,根据协议(HTTP)解析请求,生成响应(HTTP响应报文),通过同样的路径返回给客户端。

五、一个完整的传输路径图解

text

复制代码
发送端                                        接收端
┌─────────────┐                             ┌─────────────┐
│  应用层     │                             │  应用层     │
│  HTTP请求   │                             │  HTTP请求   │
└──────┬──────┘                             └──────▲──────┘
       │ 添加TCP头部                            │ 剥离TCP头部
┌──────▼──────┐                             ┌──────┴──────┐
│  传输层     │                             │  传输层     │
│  TCP头部    │                             │  TCP头部    │
│  + 数据     │                             │  + 数据     │
└──────┬──────┘                             └──────▲──────┘
       │ 添加IP头部                             │ 剥离IP头部
┌──────▼──────┐                             ┌──────┴──────┐
│  网络层     │                             │  网络层     │
│  IP头部     │                             │  IP头部     │
│  + TCP头部  │                             │  + TCP头部  │
│  + 数据     │                             │  + 数据     │
└──────┬──────┘                             └──────▲──────┘
       │ 添加MAC头部+FCS                        │ 剥离MAC头部+FCS
┌──────▼──────┐                             ┌──────┴──────┐
│ 数据链路层   │                             │ 数据链路层   │
│ MAC头部     │                             │ MAC头部     │
│ + IP头部    │                             │ + IP头部    │
│ + TCP头部   │                             │ + TCP头部   │
│ + 数据 + FCS│                             │ + 数据 + FCS│
└──────┬──────┘                             └──────▲──────┘
       │ 转换为比特流                           │ 还原为帧
┌──────▼──────┐   ┌───────┐   ┌──────┐   ┌──────┴──────┐
│  物理层     │───│交换机  │───│路由器│───│  物理层     │
│  比特流     │   │(二层) │   │(三层)│   │  比特流     │
└─────────────┘   └───────┘   └──────┘   └─────────────┘

最后

数据包在网络上传输的过程,可以概括为三个阶段:

  1. 发送端封装:数据自上而下逐层封装,每层添加控制信息

  2. 网络转发:交换机根据MAC地址转发,路由器根据IP地址转发

  3. 接收端解封装:数据自下而上逐层剥离,恢复原始数据

每一层只处理自己负责的信息,对上层数据内容不关心。这种分层设计保证了网络的灵活性和可扩展性。

相关推荐
新时代牛马36 分钟前
CFS调度源码:从 schedule() 到pick_next_entity 的vruntime 公平
linux·运维·网络
@insist12338 分钟前
系统集成项目管理工程师-采购、风险与干系人管理
网络·软考·系统集成项目管理工程师·软考中项·软件水平考试
Syc1102g1 小时前
在 Linux CentOS 系统中设置静态 IP
linux·网络·计算机网络·个人开发
Shadow(⊙o⊙)1 小时前
CMake实战Http+编译、链接选项的使用
网络·网络协议·http
十正2 小时前
用 HTTP 条件请求把“强一致“和“低成本
网络·后端·http
Horn Still Sounds2 小时前
Linux进程间通信:信号、消息队列、共享内存完整笔记
linux·网络·笔记
路弥行至2 小时前
ROS2 通信避坑实录:从 topic/msg 底层原理到一次内存错位复盘
网络·经验分享·笔记·其他·内存·topic·ros2
Alan CGH2 小时前
一次非寻常的压测优化经历
java·网络·压力测试
Yang96112 小时前
一人一机一手机:鼎讯G-4000A让光缆查找告别双人配合
网络