网络相关知识上
160.12.2网络相关知识(上)
/* 以下是标准库 W5500 客户端例程 main.c 中本节查看的网络参数装载函数,仅保留课堂涉及的业务配置并逐行解释。 */
void Load_Net_Parameters(void) /* 把示例网络参数写入驱动层使用的全局数组。 */
{ /* 网络参数装载开始。 */
Gateway_IP[0] = 192U; /* 设置默认网关地址的第 1 个字节。 */
Gateway_IP[1] = 168U; /* 设置默认网关地址的第 2 个字节。 */
Gateway_IP[2] = 1U; /* 设置默认网关地址的第 3 个字节。 */
Gateway_IP[3] = 1U; /* 得到网关 192.168.1.1;同网段直连实验实际不会经它转发。 */
Sub_Mask[0] = 255U; /* 设置子网掩码第 1 个字节。 */
Sub_Mask[1] = 255U; /* 设置子网掩码第 2 个字节。 */
Sub_Mask[2] = 255U; /* 设置子网掩码第 3 个字节。 */
Sub_Mask[3] = 0U; /* 得到 255.255.255.0,即前缀长度 /24。 */
Phy_Addr[0] = 0x0CU; /* 设置示例 MAC 地址第 1 个字节;实际产品必须保证地址唯一。 */
Phy_Addr[1] = 0x29U; /* 设置示例 MAC 地址第 2 个字节。 */
Phy_Addr[2] = 0xABU; /* 设置示例 MAC 地址第 3 个字节。 */
Phy_Addr[3] = 0x7CU; /* 设置示例 MAC 地址第 4 个字节。 */
Phy_Addr[4] = 0x00U; /* 设置示例 MAC 地址第 5 个字节。 */
Phy_Addr[5] = 0x01U; /* 得到示例 MAC 地址 0C:29:AB:7C:00:01。 */
IP_Addr[0] = 192U; /* 设置 W5500 本机 IPv4 地址第 1 个字节。 */
IP_Addr[1] = 168U; /* 设置 W5500 本机 IPv4 地址第 2 个字节。 */
IP_Addr[2] = 1U; /* 设置 W5500 本机 IPv4 地址第 3 个字节。 */
IP_Addr[3] = 199U; /* 得到 W5500 本机地址 192.168.1.199。 */
S0_Port[0] = 0x13U; /* 写 Socket 0 本地端口的高字节,0x13 是 5000 的高 8 位。 */
S0_Port[1] = 0x88U; /* 写低字节,0x1388 换成十进制是本地端口 5000。 */
S0_DIP[0] = 192U; /* 设置 Socket 0 目标 IPv4 地址第 1 个字节。 */
S0_DIP[1] = 168U; /* 设置 Socket 0 目标 IPv4 地址第 2 个字节。 */
S0_DIP[2] = 1U; /* 设置 Socket 0 目标 IPv4 地址第 3 个字节。 */
S0_DIP[3] = 190U; /* 得到目标电脑地址 192.168.1.190。 */
S0_DPort[0] = 0x17U; /* 写目标端口高字节,0x17 是 6000 的高 8 位。 */
S0_DPort[1] = 0x70U; /* 写目标端口低字节,0x1770 换成十进制是 6000。 */
S0_Mode = TCP_CLIENT; /* 让 W5500 的 Socket 0 以 TCP 客户端模式主动连接电脑。 */
} /* 网络参数装载结束。 */
一、网络相关知识
本节围绕 W5500 与电脑网线直连实验,介绍静态/动态地址、IPv4/IPv6、子网、默认网关、MAC、ipconfig、ping 和 DNS。先记住网络定位的三个层次:
- MAC 地址用于本地以太网链路上的一跳交付。
- IP 地址用于在网络层定位接口并进行跨网络路由。
- TCP/UDP 端口用于把到达某台主机的数据交给具体程序或 Socket。
因此,IP 和端口不是同一种“地址”。把信件类比成网络数据:IP 像楼房地址,端口像房间号,MAC 更像当前这一段配送链路要交给哪块网卡。
1.1 静态和动态
1.1.1 控制面板网络和Internet
动态配置通常由 DHCP 客户端向 DHCP 服务器申请。家用网络中 DHCP 服务器常在路由器或手机热点里,它不只可以给出 IPv4 地址,还可给出子网掩码、默认网关、DNS 服务器和租期。地址是“租用”的,设备重连后不保证永远得到同一个值。
静态配置由用户或固件明确指定地址。静态不等于公网,也不等于地址永远有效;它只表示当前接口没有依靠 DHCP 动态取得这组参数。手工设置时必须避免和其他设备重复。
本实验中,W5500 固件写死为 192.168.1.199/24,网线又直接连接电脑,没有 DHCP 服务器替电脑分配同网段地址。为使两端可直接通信,需要把电脑的有线网卡配置为例如:
| 项目 | 电脑有线网卡 | W5500 |
|---|---|---|
| IPv4 地址 | 192.168.1.190 | 192.168.1.199 |
| 子网掩码 | 255.255.255.0(/24) | 255.255.255.0(/24) |
| TCP 端口 | 网络助手监听 6000 | 本地 5000,连接目标 6000 |
| 默认网关 | 直连且只访问对端时可留空 | 源码写 .1,同网段通信不使用它 |
| DNS | 只按 IP 直连时可留空 | 本实验不解析域名 |
Windows 传统界面路径是“控制面板 → 网络和 Internet → 网络和共享中心 → 更改适配器设置 → 以太网属性 → Internet 协议版本 4(TCP/IPv4)”。不同 Windows 版本也可以从“设置”中修改 IP 分配。
需要选择实际插着 W5500 网线的以太网适配器,不要误改 WLAN、蓝牙或虚拟机网卡。实验结束后若该网口平时依赖路由器上网,应改回“自动获得 IP 地址”,否则以后接入其他网络可能无法通信。
网线直连不意味着理论上“必须静态 IP”:操作系统还可能使用 IPv4 链路本地地址等机制。这里必须手动配 .190,是因为 W5500 示例已固定为 .199/24,两端必须拥有兼容的地址和路由。
1.1.2 项目代码
本例 Socket 0 的关键参数是:
- 本地端点:
192.168.1.199:5000。 - 远端端点:
192.168.1.190:6000。 - 工作方式:W5500 为 TCP Client,电脑网络助手为 TCP Server。
客户端连接时,远端 IP 必须指向电脑的有线网卡,远端端口必须与网络助手的监听端口相同。本地端口不必等于服务端端口;TCP 连接由源 IP、源端口、目标 IP、目标端口以及协议共同区分。
源码用两个字节保存端口:0x13 × 256 + 0x88 = 5000,0x17 × 256 + 0x70 = 6000。网络协议通常按高字节在前表示多字节字段,因此驱动按高、低字节组合。
示例 MAC 0C:29:AB:7C:00:01 只是现成工程值,不应复制到多台同时联网的设备。量产设备应使用合法分配且唯一的 MAC;实验性本地地址也应正确设置“本地管理”位并确保当前二层网络内不重复。
1.1.3 思维导图总结
“网段就是 IPv4 前三段”只对本例的 /24 掩码成立。通用判断方法是把 IP 地址与子网掩码逐位进行 AND(按位与):
192.168.1.190 AND 255.255.255.0 = 192.168.1.0
192.168.1.199 AND 255.255.255.0 = 192.168.1.0
结果相同,所以两端判断彼此在同一子网,可以直接通过 ARP 找到对方 MAC 并发送以太网帧。在常规 /24 子网中,.0 是网络地址、.255 是定向广播地址,通常不分配给普通主机;.190 和 .199 都可作主机地址。
若目标不在本地子网,主机才把包交给默认网关。网关通常是本地路由器的一个接口,它根据路由表把数据转发到其他网络。子网掩码负责判断“目标是否同网段”,网关负责“不同网段时下一跳交给谁”;网关不是用来换算或校验 IP 的。
本例电脑与 W5500 同为 192.168.1.0/24,因此数据不会经过代码填写的 192.168.1.1。直连线上即使不存在 .1 这个设备,.190 与 .199 仍应能够通信。
1.2 IPV4和IPV6
| 项目 | IPv4 | IPv6 |
|---|---|---|
| 地址长度 | 32 bit | 128 bit |
| 常见写法 | 4 个十进制八位组,如 192.168.1.199 | 8 组十六进制,可按规则压缩,如 2001:db8::1 |
| 地址空间 | 2^32 个理论值 | 2^128 个理论值 |
| 本实验 | W5500 硬件协议栈使用 IPv4 | 配套 W5500 不提供 IPv6 硬件协议栈 |
IPv6 的设计不只是“IPv4 位数不够就加长”。它还调整了首部格式、自动配置、邻居发现和广播处理等机制。不能把 IPv4 和 IPv6 地址直接按字符串互换;双栈、隧道或翻译机制属于另外的网络部署问题。
192.168.1.199 位于 IPv4 私有地址范围 192.168.0.0/16,适合局域网使用,不能直接当作互联网上的全球可路由地址。
MAC 地址与 IPv4/IPv6 地址不同。典型 Ethernet MAC 为 48 bit,例如 02:12:34:56:78:9A。同一接口的 IP 可以通过 DHCP 改变,MAC 也不应简单理解成永远烧死且全球可见的“身份证”:系统可以使用虚拟或随机 MAC,而且路由器每转发一跳都会重新封装链路层头部。IPv4 局域网通常用 ARP 把下一跳 IPv4 地址解析成 MAC。
1.3 IP配置
Windows 常用命令:
ipconfig:查看各适配器的基本 IP 配置。ipconfig /all:查看 DHCP、DNS、默认网关、物理地址等更完整信息。ping 192.168.1.199:用 ICMP Echo 测试目标是否愿意返回回显应答。arp -a:查看本机当前 ARP 缓存,可辅助确认 IPv4 到 MAC 的解析。route print:查看路由表,判断数据会从哪块网卡发出。
Linux 中传统工具是 ifconfig,但现代系统更常用 ip addr、ip route;是否预装 ifconfig 取决于发行版。不能笼统说 ifconfig 一定比 ipconfig 显示更全面,它们属于不同系统和工具集。
ping 成功能证明在当时条件下至少存在双向 IP/ICMP 可达性;ping 失败不等于设备一定离线。目标防火墙可能丢弃 ICMP、设备可能没有实现 Echo Reply、地址或路由可能错误,甚至请求已到达但回程路由失败。反过来,能 ping 通也不表示 TCP 6000 端口一定打开。
1.4 应用案例
1.4.1 例题: 手机IP查询
视频中的手机是 192.168.31.128,电脑是 192.168.31.118。若两端掩码都是 /24,按位与后都得到 192.168.31.0,所以属于同一子网。原稿出现 192.168.32.118 是识别错误;若真是 .31.x 与 .32.x 且都为 /24,它们并不在同一子网。
建议按下列顺序排查:
- 在电脑用
ipconfig确认正在使用的网卡、IP 和掩码。 - 在手机 Wi-Fi 详情确认地址与掩码,避免把移动数据地址当成 Wi-Fi 地址。
- 先判断是否同网段,再执行
ping。 - 查看丢包率和每次往返时间,但不要只凭一次超时下结论。
手机锁屏后可能进入 Wi-Fi 省电状态,也可能仍保持联网;视频中一次超时不能直接证明“锁屏就断 Wi-Fi”。W5500 能回应 ping,是因为芯片硬件协议栈支持 ICMP,而不是 STM32 主循环亲自解析每个 Echo Request。
ping www.baidu.com 包含两个步骤:系统先通过 DNS 得到某个 IP,再向该 IP 发送 ICMP Echo。失败可能出在 DNS,也可能出在 ICMP 路径。区分方法之一是分别测试域名和已知 IP,但公网服务的地址和 ICMP 策略会变化,不应把视频里的某个 IP 当作永久值。
1.5 在线IP查询工具
所谓“查询网站动态 IP”的页面,通常是在做 DNS 解析或展示递归解析结果;它查到的并不一定是网站唯一且固定的主机。一个域名可能同时有多个 IPv4/IPv6 地址,也可能因时间、地区、运营商、CDN 和负载均衡返回不同结果。
直接 ping 查询到的 IP 与 ping 域名都成功,只能说明当时 DNS/ICMP 路径可用。对于 HTTP/HTTPS,服务器还可能依靠 HTTP Host 字段和 TLS SNI 区分网站,因此把域名换成裸 IP 访问不一定得到同一个页面。
1.6 DNS解析
1.6.1 域名系统概述
DNS(Domain Name System,域名系统)是分布式、分层的命名系统。常见的 A 记录把域名关联到 IPv4 地址,AAAA 记录关联到 IPv6 地址;DNS 还承载邮件、别名、权威服务器等多种记录,并非只有“网站名转 IP”。
一次简化的查询过程是:
- 应用把域名交给系统解析器。
- 解析器先检查本地缓存和 hosts 文件,再询问配置的递归 DNS 服务器。
- 递归服务器从缓存或根、顶级域、权威服务器体系中取得记录。
- 结果按 TTL 缓存,应用再用返回的地址发起 IP/TCP/UDP 通信。
DNS 主要是“名称查询记录”,不是一个永久的一一映射表。多个域名可以指向同一 IP,一个域名也可以返回多个 IP;反向解析则使用 PTR 记录,不能假定任意 IP 都能反推出原域名。
1.6.2 参考
在本课程直连实验中,STM32/W5500 已直接保存目标 IP 192.168.1.190,没有发送 DNS 查询,因此电脑 DNS 设置并不是这次 TCP 连接的必要条件。DNS 知识用于理解为什么日常可以输入域名,而网络层最终仍使用 IP 地址。
二、实验排错清单
- W5500 LINK 指示是否建立物理链路;没有链路先检查供电、网线和接口。
- 电脑有线网卡必须是
.190/24,W5500 必须是.199/24,两端地址不能重复。 ping .199只测试 IP/ICMP;TCP 还要确认网络助手为 Server、绑定.190或正确接口、监听端口为 6000。- Windows 防火墙可能阻止 ICMP 或 TCP 入站;排查时应添加明确规则,不建议长期关闭整个防火墙。
- 电脑同时存在 Wi-Fi、虚拟网卡和以太网时,用
route print确认到192.168.1.0/24的路由走有线网卡。 - 改源码中的 IP 或端口后,电脑和网络助手的参数也要同步,并重新编译、烧录、复位。
三、参考依据
- IETF RFC 2131:DHCP:核对 DHCP 的客户端/服务器模型、地址分配与主机配置参数。
- IETF RFC 950:Internet Standard Subnetting Procedure:核对子网掩码与网络/主机字段的基本概念。
- IETF RFC 8200:IPv6 Specification:核对 IPv6 将地址长度由 32 位扩展到 128 位及相关设计变化。
- IETF RFC 1034:Domain Names—Concepts and Facilities:核对 DNS 的分层名称空间、分布式数据库、服务器与缓存概念。
- WIZnet 官方 W5500 Datasheet v1.1.0:核对 IPv4、ICMP、ARP、MAC、Socket 和网络参数寄存器能力。
- 本地标准库例程 main.c:核对
.199:5000、.190:6000、掩码、网关和 TCP Client 配置。