Qt 里写 QUdpSocket 发一串数据为例,用 4 层模型顺一遍流程
目录
你写代码这一步:应用层
OS 接手:传输层(UDP)
往下封装:网络层(IP)
落到网卡:网络接口层(链路层 + 物理层)
对端收到时(逆过程)
一句话总览(面试可背版)
你写代码这一步:应用层
QUdpSocket sock;
QByteArray data = "hello";
sock.writeDatagram(data, QHostAddress("192.168.1.100"), 9000);
在 4 层模型里,这就是应用层:
-
协议:应用层协议(你自己定义的“消息格式”)+ UDP 之上的协议(如果有,比如自定义报文头)。
-
你关心的东西:
-
目标 IP:
192.168.1.100 -
目标端口:
9000 -
要发的数据:
"hello"
-
到这里为止,你只是在“给操作系统下命令”:我要发一坨数据到某个 IP+端口。
OS 接手:传输层(UDP)
Qt 调 writeDatagram → 调用系统的 sendto / sendmsg → 进入内核的 UDP 传输层:
-
内核创建 UDP 头:
-
源端口(随机或你绑定的端口)
-
目的端口:9000
-
长度:UDP 头 + 你的数据长度
-
校验和:对伪首部 + UDP 头 + 数据算出来
-
-
得到一个 UDP 数据报:
[UDP头][你的data:"hello"]
传输层的任务:在这台主机上“端到端”(端口到端口)区分不同应用。
往下封装:网络层(IP)
UDP 报文交给 IP 层:
-
填 IP 头:
-
源 IP:本机 IP(比如
192.168.1.10) -
目的 IP:
192.168.1.100 -
协议号:17(表示是 UDP)
-
TTL、标识、分片相关字段等
-
-
根据路由表决定:
-
直接发给同一网段的主机?
-
还是发给网关(路由器)?
-
得到一个 IP 数据报:
[IP头][UDP头][data]
网络层的任务:决定这包要送到哪台机器。
落到网卡:网络接口层(链路层 + 物理层)
IP 数据报交给网卡驱动,对应 网络接口层:
-
链路层(以太网)
-
先通过 ARP 找到对方或网关的 MAC 地址
-
构造以太网帧:
[以太网头(目的MAC+源MAC+类型)][IP头][UDP头][data]["FCS校验"]
-
-
物理层
-
把这一帧转换成电信号/无线电信号,通过网线 / Wi-Fi 发出去。
-
网络接口层的任务:在一段物理链路上传输比特流。
对端收到时(逆过程)
对方机器或网关收到:
-
物理层:信号 → 比特流
-
链路层:校验 FCS,拆出 IP 数据报
-
网络层:检查目的 IP、TTL,若是本机就交给 UDP
-
传输层(UDP):检查端口 → 找到对应的 socket
-
应用层:比如对方用
QUdpSocket::readDatagram()把数据读出来
一句话总览(面试可背版)
Qt 代码调用
QUdpSocket(应用层)
→ 内核 UDP 加端口号和校验和(传输层)
→ IP 加源/目的 IP、选路由(网络层)
→ 以太网帧 + MAC + 物理信号(网络接口层)
→ 对端按相反顺序往上还原,到对方QUdpSocket。
你写 Qt 代码时,只要管 IP + 端口 + 数据,下面这整条 4 层链路,都是系统在背后自动替你做完的。
