计算机网络(八)——数据转发过程
数据传输过程是一个非常复杂的过程,例如数据在转发的过程中会进行一系列的封装和解封装。
数据转发过程概述
数据可以在同一网络内或者不同网络间传输,数据转发过程也分为本地转发(同网段)和远程转发(跨网段),但两者的数据转发原理是基本一样的,都是遵循TCP/IP协议簇。对数据进行一系列的封装与解封装的操作。同一网段中封装的是目的地的MAC,不同网段封装的是网关MAC。
转发过程大致如下:
1、TCP数据段封装
首先当主机建立了到达目的地的TCP连接后,便开始对应用层数据进行TCP封装。 |
![]() |
|
2. IP数据包封装
将应用数据完成TCP封装之后,通过接口将数据传输到网络层进行IP封装。 |
![]() |
|
查找路由:确认目的IP地址主机A必须要拥有到达目的地的路由。每个主机都会独自维护各自的路由表项。主机A在发送数据前需要先检查是否能够到达目的端,这个过程是通过查找路由来完成的。 在此示例中,主机A拥有一条到达“任何网络”的路由,它发往其他网络的数据都会通过IP地址为10.1.1.1的接口转发到下一跳,即网关10.1.1.254。 |
|
ARP:确认目的MAC接下来的数据帧封装需要目的MAC地址,所以需要通过ARP协议获取下一步目的MAC。 |
|
3、以太网封装——数据链路层封装
在网络层获取完相关数据,结束IP封装之后,通过接口进入数据链路层完成以太网封装(封装MAC地址)。 |
![]() |
|
4、数据帧的转发过程
数据在完成数据帧封装之后,就可以进入物理层进行数据传输了。
![]() |
主机A工作在半双工状态下,所以会使用CSMA/CD来检测链路是否空闲。如果链路空闲,主机A会将一个前导码(Preamble)和一个帧首定界符(SFD)附加到帧头然后进行传输。
|
![]() |
本例中,
|
5、数据包的转发过程
![]() |
RTA收到此数据报文后,网络层会对该报文进行处理。RTA首先根据IP头部信息中的校验和字段,检查IP数据报文头部的完整性,然后根据目的IP地址查看路由表,确定是否能够将数据包转发到目的端。RTA还必须对TTL的值进行处理。另外,报文大小不能超过MTU值。如果报文大小超过MTU值,则报文将被分片。 网络层处理完成后,报文将被送到数据链路层重新进行封装,成为一个新的数据帧,该帧的头部会封装新的源MAC地址和目的MAC地址。如果当前网络设备不知道下一跳的MAC地址,将会使用ARP来获得。 |
6、数据帧解封装
![]() |
该示例中,服务器A处于一个共享以太网中,两台服务器都会收到RTB发送的数据帧。该帧的目的MAC地址与服务器B的接口MAC地址不匹配,所以会被服务器B丢弃。 服务器A成功收到该帧,并通过FCS校验。服务器A将利用帧中的类型字段来识别在网络层处理该数据的协议。该示例中,服务器A会将解封装后的此数据交给网络层的IP协议来进行处理。 RTB以服务器A的MAC地址作为目的MAC继续转发。服务器A接收到该数据帧后,发现目的MAC为自己的MAC,于是会继续处理该数据帧。 |
7、数据包解封装
![]() |
服务器A通过IP协议来处理该报文,首先会通过校验和字段来验证报文头的完整性,然后检查IP报文头中的目的IP地址是否与自己当前的IP地址匹配。 如果在源与目的之间的数据传输期间数据发生了报文分片,则报文会被目的端重新组合。标识字段用于标识属于同一数据源的分片报文,偏移量表示该分片在原分组中的相对位置。标志字段目前只有两位有意义,标志字段最低位为1,表示后面还有分片,为0表示这已经是最后一个数据片;中间一位为1表示不能分片,为0表示允许分片。所有的分片报文必须被目的端全部接收到后才会进行重新组合。 协议字段表示此数据包携带的上层数据是哪种协议的数据。需要注意的是,下一个报头并非总是传输层报头。例如,ICMP报文也是使用IP协议封装,协议字段值为0x01。 服务器A检查数据包的目的IP地址,发现目的IP与自己的IP地址相同。则服务器A剥掉数据包的IP头部后,会送往上层协议TCP继续进行处理。 |
8、数据段解封装(TCP解封装)
![]() |
当IP报文头被处理完并剥离后,数据段会被发送到传输层进行处理。在此示例中,传输层协议使用的是TCP,且发送端和接收端已经通过三次握手建立了连接。传输层收到该数据段后,TCP协议会查看并处理该数据段头部信息,其中目的端口号为80,用于表示处理该数据的应用层协议为HTTP协议。 TCP处理完头部信息后会将此数据段头部进行剥离,然后将剩下的应用数据发送到HTTP协议进行处理。 |
数据在进行二层和三层封装之前,主机需要了解哪些信息?
主机在封装数据包之前,必须要知道目的端IP地址。在封装数据帧之前,必须要知道去往目的网络的路由以及下一跳的MAC地址。
当数据帧发送到非目的主机时,非目的主机将会如何处理?
如果主机接收到一个不是发往自己的数据帧,在检验帧头中的目的MAC地址之后会丢弃该帧。
传输层如何能够准确的将数据交给特定应用?
传输层会检查TCP或UDP报文头中的目的端口号,以此来识别特定应用。
当两台主机同时访问服务器的HTTP服务,该服务器如何区分数据属于哪个会话?
服务器可以只通过源IP地址识别两台主机的HTTP流量,另外TCP报文头中包含的源端口也可以被用来区分同一台主机通过不同的浏览器发起的不同的会话。例如,两个来自源IP为10.1.1.1的HTTP流量使用的目的端口号都是80,但源端口号为1028和1035。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)