ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

嵌入式网络排查地图:用TCP/IP四层模型定位MCU联网问题

嵌入式网络排查地图:用TCP/IP四层模型定位MCU联网问题 嵌入式开发者迟早会碰到这样一天手里的板子从纯粹的“点灯烧录”转向联网用STM32配上PHY芯片或者拿一块ESP8266模组做透传然后对着ping不通、连不上服务器、数据乱码一类的问题发呆。我见过太多从单片机转过来的朋友C语言很熟、寄存器操作很溜但一遇到网络相关的问题就完全不知道从哪里下嘴。原因其实很简单——缺的不是代码能力而是对TCP/IP模型没有一个“能在板子上落地”的认知。这篇内容想解决的就是这件事。我会从嵌入式开发的视角重新拆解TCP/IP四层模型讲清楚每一层在MCU板卡上到底对应什么硬件、什么代码、什么现象以及当你遇到问题时怎么沿着这一层一层的结构去定位。内容不追求学院派的面面俱到而是面向实际开发你用的协议栈可能是LWIP可能是RT-Thread的netdev组件也可能是W5500这类硬件协议栈但无论底层是什么TCP/IP模型这套分层逻辑都是通用的排查地图。适合刚接触嵌入式网络的开发者也适合那些能跑通例程但一换环境就抓瞎的人。1. 嵌入式开发者的第一道分水岭为什么必须先吃透TCP/IP模型很多嵌入式工程师会把TCP/IP模型当成一门“理论课”觉得背会了四层名称、记住TCP三次握手考试的时候能写出来就够了。但等你真去做一个联网项目比如把温湿度数据定时上报到云平台或者让设备接收远程控制指令你会发现大学课本里的那些概念全都变成了非常具体的问题MAC地址和IP地址到底谁在干活为什么我ping不通隔壁网段的设备TCP连接为什么偶尔卡住不重连这些问题如果不回到模型层面去理解你只能在代码里盲目试错运气好改个参数能过运气不好能折腾一周。1.1 从“点灯老手”到“网络瞎子”只隔了一个协议栈单片机开发有一个特点大部分时候你面对的是直接映射到寄存器的硬件。GPIO拉高拉低、SPI读写数据、UART收发字节每一件事都可以用示波器量出来、用逻辑分析仪抓下来。这种“所见即所得”的掌控感做久了人会对任何没有物理实体的东西产生本能的排斥。网络不一样。当你第一次调用send()函数把一个字符串发出去数据到底经历了什么、到了哪里、为什么对面没收到你是看不见也摸不着的。如果功底不扎实你只能把它当成一个玄学问题去碰运气。TCP/IP模型在这里的真正价值不是让你记住“传输层负责可靠传输”这种标准答案而是给你一张分层的解剖图数据从应用层出发依次穿过传输层、网络层、链路层每一层都往包上盖一个自己的“邮戳”协议头到了对端再一层一层拆开。一旦理解了这条路径你就能像当初查寄存器一样顺着路径逐段检查问题到底出在哪一层。1.2 模型不是考点是一张排障地图我在之前一个项目里遇到过一台设备反复掉线。一开始怀疑是网络信号差换了天线没有好转后来怀疑是服务器问题用电脑测试完全正常最后逐层排查才发现是设备端的TCP保活机制配置不对运营商网络里的NAT超时比较短连接被中间设备静默回收了但设备端还傻傻地以为连接活着。这种问题没法靠单纯看代码解决必须回到协议栈的层次结构里。物理层与链路层检查的是“网络通不通”网络层检查的是“路能不能到”传输层检查的是“连接是否真实存在”应用层检查的是“业务逻辑是否正确”。每一层有每一层的工具ping测网络层通不通telnet或nc测端口通不通抓包看协议交互是否正常。这套排查思路熟练之后你会发现所谓网络调试本质就是拿着模型一层层“打勾”——哪一层勾不上问题就锁定在哪一层。这比你在应用代码里瞎猜要高效得多。2. 把四层模型还原到板卡上每一层都有物理实体TCP/IP四层模型很多人会背但问“链路层在你的板子上是哪个芯片”“网络层在你的代码里是哪个函数”不少人就会卡住。我建议做嵌入式开发的人用另一种方式学模型不要把它当成抽象层次而是当成一张板卡的功能框图看看每一层任务究竟由谁完成。2.1 物理层和链路层PHY芯片、MAC控制器与网线指示灯的分工物理层负责把数据变成能在网线上传输的电信号、光信号负责驱动网线、检测链路状态。在嵌入式系统里这部分通常由一颗PHY芯片承担比如很常见的LAN8720A、DP83848、KSZ8081它们通过RMII或MII接口和MCU相连。如果你用的是带网络功能的MCU比如STM32F407、STM32H743芯片内部集成了MAC控制器但它仍然需要外接一颗PHY芯片因为MAC不管模拟电平那摊事。这也是为什么STM32的ETH外设到能真正联网中间还得有一颗PHY。链路层则是把数据封装成以太网帧加上源MAC地址、目的MAC地址、类型字段和帧校验序列。在嵌入式系统里MAC控制器负责这件事它会把上层交给它的IP包塞进以太网帧的负载区然后通过DMA交给PHY芯片发出去。所以当你插上网线但灯不亮问题大概率出在PHY芯片或网线本身当灯亮但ping不通链路层大概率是正常的问题可能出在网络层或更上层。这也是为什么我调试网络问题第一件事就是看一眼网口指示灯——它们状态能快速告诉你物理层是否存活。2.2 网络层IP、子网掩码、网关与反复刷存在感的ARP网络层的核心任务是寻址和路由。它负责在多个网络之间找到一条到达目的主机的路径IP地址就是这个寻址体系里的门牌号。嵌入式设备入网时要么配置静态IP要么通过DHCP动态获取。很多初学者把IP地址和MAC地址混为一谈其实只需记住一句话MAC地址是硬件出生自带的身份证用于同一局域网内两台设备之间的直接通信IP地址是逻辑分配的地址用于跨网络定位一台主机。网络层还有一个经常刷存在感的协议叫ARP。当你的设备要跟同一网段的另一台设备通信时它必须知道对方的MAC地址才能把以太网帧发出去。设备会先发一个ARP广播“谁是192.168.1.100请把你的MAC地址告诉我。”对方收到后单播回复然后通讯双方把这条映射关系缓存起来。嵌入式开发里常见的现象是第一次ping会慢后面就快了原因就是这个ARP缓存已经建立。另一个坑是设备换了网段后ARP缓存没更新导致数据一直发给错误的MAC出现“明明IP是对的就是不通”的怪问题。2.3 传输层TCP状态机与UDPMCU上的理性取舍传输层是TCP/IP模型里最让嵌入式开发者费神的一层。TCP提供的是一种面向连接的、可靠的字节流传输它用三次握手建立连接、用序号和确认号保证数据顺序、用重传机制对抗丢包、用滑动窗口实现流量控制。这一整套机制在PC上运行没什么感觉但在MCU上却是实打实的开销你需要维护连接状态、需要给每个连接分配发送和接收缓冲区、需要应对超时重传。所以在资源受限的MCU上跑TCP一个很常见的问题就是内存不足——当你同时维护多个TCP连接时协议栈占用的RAM可能会大得让你怀疑人生。UDP则是无连接的、尽最大努力交付的数据报协议。它没有握手、没有确认、没有重传头部只有8字节开销极小但丢包了不会帮你重发。在嵌入式场景里UDP经常被用于实时性要求高、或可以容忍少量丢包的业务比如设备状态广播、传感器数据周期性上报、NTP校时等。我做很多UDP项目时会在应用层自己设计一个简单的序号机制和超时重传逻辑这样既享受UDP的低开销又能让关键数据相对可靠——这是非常常见的嵌入式工程折中。2.4 应用层HTTP、MQTT与私有协议嵌入式写代码最多的地方应用层离业务最近也是嵌入式开发者真正写代码最多的地方。HTTP协议在嵌入式里常用于设备与服务器之间的REST API交互但它的报文头部比较大对带宽和内存有要求。MQTT则是为物联网场景设计的轻量级消息协议基于TCP连接使用发布/订阅模型头部开销很小很适合低带宽、高延迟、网络不稳定的环境。CoAP则是面向受限设备的类HTTP协议基于UDP实现常用于资源严重受限的传感器节点。实际选型时我习惯按成本和业务复杂度来定如果只是简单上报数据给云平台选MQTT通常最稳妥如果做局域网内的设备控制自定义的JSON over TCP或UDP也完全够用如果设备资源极其紧张、又要跟Web生态对接CoAP值得考虑。这一层就是你处理业务逻辑的地方而你在应用层见到的大部分“连接被断开”“数据收不全”“对方没响应”问题根因往往不在应用层本身而是下层协议交互出了状况。这也是为什么要先懂下层的机制再讨论应用层的代码。3. 一包数据的跨层之旅从传感器采样到云端服务器理论说完了我用一个实际的例子把四层模型串起来假设你现在要把一个温度值通过设备端程序发送给一个MQTT服务器这一包数据从产生到到达服务器沿途到底经历了哪些环节理解这个完整流程之后你对TCP/IP模型的理解就不再是四个名词而是一条能说清楚每一步细节的通路。3.1 应用层打包你的业务数据如何交到协议栈手里整个过程的第一步是应用层把业务数据准备好。在MCU里你从温度传感器读取到一个整型值比如25然后在内存里拼一个JSON字符串或者MQTT的PUBLISH报文写入一个发送缓冲区。调用协议栈的发送接口后协议栈会把它当成“用户数据”的载荷部分在它前面添加传输层头部。要注意的是应用层交给TCP协议栈的是一段字节流TCP并不关心你这串字节的含义。如果你要用TCP传结构化消息比如长度加内容的帧格式必须在应用层自己做封包和拆包。我之前在项目里用TCP传自定义二进制协议就在应用层定义了四字节长度字段加负载的结构。如果漏掉这一步、直接把结构体内存扔给send()接收端根本分不清边界这就是大家常说的粘包问题——它发生在底层传输时把多包数据合并或拆散最终需要应用层重新分界。3.2 TCP分段与MSS协商为什么大块数据会被拆着走当你调用TCP的发送接口写入一大块数据协议栈不会原封不动地把整个数据包丢给IP层。它会根据MSS最大报文段长度对数据进行分段。MSS在TCP连接建立时通过三次握手的选项字段协商它表达的意思是“我这边单个TCP段的负载能力上限是多少。”由于以太网帧的最大传输单元MTU通常是1500字节再扣除IP头部的20字节和TCP头部的20字节MSS通常为1460字节。所以如果应用一次发送10KB数据TCP层会把它切成7个左右的段每个段带着自己的序号依次发出。理解这一点对嵌入式开发非常重要如果你在MCU上发送大数据块但接收端只能逐段接收那么应用层收到的可能是分片到达的数据你需要自己处理“等够了完整业务数据再解析”的逻辑。另外许多MCU协议栈在实现TCP时数据到达后会触发回调但通常不会一次性把整个应用层消息给你而是有数据就通知一次。我在调试时见过有人把这个当成协议栈“乱序了”其实底层是严格按照分段来的只是应用层需要自行组装。这也是TCP流式传输和UDP报文式传输最大的差异。3.3 IP分片与MTU约束链路层的硬天花板IP层收到TCP层传下来的数据段之后会给它加上IP头部——包含源IP、目的IP、协议号等字段。如果这个IP包的总长度超过了链路层的MTUIP层还要做分片处理把大包切成多个更小的IP分片每个分片都带有自己的片段偏移由接收端重组。在嵌入式系统里IP分片最好尽量避免。原因很简单MCU的内存资源通常紧张分片重组需要额外的缓冲区而且只要有一个分片在传输中丢了整个原始IP包都会被丢弃。UDP没有TCP那样的重传机制UDP包如果触发了IP分片一个分片丢了这个包就废了而且UDP协议栈不会知道这事——上层应用只会发现“数据没收到”这和TCP的重传机制完全不同。所以我做UDP通信时有一个经验法则应用层单个数据报的总长度控制在MTU以内一般来说IPv4环境下加上UDP头和IP头之后把应用数据控制在1472字节以内就能避免IP分片。如果业务数据超过这个长度我会在应用层拆包而不是让底层去分片。3.4 接收端的逐层解包中断到应用回调的完整路径数据包到达接收端之后走的是一条完全相反的路径。以常见的MCUPHY方案为例PHY芯片把网线上的模拟信号还原成数字比特流MAC控制器检查目的MAC地址是不是自己通过DMA把整个以太网帧搬进内存然后协议栈的链路层处理函数开始解析以太网头判断上层协议类型是IP的0x0800还是ARP的0x0806如果是IP包再交给网络层处理函数检查目的IP是否为本机地址然后根据IP头部里协议字段决定是交给TCP还是UDPTCP层拿到数据后通过五元组源IP、源端口、目的IP、目的端口、协议找到属于哪个连接把数据复制进那个连接对应的接收缓冲最后触发应用层注册的接收回调。这一整条链路在带操作系统的嵌入式Linux里由内核完成在裸机LWIP的MCU里则由中断和轮询机制驱动。调试这类问题时我建议在每一层入口加一个计数器或调试打印。比如先确认MAC层收到多少包、IP层丢弃多少包、TCP层提交多少数据到应用。这样你在面对“收不到数据”这类问题时能迅速区分数据是没进以太网帧、还是帧收到了但IP不认、还是TCP校验失败、还是数据到了应用层但解析逻辑写错了。4. 协议栈选型背后的工程逻辑裸机、RTOS与硬件协议栈理解了模型之后下一个问题是你的项目里这个模型到底由谁来运行嵌入式网络方案五花八门按协议栈的运行载体划分大致有三类纯软件协议栈跑在MCU上最常见的是LWIP、硬件协议栈芯片如W5500、以及集成好网络协议的无线模组如ESP8266、ESP32。选哪种本质上是资源、成本、功耗与开发效率之间的权衡。4.1 裸机LWIP轻量级协议栈为什么是MCU首选LWIP是一个开源的轻量级TCP/IP协议栈全称是Lightweight IP专门为资源受限的系统设计。它支持完整的TCP/IP功能包括TCP、UDP、IP、ARP、ICMP等却能运行在只有几十KB RAM的MCU上。在我用过的方案里STM32F407搭配LAN8720和LWIP是非常经典组合也是很多开发板和项目的基础模板。裸机环境下用LWIP核心问题是“时间”从哪里来。协议栈需要定时处理超时重传、ARP老化、TCP定时器等任务同时还需要从网卡接收数据。通常你会把LWIP的tcpip_thread相关逻辑放在主循环里调用而以太网接收通过中断或DMA完成。实际项目里我习惯这样组织PHY芯片产生中断或通过ETH MAC的状态标志提示有数据到达中断服务程序里把数据从DMA描述符拷贝到LWIP的PBUF结构然后置一个标志位通知主循环。主循环里调用ethernetif_input()处理收包再调用sys_check_timeouts()处理定时器。这种裸机集成方式的优势是简单直接不用考虑线程同步但缺点也很明显主循环不能做太重的耗时操作否则网络响应会卡顿。4.2 RTOS协议栈任务、信号量与网络线程的配合当项目复杂度上来需要在跑网络的同时处理传感器采集、显示刷新、控制逻辑等多任务时一般会引入RTOS。FreeRTOS配合LWIP是嵌入式Linux之外最常见的组合之一RT-Thread则更进一步把LWIP网络框架封装成组件自带网卡驱动框架。有了操作系统协议栈的运转模式会发生变化LWIP里通常会有一个专门的tcpip线程所有协议栈相关的操作都通过邮箱或信号量投递给它处理这样避免了多任务并发访问协议栈内部数据结构导致的问题。应用线程调用tcp_write()时并不会直接把数据发送出去而是把请求投递给tcpip线程由它真正执行协议栈操作。理解这点后你会发现在RTOS里排查网络问题时不能只看应用线程还要确认tcpip线程是否正常运行、网络接口状态是否被正确管理。RTOS方案还带来一个额外好处你可以给网络相关任务设置优先级。比如接收处理的任务优先级比较高采集任务可以适当降低确保网络数据不丢。4.3 硬件协议栈与无线模组把网络复杂性外包掉硬件协议栈的代表是W5500它把整个TCP/IP协议栈做进了芯片内部外部MCU只需要通过SPI接口读写寄存器、收发数据缓冲区即可。它的最大优点是把内存开销和协议栈维护复杂度从MCU侧剥离MCU只需要关心业务数据。如果你用的是资源很小的8位或低端32位MCU或者开发周期非常紧W5500这类方案能省去很多调试协议栈底层的时间。缺点是灵活性有限核心版本协议固化想要深度定制协议行为比较困难而且芯片成本比裸PHY方案高。无线模组则是另一条路。ESP8266这类模组内部自带完整的Wi-Fi协议栈和TCP/IP协议栈MCU通过AT指令或者SDK接口使用它。开发时你甚至不需要关心任何以太网的概念只需要用ATCIPSTART建立TCP连接、ATCIPSEND发送数据。它的好处是开发速度极快但代价是黑盒出了问题你很难从底层排查。我建议把开发流程分为两个阶段原型验证阶段优先选用模组快速跑通业务量产优化阶段再根据成本、稳定性要求决定是否换成更底层的方案。5. 用tcpdump和Wireshark验证你对模型的理解有时候文档读十遍不如亲眼看到一次数据包的完整旅程。在实际的嵌入式网络开发中抓包分析是验证你对TCP/IP模型认知是否正确的利器。无论是嵌入式Linux设备还是PC上运行的模拟环境只要你手上有抓包工具就能把一个数据包从链路层到应用层的完整结构看得清清楚楚。5.1 tcpdump抓包嵌入式Linux上最直接的观测手段如果你的嵌入式设备跑的是Linux系统Buildroot或者Yocto裁剪的发行版都行tcpdump基本是标配。它能在命令行里捕获网络接口上的数据包并把协议头信息展示出来。以下是我调试网络问题时最常用的几个tcpdump姿势# 抓取eth0接口上所有数据包并解析协议头 tcpdump -i eth0 -n # 只抓取与特定主机通信的包很常用 tcpdump -i eth0 -n host 192.168.1.100 # 抓取特定端口TCP数据 tcpdump -i eth0 -n tcp port 8080 # 抓取完整内容并存文件拿到Wireshark里分析 tcpdump -i eth0 -n -w capture.pcap第一次在你的开发板上跑通tcpdump之后你只需要在另一台电脑上ping一下这块板子或者让设备主动连接服务器然后看屏幕上滚动的协议描述马上就能理解ARP请求响应、ICMP回显请求和回显应答这些概念到底长什么样。抓包结果里每一行都标注了链路层、网络层、传输层的关键字段比如ARP, Request who-has 192.168.1.1 tell 192.168.1.100这就把链路层与网络层的分工暴露得清清楚楚。5.2 Wireshark里的四层解剖图每个包都被拆得明明白白tcpdump适合快速判断但要说“看得懂”Wireshark是最直观的工具。它把捕获的每个数据包按协议层次展开点开一个包从上到下依次是以太网帧头链路层、IP头网络层、TCP/UDP头传输层以及最底层的应用数据。每一个字段都有解释包括源MAC、目的MAC、源IP、目的IP、TCP的SYN/ACK标志、序号、确认号等。你甚至可以右键给某个TCP流设置“Follow TCP Stream”直接看到应用层收发内容的还原。对于嵌入式开发者Wireshark最有价值的一点是帮助你建立“数据包头部载荷”的心智模型。比如你发了一个HTTP请求点开这个包能看到以太网帧头占14字节、IP头占20字节、TCP头占32字节因为带了时间戳、MSS等选项然后才是HTTP的GET /data HTTP/1.1。看到这个结构之后前面讲的四层封装就不再是抽象概念了。我经常会拿一个TCP连接建立过程在Wireshark里回放指给团队成员看三个包各自的特征第一个包SYN标志置位第二个包SYNACK同时置位第三个包ACK置位全程没有数据载荷——这就是三次握手最真实的样子。5.3 一次抓包实战从ping通到HTTP请求的完整链路解读举一个我实际调试过的场景设备运行在192.168.1.50要访问位于公网的服务器服务器域名是example.com。抓包后你会看到整个通信过程非常有层次感首先设备会发现目标IP不在本地网段于是发送一个DNS查询请求询问example.com对应的IP地址。这个DNS查询如果是用UDP发送的你就能在抓包里看到标准的UDP数据报源端口是随机高端口目的端口是53负载就是DNS查询内容。DNS服务器回复一个A记录IP。这时设备才知道服务器的IP地址。接着如果设备想TCP连接服务器会发送一个SYN包。如果TCP连接建立了数据通路上会看到HTTP请求发出去、服务器返回HTTP响应。如果你的服务器用了HTTPS那么在TCP握手之后还有一长串TLS握手包——它们本身也是“应用层数据”由TCP承载在这个层面上TCP/IP模型依然完全适用。这一套流程跑一遍之后你会对模型产生自己的直觉哪些操作是网络层的哪些是传输层的哪些是应用层的出问题时你应该去抓哪个层面的包。这种直觉是任何文档都给不了的只有亲手打开抓包工具观察过才建立得起来。6. 越过模型之后常见误区、调试手法与高频面试题TCP/IP模型虽然基础但越基础的东西越容易产生根深蒂固的误解。在嵌入式开发这个圈子里我见过很多工作两三年的工程师在某些概念上仍然有不小偏差。这一节聊聊真正常见的认知坑和面试、工作中会遇到的高频问题。6.1 几个让人栽跟头的理解误区误区一认为TCP不丢包。TCP只能保证在连接正常的情况下通过序号确认和重传机制把数据可靠地交给对端应用但它不能保证连接永远“正常”。网络中断、对端崩溃、缓冲区溢出、长时间静默被中间设备断开这些情况TCP并不能自动修复。正确理解是TCP的可靠性是一个有条件的承诺它要求连接本身还活着。这也是为什么生产级的TCP应用一定要有心跳检测和断线重连机制。误区二把ping通当成应用层能通信。ping用的是ICMP协议它只测试网络层的通路不关心端口是否开放、应用是否正常。一个设备能ping通只说明链路层、网络层基本正常应用层的TCP服务可能根本就没起来或者监听端口不对。所以排查问题时ping通了不要高兴太早下一步还要用nc或telnet去测试具体端口。误区三忽视TCP缓冲区与背压。在MCU上TCP发送缓冲区是有限内存。如果应用层写数据的速度远大于网络实际能发送的速度缓冲区会很快填满此时协议栈拒绝接收更多数据、还会触发流控。很多嵌入式开发者第一次遇到tcp_write返回内存不足时非常困惑其实这就是TCP的滑动窗口机制在起作用——它告诉发送方“我这边暂时吃不下了”。解决方案不是盲目加大缓冲区而是要在应用层实现发送队列和流量控制逻辑。误区四UDP包很轻所以可以随便发。UDP头确实只有8字节但它最终还要穿着IP头和以太网头出门总开销是42字节的空气。更重要的是如果应用层数据超过1472字节假设MTU为1500UDP包会被IP分片前面说了分片丢一个就丢整包。这个坑我在一个图像传输项目里踩过当时发现大图传过去偶尔花屏抓包一看就是在IP分片上丢了分片。后来我在应用层把每帧数据切成多个1400字节以内的分片问题立刻消失。6.2 嵌入式TCP/IP面试高频问题与答题框架最后整理一下我在面试候选人时比较常问、以及实际面经里高频出现的几个TCP/IP基础题。这些问题看似简单但很能看出一个人是死记硬背还是真正做过嵌入式网络开发请描述TCP三次握手过程并说明为什么需要三次而不是两次。回答重点在“确认双方的收发能力都正常”这个核心第一次握手让服务器知道客户端能发送第二次握手让客户端知道服务器能接收且能发送第三次握手让服务器知道客户端能接收。如果只有两次握手服务器无法确认客户端的接收能力是否正常还可能因半连接导致资源浪费。在嵌入式设备上TCP和UDP你会怎么选别背答案要从资源占用、实时性、可靠性、业务容忍度几个维度展开。比如视频流或传感器高频广播适合UDP指令下发和文件传输通常用TCP。什么是粘包和拆包如何解决需要讲清楚TCP是流式协议、没有消息边界解决方法是应用层设计长度前缀、分隔符或固定长度消息。LWIP中TCP数据发送与接收的流程是怎样的需要说出PBUF、tcp_write、tcp_output、tcp_received回调这类核心概念体现你真的移植过或写过LWIP应用。ARP协议的作用是什么为什么局域网通信必须先有ARP说明IP地址到MAC地址的映射过程以及ARP缓存超时的意义。MTU、MSS和IP分片之间的关系是什么能说清这三者的区别基本可以确认你深入理解过数据通路而不是只看过RFC标题。这些问题都没有标准答案面试官真正想听的是你有没有自己的工程判断。比如问“你之前的项目TCP连接拉起后经常掉线怎么排查”如果应聘者能顺着物理层、链路层、网络层、传输层、应用层一层层讲排查过程那我对他的TCP/IP模型掌握程度基本就有底了。模型本身不难难的是把它变成直觉。我的建议是不管你现在用的是什么方案都可以找一个晚上在自己板子上把tcpdump跑起来发几个包打开Wireshark看几轮ARP和TCP握手用不了多少时间但你以后处理嵌入式网络问题的底气会完全不同。
返回列表