ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从Wireshark抓包看网络协议:分层模型、TCP/IP与工业总线全解析

从Wireshark抓包看网络协议:分层模型、TCP/IP与工业总线全解析 做网络调试这些年跟“协议”打交道的时间至少占了一半。不管是排查“网页打不开”还是“PLC数据读不上来”最后都要落到某个协议报文上。计网里的协议确实又多又碎TCP、UDP、ARP、HTTP、RTSP、Modbus、CAN……光名字就让人头疼更别说实际抓包分析。这篇总结我不打算按教科书顺序一章一章背而是按我实际工作中接触到的场景把“计网相关协议”做个横向梳理先讲分层模型这个万能框架再拆传输层和网际层的硬核机制接着聊应用层那些天天要用的协议最后补上工业现场最爱出现的串口、总线协议以及排查问题的实用套路。无论你是刚入行的网络工程师、做嵌入式开发的单片机选手还是搞工厂自动化的电气工程师这篇都能帮你把脑子里散乱的协议知识串成一张能用的网。1. 先给协议“排座次”分层模型是理解一切协议的地基1.1 OSI七层和TCP/IP四层到底怎么对应刚开始学计网的时候很多人都在背OSI七层物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。背得滚瓜烂熟但一到实际抓包就懵因为Wireshark里根本找不到“会话层”和“表示层”。实际上当前互联网世界里真正跑的是TCP/IP四层模型OSI更多是理论参考。我自己常用一个更“工程化”的分法从上到下就四层应用层HTTP、HTTPS、RTSP、Modbus TCP、OPC UA这些负责“数据是什么含义、怎么组织”。传输层TCP、UDP负责“数据怎么可靠地到对方、端口怎么区分”。网际层IP、ICMP负责“数据包怎么寻址、怎么路由”。网络接口层以太网、Wi-Fi、串口、CAN总线负责“bit流怎么在物理介质上传输”。OSI的会话层、表示层功能并没有消失而是被合并进了应用层协议内部比如TLS做加密和身份认证这就是典型的“表示层”职责HTTP/2的多路复用又带点“会话层”的味道。理解这一层现实很重要因为排查问题的时候你第一件事就是判断故障发生在哪一层。网页打不开先ping一下——通了说明网际层以下没问题问题大概率在传输层或应用层ping不通再查网线、IP配置、交换机端口这就把范围缩小了一大半。1.2 封装和解封装数据包是怎么一层层“套娃”的“协议分层”最大的价值在于每层只关心自己的事这就好比寄快递你只管把包裹给快递员写上收件人地址应用层数据快递公司帮你装箱、贴面单传输层加端口信息、装车调配网际层加IP地址、最后通过公路或航空运过去网络接口层。收件人拿到后一层层拆开面单、包装最后取出你的东西。在Wireshark里看一个HTTP请求你会看到四层结构依次叠着最外面是以太网帧头源MAC、目的MAC然后是IP头源IP、目的IP接着是TCP头源端口、目的端口、序列号最里面才是HTTP的请求行和头部。发送的时候是层层向下封装每层加上自己的头接收的时候是层层向上解封装每层剥掉自己的头。这个“套娃”模型解释了特别多实际现象。比如你抓包看到TCP的MSS最大报文段大小是1460字节为什么不是1500因为1500是以太网MTU扣掉20字节IP头和20字节TCP头留给应用数据的就剩1460。改了什么配置导致包发不出去很多时候就是某个头字段没填对。所以学协议我建议从抓包看报文结构入手比死记字段偏移量有用十倍。2. 网际层与传输层TCP/IP体系里最硬的四块核心2.1 IP协议与ARP原理广播问路单播回复IP协议解决的核心问题是寻址。你在浏览器里输入域名DNS帮你把域名解析成IP地址但这个IP地址不能直接用因为数据最终要在局域网里靠MAC地址找到目标设备。这就到了ARP协议登场的时候。ARP原理一句话就能说清发送方在局域网里广播一帧“谁是192.168.1.100请告诉我你的MAC地址”目标设备收到后单播回复“我是192.168.1.100我的MAC是xx:xx:xx:xx:xx:xx”。发送方把这条映射记在ARP缓存表里之后一段时间内就不用再广播了直接按缓存里的MAC地址发。我用Wireshark抓ARP报文时最常看到的坑有两种一是ARP缓存过期导致频繁广播局域网设备一多广播风暴就把交换机CPU打高了二是有人手动改IP或者有设备IP冲突会出现ARP的“重复地址检测”报文这种可以直接锁定是哪台设备在捣乱。实际排查中一条命令就能看缓存表arp -a如果发现某台主机的IP对应了两个不同的MAC地址十有八九是IP地址冲突或者有设备在伪造ARP报文。这个在办公网和小型工控网里太常见了。2.2 TCP三次握手与四次挥手连接不是“建立”两个字那么简单TCP是可靠传输协议可靠靠的是确认、重传、排序、流量控制这一整套机制。而这一切的开始就是三次握手。三次握手的本质是“双方确认彼此的收发能力”。第一次客户端发SYN告诉服务器“我要建立连接”第二次服务器回SYNACK意思是“我收到了我也要和你建立连接”第三次客户端发ACK表示“我收到你的确认了”。为什么不是两次因为如果客户端一个SYN因为网络延迟重复到达服务器服务器会误以为客户端想建两个连接白白浪费资源。三次握手能让双方都确认“我的发送没问题、你的接收没问题”避免历史重复连接导致资源浪费。四次挥手则是因为TCP是全双工的两边数据可以同时走所以关闭时每个方向都要单独确认。客户端发FIN表示“我的数据发完了”服务器回ACK表示“收到了”但服务器可能还要继续发数据等它发完再回一个FIN客户端再回ACK两边才算干净地断开。如果你抓包看到大量TIME_WAIT状态的连接往往是主动关闭方在等2MSL时间这是为了防止最后一个ACK丢包后对方重发FIN属于正常机制但连接太多会占端口高并发场景需要调优。2.3 UDP与端口冲突Windows那个“套接字只允许使用一次”怎么治UDP就简单粗暴了无连接、不保证可靠但延迟低、开销小。视频流、DNS查询、DHCP、组播都是UDP的天下。做流媒体传输的人应该深有体会RTSP的RTP数据包走UDP丢包就是花屏但要是强行跑TCP延迟能急死人。排查网络问题时有个错误提示出现得特别多“通常每个套接字地址协议/网络地址/端口只允许使用一次”。这句话的意思是你试图绑定的那个端口已经被其他进程占用了而且不是同一个进程里的多个套接字共享端口的情况而是不同进程或线程强行绑同一端口。我处理过几次这种问题排查步骤很简单netstat -ano | findstr 8080 tasklist | findstr 进程PID找到占用8080端口的进程PID后看是不是你自己的服务残留的僵尸进程是就kill掉不是就换端口。但要注意有一种坑如果你改了服务端口防火墙没放行新端口客户端连上来还是失败别光盯着端口占用把防火墙入站规则也要一起看。3. 应用层才是兵家必争之地从HTTP到流媒体3.1 HTTP/HTTPS与TLS版本千万别直接禁用SSLv3了事HTTP协议本身不复杂客户端发请求行方法、URL、版本、请求头、请求体服务器回状态行、响应头、响应体。状态码是所有人都该懂的“黑话”200是正常301是永久重定向404是资源不存在500是服务器内部错误502是网关错误504是网关超时。但现代互联网早就不是裸奔的HTTP了HTTPS才是标配。HTTPS多了个TLS层负责加密和身份认证。很多老系统在运维时会遇到一个告警“协商的TLS 1.0是非安全协议只有在为实现向后兼容性时才受支持建议……”还有个更古老的SSLv3协议已经被爆出POODLE漏洞基本都该禁用。这里我要提醒一句禁用SSLv3/TLS 1.0之前一定先确认你的客户端和服务端软件都支持TLS 1.2以上。我有一次帮人排查老版工业组态软件连不上服务器的问题就是IT管理员直接把系统里的TLS 1.0全禁了结果老软件不支持新协议直接“无法建立安全通道”。正确做法是在中间件或应用层里配置允许的最低TLS版本而不是在操作系统层面一刀切。Windows服务器上SSL/TLS可在“组策略管理编辑器”里的“SSL密码套件顺序”和“系统密码学”中调整。如果只是针对远程桌面则需在“RDP安全层”策略里选“SSL”或“协商”而不是默认为“RDP安全层”这样能显著减少老版本协议被强制协商的概率。3.2 RTSP/RTMP流媒体协议主码流和子码流怎么选安防行业天天跟海康、大华的摄像头打交道最常用的就是RTSP协议。RTSP负责会话控制比如播放、暂停、停止真正传视频数据的是RTP包它跑在UDP或TCP上。海康摄像头的RTSP地址是有固定格式的一般在ONVIF协议或浏览器插件里可以看到类似这样的地址rtsp://用户名:密码IP:554/Streaming/Channels/101这里“101”值得解释一下第1个数字1表示主码流101里的01表示通道1如果是102就是通道1的子码流。主码流分辨率高、码率大适合本地存储和纯预览分析子码流分辨率和码率都低适合远程查看、手机APP预览、多路同屏。做视频接入的时候如果带宽够、只取一路就取主码流如果同时接十几路摄像头做轮巡推荐全用子码流不然交换机端口和服务器解码压力都会爆。RTMP则是直播界的“老熟人”推流端向服务器推RTMP播放端再从服务器拉流。它的好处是底层走TCP穿越性强但延迟在1到3秒左右不适合需要毫秒级互动的场景。选RTSP还是RTMP核心看场景本地局域网监控选RTSP公网直播选RTMP。3.3 SMB文件共享失败先查协议版本还是先查端口关于“共享文件夹访问失败”很多人的第一反应是查SMB协议版本这话对一半。SMB协议确实有版本差异Windows 10/11默认启用SMB 3.1.1老款NAS可能只支持SMB 1.0两边刚好谈不拢就会报“找不到网络路径”或者“不能访问共享文件夹”。但我的排查顺序是有讲究的先看网络通不通再看端口通不通最后才看协议版本ping 服务器IP telnet 服务器IP 445 Test-NetConnection -ComputerName 服务器IP -Port 445SMB用的是445端口如果445端口被防火墙拦了那协议版本再匹配也没用。很多人死活查不出问题其实就卡在Windows防火墙或安全软件的入站规则上。确认端口通之后再去检查SMB协议在“Windows功能”里勾选“SMB 1.0/CIFS文件共享支持”仅兼容老设备时需要且有安全风险。在“组策略”-“计算机配置”-“管理模板”-“网络”-“Lanman工作站”中启用“不安全的来宾登录”。这里再提醒一次SMB 1.0有严重的安全问题永恒之蓝就是它能不开就不开。如果是自己开发的内部系统对接老设备宁可中间加一个协议转换网关。4. 工业与嵌入式协议另一片平行世界里的“计网”4.1 UART、SPI、IIC三种板级串行协议的恩怨情仇嵌入式开发每天都要跟UART、SPI、IIC打交道很多人分不清这三兄弟我做个对比表格看一次就能记牢特性UARTSPIIIC信号线数量2根TX、RX4根SCLK、MOSI、MISO、CS2根SCL、SDA速率低速常见115200bps高速可达几十Mbps中低速标准模式100kbps快速400kbps通信方式异步全双工同步全双工同步半双工主从结构点对点一主多从靠CS片选一主多从靠地址寻址时钟线无靠双方约定波特率有主机提供有主机提供UART最常用在调试日志输出和设备间通信比如GPS模块、蓝牙模块但因为是异步通信双方波特率要严格一致收发时钟偏差过大会乱码。SPI里最容易被坑的是片选信号CS多从机时候主机要分别拉低不同从机的CS很多人SPI通信异常查来查去是CS引脚初始化不对。IIC靠地址区分设备总线上每个设备有7位或10位地址两个设备地址一样就冲突了表现为通信时好时坏或地址应答NACK。我在IIC调设备时最常用逻辑分析仪抓波形先看有没有START信号、地址对不对、ACK位是否正常。如果连ACK都收不到先查上拉电阻IIC的SCL和SDA需要上拉通常4.7kΩ忘了加上拉或上拉电阻太大波形就会变差通信一长就不稳定。4.2 CAN协议报文解析从一帧报文里读出所有信息CAN总线是汽车电子和工业控制的中坚力量。跟前面提到的串行协议不同CAN用差分双绞线传输抗干扰能力极强速率从125kbps到1Mbps最大特点是非破坏性仲裁多设备同时发送时ID小的优先。初学CAN报文解析时我建议先抓住帧结构的几个核心字段帧ID11位标准帧或29位扩展帧。在J1939这类高层协议里ID里藏着源地址、目标地址、PGN等。DLC数据长度代码表示后面数据场有几句字节。DATA最多8字节数据具体含义由应用层协议定义。CRC校验段校验用处防止干扰导致错误帧混进来。我之前解析过一个电池管理系统的CAN报文一个前舱控制器每隔100ms发一帧ID为0x18FF50E5的数据DLC是8数据第1、2字节拼成一个有符号整数除以10就是电池总电压。这种解析工作的关键在于拿到协议文档DBC文件然后按字节偏移量、字节序拆数据。没有DBC就只能靠猜加实测对比经验不足很容易踩“字节序”的坑Intel格式和Motorola格式的解析结果完全不同电压值会算出来一个完全不合理的负数或超大数。用CAN分析仪配PCAN或周立功的软件监听总线先调到和设备相同的波特率才能看到正确报文。如果报“Bus Error”或满屏错误帧大概率是波特率不对或者终端电阻没接总线上需要两端各120Ω这也是CAN调试最常犯的两个错。4.3 Modbus、OPC UA、S7工业设备数据采集的三条路线工业现场要采集PLC、传感器、数控机床的运行状态协议选型基本绕不开Modbus、OPC UA和S7协议这三条路线它们各有各的适用场景。Modbus是工业界“通用语言”最经典的是Modbus RTU跑在RS485上和Modbus TCP跑在以太网上。Modbus RTU报文结构很简单从站地址、功能码、数据区、CRC校验。功能码里最常用的是03读保持寄存器、04读输入寄存器、06写单个寄存器、16写多个寄存器。RS485接线特别注意A/B不能接反接反了根本不通而且Modbus是主从模式主站轮询从站只回不应主动上报轮询周期要设短一点但太短又容易把从站和总线搞挂。OPC UA的定位比Modbus高一个层次自带信息模型和安全机制可以跨平台、跨厂商互操作适合复杂工厂的数据集成。Modbus简单透明但一旦传输到上位机开发集中监控系统OPC UA优势就出来了数据带类型、带语义、带报警状态不用你再写几百个映射表。当然OPC UA的缺点就是开发复杂度高协议栈大不适合小单片机直接跑。S7协议是西门子PLC的私有协议最典型的是S7comm跑在TCP 102端口上。如果你要直接从西门子S7-1200/S7-1500读数据常见做法是用开源库Snap7直连IP填PLC地址、机架号、槽号。S7协议表面上看起来就是普通TCP包但里面有一套握手和请求应答机制哪怕最简单的“读取DB块数据”命令也要构造特定的TPKT和S7 Comm层头部。Snap7封装好了这些细节用起来就简单快捷。现场选型时别急着谈协议先把设备的通信接口盘清楚老设备只有RS485和Modbus RTU你说要上OPC UA它根本不支持新设备有以太网口但可能不支持S7协议必须用OPC UA或者Modbus TCP。实操中最省力的方案是设备端用什么就接什么上一级用网关或OPC服务器做协议转换统一转成OPC UA或MQTT再送MES系统。5. 网络协议排查的实战工具箱与速查表5.1 Wireshark抓包入门先学会“看包”再谈“懂协议”学协议最快的路就是抓包。Wireshark是绕不开的神器但新手一打开往往被一大堆颜色花花绿绿的包吓到。我建议你从三个最常用的过滤表达式开始ip.addr 192.168.1.100只看和指定IP相关的报文。tcp.port 80 || udp.port 53只看某端口比如HTTP或DNS。dns、arp、http、modbus直接按协议名看某类报文。抓包的关键是选对网卡和过滤条件。抓远程服务器的包要在你的本机网卡上抓抓本机回环调试比如本机连本机的MySQL要选“Loopback: lo”接口Windows下就是Npcap Loopback Adapter。遇到“发送请求后没有回应”的情况先用Wireshark看有没有发出请求没有发出就是客户端问题发出了没回应在服务端同时抓包两边的包一对比问题往往一目了然客户端发了SYN服务端没回SYNACK那就是服务端没监听端口或者防火墙拦了。服务端回了SYNACK客户端没回ACK那多半是客户端防火墙或连接状态问题。5.2 组播、RIP与常见告警速查表组播协议在视频监控、工业数据分发、证券行情推送里非常常用。组播的核心是IGMP主机告诉交换机“我要加入这个组”交换机把组播数据只复制给需要的端口而不是广播给所有人。排查组播问题时最关键的不是看电脑而是看交换机的IGMP Snooping配置如果没开Snooping组播包会被当广播处理带宽和CPU都被拖垮。RIP协议是路由协议里的“老兵”在GNS3模拟器实验里常能看到两个路由器用RIP互相学习路由。RIP的核心是跳数最多15跳16跳被视为不可达。它实现简单但收敛慢大型网络早被OSPF和BGP取代。学习RIP的价值更多在于理解“动态路由协议到底在做什么”每台路由器把已知路由告诉邻居邻居再传给其他邻居最终全网都知道怎么去某个网段。最后整理一张工作中常见异常的速查表省得你再一个个去搜现象大概率原因先查什么能ping通但浏览器打不开网页代理、DNS、HTTPS证书DNS解析、浏览器代理设置、TLS版本端口不通防火墙、服务未启动telnet测试端口、检查服务监听状态ARP表里IP对应两个MACIP冲突、伪造ARParp -a、交换机查MAC表SSH能连数据库连不上数据库端口未放行、DB监听地址是127.0.0.1检查DB监听配置、防火墙规则Modbus RTU乱码或超时波特率不一致、A/B接反、无终端电阻逻辑分析仪测波形、表笔量A/B电压CAN总线上报错帧波特率不对、缺终端电阻、节点过多CAN分析仪设置波特率、检查120Ω终端电阻5.3 几条亲测有效的协议学习心法协议多、杂、变但有个原则能贯穿所有场景遇到问题先分层再对号入座。物理层看电平、链路层看MAC、网络层看IP、传输层看端口、应用层看数据内容。每次排查完一个故障我习惯把抓包的关键截图保存下来归档成自己的“异常报文库”下次遇到类似问题直接翻图对比。另外很多人在网上找各种协议的PDF文档其实不如官方规范的一章读得透。TCP看RFC 793HTTP看RFC 9110Modbus看Modbus.org的规范CAN看ISO 11898OPC UA看OPC Foundation的规范。官方文档虽然啰嗦但不会误导人。我自己的经验是先把协议栈的时间线撸一遍帧头大小、关键字段、典型报文长什么样剩下的事全靠抓包实战喂出来。写这篇总结的时候我在工位上抬头看了一眼贴了五年的那张协议分层图想起自己第一次用Wireshark抓包时连TCP三次握手都数不利索如今随便抓一个包就能把各层字段说得明明白白靠的不过是一句话别怕协议多你只要每一次都把“为什么”问到底。下回再遇到稀奇古怪的协议告警先别急着百度打开抓包工具从物理层往上一层一层看答案通常就藏在某一位字段里。
返回列表