ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

TCP/IP四层模型实战解析:从分层原理到抓包与iperf压测

TCP/IP四层模型实战解析:从分层原理到抓包与iperf压测 干这行久了经常被朋友问“TCP/IP到底学什么怎么才能吃透”。聊下来发现很多人第一反应是去背协议、背端口号但真正遇到“网页打不开”“传输很慢”“连接被断开”这类问题时又完全不知道从哪儿下手。其实解决这些问题靠的并不是记住一堆协议细节而是心里有一张清晰的地图——数据从一台机器到另一台机器中间经过了哪些环节每一层做了什么加工又是怎么被还原的。这张地图就是TCP/IP体系结构。这篇文章我会从四层模型的设计思路讲起把应用层、传输层、网络层、网络接口层挨个拆开然后用一次真实的数据请求走完整个封装与解封装过程再带你在Windows环境下做端到端的发包收包测试最后用iperf做一次正经的吞吐量压测。不管你是刚接触网络的新手还是在备考网络、软考相关证书或者日常要处理网络故障的运维和开发这套内容都能直接复用到实际场景里。1. 先把体系结构讲清楚TCP/IP为什么要分成四层1.1 OSI七层与TCP/IP四层两张图的恩怨与互补TCP/IP体系结构最常被人拿来和OSI七层模型对比。OSI把网络通信拆成物理层、数据链路层、网络层、传输层、会话层、表示层、应用层七层而TCP/IP实际落地的是四层模型应用层、传输层、网络层、网络接口层。初次接触的人很容易纠结到底背七层还是四层考试写哪个我的建议是先理解四层再用四层去对照七层。OSI七层更像是理论框架它把“会话管理”“数据格式化”这些职责单独拆了出来但在现实网络里这些工作往往被合并进了应用层或由应用程序自己处理。TCP/IP没有那么多花架子它是从互联网实战中长出来的模型每一层都有对应的真实协议在跑比如HTTP跑在应用层TCP跑在传输层IP跑在网络层以太网帧跑在网络接口层。值得注意的是网络接口层在TCP/IP模型里是一个比较“粗糙”的位置它把物理层和数据链路层合并在一起。这是因为TCP/IP当初设计时并没有打算把物理介质的事情管得太细——同轴电缆、双绞线、光纤对上层来说都只是“能把比特送出去”的通道。这样做的结果是TCP/IP可以非常轻易地跑在以太网、Wi-Fi、移动蜂窝网络等各种介质上兼容性极强。1.2 端到端原则把复杂留给两端把简单留在网络TCP/IP体系结构里最核心的设计哲学我认为了解它比背任何协议字段都重要。这个原则叫端到端原则。简单来说网络内部的路由器、交换机只负责尽力而为地把数据包转发到目的地不做复杂的可靠性和状态维护而可靠性、流量控制、连接管理这些事情统统交给通信的两台主机来处理。这个设计听着简单实际影响深远。早期电信网络的设计思路是相反的方向网络内部节点非常聪明负责状态跟踪、重传、保证顺序终端设备反而很“笨”。TCP/IP选择把复杂逻辑放到端系统原因很直接网络节点越多保持每一个节点都稳定、状态一致就越困难一旦某个中间节点故障整个通信链路就可能断掉而端系统聪明一点即使网络丢包、乱序只要路径还通通信就能继续。用生活里的例子类比这就像快递运输。快递公司网络只保证把包裹从一个城市送到另一个城市中途丢件了、破损了快递公司只做基础赔偿真正的收货确认、商品检查、退换货协议是寄件人和收件人之间的事情。TCP端到端的确认重传机制就是寄件人发现对方没签收后主动补发。理解了端到端原则你就明白为什么TCP要设计得那么复杂——三次握手、确认号、重传定时器、滑动窗口这些全都是因为网络层本身“靠不住”而复杂的活只能放在主机上做。1.3 分层带来的实际好处排障、扩展与分工分层的另一个实在价值体现在故障排查上。网络问题千奇百怪但不分层的话你根本不知道从哪里查起。有了TCP/IP四层模型排查思路就变成了一条清晰的流水线先看应用层是不是正常比如浏览器报什么错、DNS能不能解析再看传输层连接有没有建立端口通不通、握手是否完成然后看网络层通不通ping外网IP是否通、路由是否可达最后才是物理链路和接口层的问题网线、Wi-Fi信号、ARP缓存。这就像排查家里水管漏水你不可能直接把墙砸了而是先看水龙头、再看阀门、再看主管道逐级缩小范围。TCP/IP分层给了每个排查环节一个明确的“检查点”每层只管自己那一段出了问题很容易定位到具体的位置。分层还让协议栈的实现和扩展变简单了。上层协议不需要关心底层用什么网卡、什么介质下层协议也不需要关心上层传过来的是网页数据还是邮件数据。各层之间只通过标准的接口交互所以你可以把HTTP换成HTTPS把TCP换成UDP甚至把IPv4换成IPv6都不影响其他层的正常工作。这种低耦合的设计是TCP/IP能活这么多年、适应各种新应用的根本原因。2. 四层模型各层功能详解从应用请求到网卡发包2.1 应用层业务规则与数据的样子应用层是TCP/IP体系里离用户最近的一层它不关心数据如何分段、如何路由、如何重传只关心“数据长什么样、语义是什么”。HTTP、HTTPS、DNS、SSH、FTP、SMTP这些你天天打交道的协议全部生活在这一层。应用层的数据通常以“消息Message”为单位。比如你朝浏览器地址栏输入一个网址并回车浏览器会构造一个HTTP请求消息里面有请求行比如GET /index.html HTTP/1.1、请求头Host、User-Agent、Accept等字段、请求体POST时才有。这些内容就是应用层传给传输层的原始数据传输层完全看不懂也不想看懂它只把这串字节当成一个整体往下传。DNS也是应用层的典型代表。很多人误以为DNS是网络层的工作其实不是。DNS是一个标准的应用层协议使用UDP或TCP的53端口它完成的任务是“把域名翻译成IP地址”。当你在浏览器输入www.example.com时系统会先向DNS服务器发起查询拿到对应的IP地址后HTTP请求才会真正发出去。DNS出了问题现象就是“浏览器显示找不到服务器地址”但网络本身可能是通的这正是应用层问题与网络层问题混淆的典型场景。2.2 传输层TCP的可靠性机制与UDP的轻量选择传输层是TCP/IP体系结构里戏份最重的一层它负责为两台主机上的应用进程提供端到端的通信服务。这一层有两个当家协议面向连接的TCP和无连接的UDP。TCP的核心卖点就三个字可靠性。它通过三次握手建立连接给每个字节编上序号接收方收到数据后回确认号发送方在规定时间内收不到确认就重传接收方还会检查序号的连续性如果有乱序就先缓存在接收缓冲区里等对齐了再交给应用层。这一整套机制保证了数据从一端到另一端时顺序不乱、内容不丢、重复被过滤掉。连接建立的过程非常经典。第一次握手客户端发送SYN包里面带一个初始序号ISN第二次握手服务端回复SYNACK同时带上自己的ISN第三次握手客户端再回一个ACK。三次握手完成后双方都知道“你准备好了我也准备好了”可以正式传数据了。很多人问为什么不是两次原因是如果只有两次握手服务端收到的SYN可能是一个已经失效的旧连接请求它无法区分这是新连接还是半截子旧连接而三次握手通过双方的序号和确认号同步能把历史遗留的重复请求识别出来并拒绝。UDP则完全是另一种思路。它不建立连接不保证可靠不做流量控制只做最小的事给应用层数据加上源端口和目的端口然后直接丢给网络层。这样做的代价是可能丢包、可能乱序但换来的是极低的延迟和极少的开销。视频直播、语音通话、游戏、DNS查询这些对实时性要求高、能容忍少量丢包的应用往往选择UDP而不是TCP。2.3 网络层IP寻址、路由与分片网络层的核心任务是把数据包从源地址送到目的地址具体干三件事寻址、路由、分片与重组。寻址靠的是IP地址IPv4是32位IPv6是128位。IP地址是逻辑地址它标识的是一台主机的“网络位置”而不是硬件本身。以太网里的网卡有自己的MAC地址但MAC地址只在局域网内有意义就像一个人的身份证号码走遍全国都有效却无法告诉你他现在人在哪个城市IP地址则像“当前住址”路由器能够根据它规划出一条到达目标位置的路径。路由选择是网络层最复杂的部分。路由器维护一张路由表里面有目的网段、下一跳地址、出接口等信息。当IP数据包到达路由器时路由器会查看数据包里的目的IP地址去匹配路由表如果匹配到就直接转发到对应的下一跳如果匹配不到就发给默认路由一般是通向互联网的出口。这个过程像在高速公路网里看路牌每个路口只告诉你下一个路口怎么走但一连串“下一跳”组合起来就能把你带到目的地。分片发生在数据包超过链路层最大传输单元MTU时。比如一个应用层生成了4000字节的数据TCP加了头之后是4020字节IPv4数据包默认允许最大65535字节但以太网一帧最多承载1500字节不含以太网头部所以IP层会把大数据包切成若干片每片都有自己的偏移量字段表示它在原始数据包里的位置。接收方根据偏移量把这些片重新拼成完整数据包再交给上层。分片机制虽然解决了大小差异问题但也带来性能损失所以实际网络里我们更推荐用路径MTU发现来避免分片。2.4 网络接口层ARP、MAC与以太网帧网络接口层是TCP/IP模型里最贴近硬件的一层它负责把IP数据包封装成可以在物理网络上传输的帧Frame。以太网帧是个很好的例子帧头部包含目的MAC地址、源MAC地址、类型字段然后是真正的网络层数据包最后是校验序列FCS用于检错。这一层有个人人听说、但没几个人真正见过它工作的协议——ARP。ARP的任务是“已知一个IP地址找到对应的MAC地址”。为什么需要它因为IP包虽然标明了目的IP但在同一个局域网内传输时网卡和交换机并不认识IP它们只认MAC地址。所以主机在发送数据前得先在本地ARP缓存里查一下如果没有就向局域网内广播一条ARP请求“谁是192.168.1.1请把你的MAC地址告诉我。”对应IP的主机收到后会单播回复这台主机再把这条映射关系缓存起来下次就直接用了。MAC地址与IP地址的配合构成了“逻辑寻址物理寻址”的架构。IP地址让数据能被路由到正确的网络MAC地址让数据能在最终的局域网里交付给正确的设备。这也是排查问题的一个重要思路如果ping一个局域网内的设备直接超时而IP网段又没错很可能问题出在ARP解析上可以用arp -a命令查看缓存确认有没有错误绑定。3. 数据在TCP/IP模型中的传输过程一个访问请求的完整旅程3.1 从输入网址到DNS解析应用层与传输层的第一道工序一位老工程师跟我说真正看懂TCP/IP不是看一百遍分层图而是亲手抓一次包把一次请求的每一步都跟分层图对上。这个感觉我深有同感接下来我带你完整走一遍假设你在浏览器输入www.example.com并回车。第一步是DNS解析。你的浏览器会调用操作系统的DNS客户端组件向配置的DNS服务器发送一个查询请求。这个查询请求本身要经过协议栈应用层生成DNS报文交给传输层的UDP协议UDP加上源端口随机高位端口和目的端口53再交给网络层封装成IP包目的IP就是DNS服务器的地址然后一路发到DNS服务器。DNS服务器回包后你拿到的是www.example.com对应的IP地址假设是93.184.216.34。拿到IP后浏览器才真正开始发起HTTP请求。注意HTTP请求依然要经过传输层。浏览器会在系统Socket接口上执行connect操作底层协议栈会尝试与93.184.216.34的80端口建立TCP连接。到这里传输层的工作才刚刚开始。3.2 三次握手与数据封装TCP头部里究竟写了什么建立连接时你的主机发送一个TCP SYN包。你可以抓包看看这个TCP头部里包含几个关键字段源端口比如49152、目的端口80、序号ISN一个随机生成的初始序号、SYN标志位为1。这个包交给IP层后会封装成IP数据包IP头部里写入源IP你的本机地址、目的IP93.184.216.34、协议号6表示上层是TCP、TTL字段比如64。为什么TCP头部里强调端口号因为IP层只负责把数据包送到主机但主机上同时开着几十个应用浏览器、邮件客户端、微信都在收发数据端口号就是用来区分数据该交给哪个应用进程的“门牌号”。源端口是对方回信用的地址目的端口则是你想敲开的门。SYN包发出后服务端如果正常监听着80端口会回应SYNACK它的序号是另一个随机值确认号是收到的ISN加1。你的主机收到后再回一个ACK确认号是服务端序号加1。这三次握手的数据包大小都很小一般只有几十字节。三次握手完成后TCP连接就算正式建立了这时候浏览器就可以把HTTP请求数据放上“运输带”。3.3 路由转发与封装IP报文如何穿越网络HTTP请求数据从应用层下来后TCP会把它分成长度合适的段。每次发送的数据大小受双方协商的MSS最大报文段长度约束通常比MTU小40字节TCP头20字节IP头20字节这样IP层封装后正好能装进一个以太网帧不会被分片。IP层收到TCP段后会加上IP头部。然后查找路由表如果你的目标IP不在本机网段内比如93.184.216.34默认路由会把数据包交给默认网关一般是你的路由器。此时IP包的下一跳MAC地址并不是目的主机的而是路由器的MAC地址网络接口层在以太网帧头的目的MAC字段里填的是路由器网卡的MAC这个地址通过ARP获取。数据包到了路由器后路由器会剥离以太网帧头重新查看IP包的目的IP、在自己的路由表里找下一跳然后重新封装新的以太网帧目的MAC变成下一跳设备的MAC继续转发。这中间可能经过十几个路由器每一跳都做同样的事情查路由表、换MAC、转发。整个过程里IP包本身的源IP和目的IP始终保持不变但每一跳的MAC地址都在变化这是理解局域网与互联网转发的最重要区别。3.4 接收端的解封装过程数据如何还原成页面数据到达目标服务器后流程倒过来。服务器的网卡收到以太网帧经过FCS校验通过后识别出类型字段确定里面是IP包于是剥离以太网头部和尾部把IP包交给系统的IP协议栈。IP协议栈检查目的IP是否为本机地址是则剥离IP头部把里面的载荷交给TCP模块。TCP模块根据端口号80找到正在监听的Web服务进程把数据放入该进程的接收缓冲区。接下来TCP要处理的是数据顺序问题。如果浏览器发来的数据分了多个TCP段可能前一个段还没到后一个段先到了。TCP的接收端缓冲区里会把这些段按序号排序不连续的区域不会交给上层应用必须等缺失的部分重传补齐后才把完整的数据流交付给HTTP应用。HTTP应用层拿到完整请求后解析请求行、请求头、请求体生成响应报文再走一遍同样的封包过程把响应数据返回给浏览器。浏览器再一层层解析HTML、CSS、JavaScript最终渲染出你看到的页面。这个完整闭环就是把“URL回车”变成一个视觉页面的全过程也是TCP/IP体系结构最直观的一次全景展示。4. 在Windows上做一次端到端发包收包测试4.1 测试前的环境准备Npcap与Wireshark装好如果你想真正“看见”前面讲的那些数据包抓包工具是必不可少的。Windows平台上最常用的就是Wireshark但新版Windows上抓包依赖一个底层的驱动库早期叫WinPcap现在官方推荐安装Npcap。我建议你直接下载Npcap安装包安装时必须勾选“Support loopback traffic”支持回环流量否则你抓不到本机127.0.0.1的回环包。Wireshark本身可以到官网下载安装完成后第一次打开它会提示你选择捕获接口。在Windows上你通常会看到以太网适配器、WLAN适配器以及一些虚拟机的虚拟网卡接口。如果你打算抓取一次真实的HTTP访问选当前正在上网的适配器通常是WLAN或以太网双击接口名称即可开始实时抓包。抓包之前有几个画面过滤器的基本功要练熟。抓包过滤器Capture Filter是在抓包之前设定语法偏向底层比如host 192.168.1.1、tcp port 80显示过滤器Display Filter是抓包之后对已捕获的数据做过滤最常用比如ip.addr 93.184.216.34、tcp.port 443、dns。我的建议是抓包时先全量抓抓完再用显示过滤器筛选因为抓包过滤器会把没过滤掉的数据包直接丢掉想再找就找不回来了。4.2 用ping/Test-NetConnection做一步步的连通性验证端到端测试的第一步不是直接打开浏览器访问外网而是按TCP/IP体系的层次逐层验证。我最常用的顺序是先ping 127.0.0.1这是本机回环地址能通说明基础协议栈安装正确然后ping本机IP比如ipconfig查到的IPv4地址能通说明网卡驱动和IP配置没问题接着ping默认网关一般是192.168.x.1能通说明你到路由器之间链路正常再ping一个公网IP比如223.5.5.5注意不先ping域名因为这能排除DNS因素最后才ping域名比如ping www.baidu.com能通说明DNS解析正常。每一步不通故障范围立刻缩小。127.0.0.1不通多半是协议栈损坏需要重装网卡驱动或重置网络网关不通问题在Wi-Fi信号、网线或者路由器本身网关通但公网IP不通问题可能是运营商链路、路由器路由表或上级网络公网IP通但域名不通基本就是DNS服务器的锅。除了pingWindows上还有一个非常好用的PowerShell命令Test-NetConnection。它的优势是专门测试TCP端口连通性。比如你想知道某台服务器的8080端口能不能连上直接执行Test-NetConnection 192.168.1.10 -Port 8080。它会返回TcpTestSucceeded字段True代表端口通False代表端口被防火墙拦截或者服务没启动。这个命令可以做信息收集也可以配合ping一起用快速把问题从“完全不通”精确到“IP通但端口不通”。4.3 抓包看一次真实请求过滤器与关键字段解读如果你已经装好Wireshark我强烈建议你实操一把抓一次访问HTTP网站的完整过程。注意现在很多网站都是HTTPS抓包看到的是加密后的TLS数据虽然能看到握手过程但看不到明文HTTP内容。想快速上手的话可以先访问一个HTTP网站或用NALAN、HTTPbin这类提供明文HTTP的站点来做实验。抓包时在显示过滤器里输入dns || http || tcp然后开始访问页面。你会看到一连串数据包先是DNS的请求和响应接着TCP三次握手的SYN、SYNACK、ACK然后才是HTTP请求、HTTP响应最后大概率还有TCP的四次挥手过程。点开一个SYN包你可以看到TCP头部里Flags字段中的Syn被置1Sequence Number是初始序号Source Port是本机随机端口Destination Port是80。这些字段之前全是纸面概念此刻全部变成了屏幕上实实在在的数字一下子就把TCP/IP体系结构从抽象拉到具体。再点开一个HTTP响应包能看到响应状态行比如HTTP/1.1 200 OK跟在浏览器F12开发者工具里看到的是同一份东西。有个排障细节值得记下来如果TCP报文一直在重传Wireshark会标记为TCP Retransmission或者出现TCP Dup ACK说明链路有丢包或拥塞如果反复出现TCP RST说明有端到端不可达或端口未监听如果看到了TCP Out-Of-Order说明数据包乱序比较多通常和网络的路径不对称有关。这些标记是排查“网络质量差”的第一手证据。5. iperf 压测实操用数据验证带宽与TCP性能5.1 为什么用iperf测出“真实带宽”而不是“标称带宽”很多时候你会发现文件传输速度远低于运营商宣称的百兆千兆带宽。原因很多无线信号衰减、路由器转发性能瓶颈、TCP窗口太小、链路丢包率高甚至网卡双工模式不匹配。想要量化这些性能问题靠一次下载文件测速是不够的因为下载服务器本身可能有限速、负载高测出来的数字无法反映你的链路质量。iperf就是专门用于测量网络最大带宽的工具。它基于客户端—服务端模式一台机器运行服务端另一台运行客户端客户端会尽量多、尽量快地发数据持续指定的时间最终输出这段时间内的吞吐量、重传数、CPU占用等指标。它跑出来的不是你家里某条应用链路的体验值而是这条链路在当前条件下的“极限能力”非常适合作对比实验调整TCP窗口大小、开启或关闭多线程、跑TCP还是UDP用同一组数据对比就能看出哪项参数在起作用。5.2 从安装到跑通iperf3服务端与客户端的完整参数iperf3是当前的主流版本官方提供了Windows预编译二进制包下载解压缩后就能在命令行里直接运行不需要安装。假设你有两台机器一台作为服务端IP为192.168.1.10一台作为客户端。先在服务端机器上执行iperf3 -s -p 5201-s表示启动服务端模式-p指定监听端口。默认端口是5201如果被防火墙拦截记得在Windows防火墙里放行UDP和TCP的5201端口或者切换一个测试端口。然后在客户端机器上执行iperf3 -c 192.168.1.10 -t 30 -i 5-c指定服务端IP-t设置测试持续30秒-i 5表示每5秒输出一次即时结果。测试结束后客户端会显示一个汇总面板包括Interval时间区间、Transfer传输量、Bitrate实时速率最后一行会给出总的吞吐量。如果想要压榨出每条TCP流的极限性能可以组合参数iperf3 -c 192.168.1.10 -t 60 -P 4 -w 256K-P 4表示同时开4条TCP流-w 256K表示把TCP发送缓冲区设置为256KB适合在高带宽高延迟链路上提高吞吐。跑完以后你会看到总的平均速率以及每条流的独立吞吐。5.3 看懂测试结果吞吐、重传与窗口的联动关系跑完TCP测试后我习惯重点关注三个指标Bitrate吞吐量、Retr重传数、Cwnd拥塞窗口。如果是局域网内测试吞吐量应该非常接近网卡速率比如千兆网络跑到900Mbps以上是正常的如果只有三四百Mbps同时Retr大于0基本可以断定有丢包或链路质量问题。丢包对TCP吞吐量的影响不是线性的而是灾难性的。比如一个1%丢包率的链路虽然只有1%的数据包丢失但TCP的拥塞控制算法会因为探测到丢包而急剧降低发送速率导致实际吞吐量断崖式下跌。这个现象在iperf的结果里非常直观Retr数量多Bitrate上不去。遇到这种情况先测试UDP方式排除掉拥塞控制算法的影响看看链路本身的物理可用带宽到底是多少iperf3 -c 192.168.1.10 -u -b 1000M -t 30-u表示UDP模式-b 1000M表示尝试以1000Mbps的速率发送。UDP模式会报告丢包率和抖动jitter。如果UDP能跑接近1000Mbps且丢包率极低说明物理链路没问题问题出在TCP参数、操作系统窗口设置、路由/交换机的缓冲区配置上如果UDP本身就大量丢包说明链路容量确实不够或存在瓶颈。我这里再强调一下TCP窗口的概念。TCP接收方的窗口大小决定了发送方在收到确认之前能发多少数据它和链路带宽、延迟共同决定了吞吐上限。理论最大吞吐 窗口大小 / 往返时延RTT。举个例子如果接收窗口是64KBRTT是50ms那么理论上最大吞吐也就64KB/0.05s ≈ 1.28MB/s这几乎和百兆还是千兆无关。所以在高带宽长距离链路上窗口必须调大iperf里用-w参数调整的就是这个。6. 常见问题与排查技巧实录6.1 六个高频故障现象、定位步骤与解决命令我把日常运维和开发中频率最高的几类TCP/IP问题整理成了一张速查表。遇到问题可以对照着看先明确现象属于哪一层再动手。故障现象可能层定位思路常用命令浏览器报“找不到服务器”应用层/DNS先ping公网IP再ping域名判断DNS是否出问题nslookup www.example.com同一局域网ping不通另一台机器网络接口层检查ARP缓存、IP段是否正确、是否在同一VLANarp -a, ipconfig /all能ping通IP但访问端口失败传输层检查服务是否监听、防火墙是否放行netstat -ano, Test-NetConnection文件传输速度远低于带宽传输层/链路层用iperf做TCP和UDP对比测试确认丢包率和窗口大小iperf3 -c ... -u -b 1000M数据包频繁重传网页加载慢网络层/链路层抓包看Retransmission、Dup ACK检查MTUWireshark, ping -f -l 1472所有互联网访问都断但局域网正常网络层查默认网关和路由表route print, ping 网关每次排查我都有一个习惯先问自己“这个现象在四层模型里是哪一层的事”。比如“浏览器打不开网页”错误信息如果是DNS解析失败那就是应用层你去看网线、查路由器反而浪费时间“可以上微信但打不开网页”这种说法也常见微信走应用层协议也可能使用UDP通信而网页走TCP的80/443如果防火墙拦截了TCP出站就会出现“某些应用能跑但网页打不开”的现象这是典型的传输层策略问题。6.2 几个容易被忽略的踩坑点第一MTU问题比想象中更容易出现。有些网络设备或运营商线路的MTU不是标准的1500可能是1492或更小。如果设置过大IP分片会导致性能骤降甚至某些应用直接超时。Windows下可以用这条命令测试最大不分片大小ping 8.8.8.8 -f -l 1472如果1472字节不分片能通说明标准MTU没问题如果超时或提示需要分片就逐步降低长度重试找到临界值然后用netsh interface ipv4 set subinterface命令修改对应网卡的MTU。第二回环测试通过不代表物理链路没问题。127.0.0.1走的是虚拟回环接口根本不经过网卡所以它只能验证协议栈不能验证硬件。要想测物理网卡和线缆必须ping本机实际IP或局域网内其他设备。我遇见过一个案例一台机器ping 127.0.0.1完全正常但上网就是时断时续最后发现是网卡驱动版本和Windows更新不兼容换了驱动版本立刻恢复。第三Wireshark看不到抓到的包不等于网络上没有流量。最常见的原因是抓包接口选错了尤其是用了无线网卡时Windows的WLAN接口抓包经常无法监视到所有802.11管理帧而且本机发出的包如果不开启混杂模式也可能漏抓。遇到抓包结果异常先确认选择的是正确的接口再确认有没有启用混杂模式最后检查显示过滤器语法是否正确。第四防火墙是TCP/IP实验里最容易出问题的隐形障碍。Windows默认防火墙会拦截很多入站流量你用iperf测试时如果客户端能连上但马上断开先去看服务端防火墙的入站规则有没有放行对应端口。测试的时候建议在确认内网安全的前提下暂时关闭Windows Defender防火墙当然要注意安全不要在外网环境做这个操作排除问题后再打开。第五IPv4地址耗尽是推动IPv6的原因之一但实际网络里还经常遇到地址冲突。Windows下如果出现“IP地址冲突”提示用ipconfig查看本机IPv4再用arp -a确认局域网里这个IP对应的MAC是否和你的一致。如果设备多了还可以用nbtstat -a IP查看对方的NetBIOS名称进一步确认身份。第六判断一个连接是不是正常关闭抓包时看TCP挥手次数。正常是四次FIN/ACK的交互但很多情况下一方会直接发送RST连接立刻终止。不少开发者把“连接被重置”当成网络故障其实RST是TCP协议对“对端不想继续这个连接”的标准表达真正要查的是应用层为什么决定放弃连接。这时用Wireshark右键点击对应TCP流选择“Follow TCP Stream”看应用层数据往往能找到真正的报错原因。我个人在实际操作中的体会是TCP/IP体系结构最漂亮的地方不是那一张张分层图而是它让网络问题永远有迹可循。哪怕你暂时记不住所有协议细节只要熟悉这条“应用层—传输层—网络层—网络接口层”的链路知道数据在每一层加什么头、做什么事排障时心里就有了坐标遇到问题也能一针见血地找到切入点。最后再分享一个小技巧自己搭一套只有两台电脑的局域网一台开iperf服务端另一台开Wireshark抓包然后反复跑HTTP请求和iperf测试把握手数清楚、把重传看明白。比看十遍教科书都管用。
返回列表