
如果你正在为“计网相关协议总结”这个题目挠头大概率不是不够努力而是被教科书里“先背七层模型、再逐层列协议”的顺序带偏了。我当年也一样三次握手、四次挥手、DNS递归、ARP广播、TCP拥塞控制……背得滚瓜烂熟遇到真实项目里的网络故障照样抓瞎。后来想通了一个问题协议不是一个一个单独背的而是一条生产流水线上的不同工序。只要你把“一个数据包从你的电脑出发经过网线、路由器、服务器最后把网页内容带回来”当成一条完整的故事线每一个协议都有了位置和职责自然就记住了。这篇文章就按这个思路把计网里最重要的协议串一遍适合正在备考、刚入行的开发以及想系统补一补网络底子的运维同学。1. 别按层背协议把“数据包的一次出行”当主线1.1 为什么协议总是背了就忘问题出在记忆方式上。教材喜欢从应用层往下讲先把HTTP、DNS、FTP这些名字塞给你然后再讲TCP、IP、ARP学的时候每一层都是孤立的考试一过全忘光。工作之后你会发现真正有价值的能力是“定位问题在哪一层”而不是“能背出多少协议缩写”。换一种方式假装你的电脑要给某网站发一个请求。这个请求先被应用层协议包装成“人话”再由传输层协议负责“可靠地送出去”接着网络层协议负责“在错综复杂的网络里找路”最后链路层协议负责“把数据交给物理线缆”。每一层只解决一个问题层与层之间的接口就是“下一层的报文头”。1.2 数据出门前的三层“换装”以最常见的HTTP请求为例完整的过程是这样的应用层把请求内容封装成HTTP报文里面包含请求行、请求头、请求体。传输层给这份报文加上TCP头部头部里最关键的信息是源端口和目的端口——端口决定了这份数据到达主机后交给哪个应用程序。网络层继续加IP头部写清楚源IP和目的IP——这决定了它从哪台机器出发、最终到达哪台机器。链路层在IP报文前后再套一层以太网帧包含源MAC地址和目的MAC地址——这是网卡之间真正“面对面”通信时使用的地址。到达对方服务器后每一层再按相反顺序“拆包装”网卡收下帧→去掉以太网头→交给IP层→去掉IP头→交给TCP层→按端口号交给对应进程→进程读到的就是最初那个HTTP报文。这个“封包-拆包”的过程就是所谓的协议栈数据流。理解它之后抓包工具里那些一长串十六进制数据就不会再吓到你你看到的其实只是每一层协议的头部信息依次堆叠在一起。1.3 为什么我推荐从链路层往上记大多数教学视频让你先记HTTP因为贴近生活。但实际排查问题时链路层和网络层往往才是“沉默的凶手”。我见过太多人遇到“网页打开慢”就死磕HTTP抓包一看根本没有请求发出去问题出在ARP解析或DNS解析阶段。建议的学习顺序是从网线插上那一刻发生的事开始——DHCP帮你拿到IP → ARP帮你找到网关 → 你的请求交给IP协议找路 → TCP保证不丢包 → 最后才是HTTP在你的浏览器和服务器之间说话。顺着这条路走一遍比正着背十遍都管用。下面我就按这个顺序展开。2. 在网线上找路ARP、IP与ICMP的真面目2.1 IP地址负责“找到主机”MAC地址负责“找到邻接设备”很多人搞不清楚IP地址和MAC地址的区别其实一句话就能说明白IP地址是网络的逻辑地址它描述“数据要去哪台机器”MAC地址是链路的物理地址它描述“下一站数据该交给谁”。打个比方IP地址像收件人的身份证号无论包裹走到哪个城市都指向同一个人MAC地址像驿站墙上的门牌号每到一个驿站快递员只看当前驿站的门牌来决定交给谁门牌号只在当前这条运输路段有意义。数据包每经过一台路由器源MAC和目的MAC都会更新但源IP和目的IP始终不变直到到达终点。IP协议是网络层的核心它解决“跨网络怎么寻址和转发”的问题。IPv4地址不够用所以有了NAT——家庭路由器把内网一堆192.168.x.x映射成一个公网IP出去。IPv6的128位地址空间超大还顺带改进了自动配置和邻居发现替代了ARP和部分DHCP场景。2.2 ARP在局域网里喊一声“下一站怎么走”当你给同网段的主机发包时IP层已经把目的IP写好了但网卡发送以太网帧必须要知道目的MAC。这个“IP地址→MAC地址”的翻译工作就交给ARP。ARP的机制非常朴素先查本机ARP缓存表如果没有对应表项就在局域网里发一个广播帧内容大意是“我的IP是A谁的IP是B请把你的MAC告诉我”。目标是B的主机收到后回复自己的MAC源主机把这条映射写进缓存并设置老化时间通常几分钟。这个过程在正常网络里是“你好我好”但在不安全的环境里就是可攻击点。攻击者可以冒充目标IP回应ARP请求把流量引到自己机器上做中间人监听或篡改这就是常说的ARP欺骗。防范办法包括在关键设备上配置静态ARP表项、交换机开启DAI动态ARP检测、接入网络前先确认网关MAC是否正常。2.3 ICMP网络世界的体检报告和故障通知单ICMP经常被忽略但排查网络时它是第一板斧。Ping命令就是最典型的ICMP应用发送方发出Echo Request对方回Echo Reply能通说明从你的机器到目标之间链路工作正常。ICMP不只用于探测它也是网络设备的“故障通知单”。比如路由器不知道下一步往哪走就会回一个“目标网络不可达”你访问的端口没人监听对方主机可能回“目标端口不可达”IP报文在路由器之间绕圈导致TTL减到0会回“超时”消息。Traceroute命令就是故意把TTL从1开始递增让每一跳路由器回复超时消息从而把路径上的路由器IP一个接一个暴露出来。需要提醒的是不少生产服务器会限制或丢弃部分ICMP报文所以“ping不通”不一定代表服务不可用还要结合端口测试判断。反过来说ping通也只代表网络层可达不代表应用层正常这一点我们在第五部分还会展开。3. TCP与UDP可靠传输的双面人生3.1 端口是门牌号TCP是快递签收员传输层的作用是解决“数据包到达主机后到底该交给哪个进程”的问题。TCP/UDP头部里的源端口和目的端口就是给操作系统用的“门牌号”。用快递类比IP把包裹送到小区门口主机端口决定包裹递给哪一户进程。TCP最核心的价值是可靠传输。什么叫可靠不丢、不重、不乱序、不损坏。它实现可靠的手段主要有四个序号和确认号发送方给每个字节编号接收方回ACK时带上“下一个期望收到的字节号”双方据此发现丢失和乱序。超时重传发出数据后如果超过RTO还没收到ACK就重新发送。滑动窗口接收方在TCP头部里告诉发送方“我还能收多少字节”发送方据此控制发送速度防止撑爆接收缓存。拥塞控制发送方自己维护一个拥塞窗口用慢启动、拥塞避免、快速重传、快速恢复等机制探测网络当前的承载能力避免把网络堵死。很多人只在概念上背拥塞控制真正排查问题时最容易忽视的是RTO和RTT的关系。网络抖动时TCP会自动降低发送速率这是设计上的自我保护。你看到“吞吐上不去”不一定是带宽不够而是丢包率太高导致拥塞窗口一直涨不起来。3.2 三次握手的真实含义交换初始序号三次握手大家都会背SYN → SYNACK → ACK。但为什么非得三次核心原因是双方要各自确认“我能收到你你也能收到我”更重要的是要同步双方的初始序列号ISN。TCP的序号不是从0开始随意定的而是有随机化和递增规律防止恶意伪造和与旧连接混淆。如果只有两次握手服务器发出SYNACK后无法确认客户端是否收到了自己的初始序号一旦第一次SYNACK丢失服务器会误以为连接已经建立白白保持半开连接等待。三次握手让双方都确认了彼此的序号起点之后才能按序号正确拼装数据。类似的还有四次挥手。回收连接时需要双方各自关闭单向的数据通道所以有FIN、ACK、FIN、ACK四步。主动关闭方最后要进入TIME_WAIT状态等上2MSL最大报文段生存时间的两倍这是为了让网络中残留的重复报文彻底消失避免影响新连接。日常运维时如果服务器大量端口处于TIME_WAIT可以结合负载均衡或调优内核参数处理但不能盲目把TIME_WAIT清零否则可能出现旧报文污染新连接的问题。3.3 为什么很多实时场景选UDP而不是TCPUDP的头部只有端口号、长度和校验和没有任何可靠性机制天然就是尽力而为的“群发小广告”。但真实世界里有大量服务基于UDPDNS查询、视频会议、在线游戏、语音通话以及现在越来越流行的HTTP/3。道理也很简单TCP的可靠是靠延时换来的。丢了包要等超时重传前面丢了包后面的数据得排队这在音视频场景里是灾难——你宁可那一帧画面渲染出一点小瑕疵也不想让整段通话卡死。UDP把“是否重传、重传多少、延迟多长时间”的决定权完全交给应用自己去处理应用可以根据实时性要求做出最合适的取舍。我见过不少刚接触网络的同学一听到UDP就问“那怎么保证不丢包”。答案是协议层不保证但应用层可以自己实现一定程度的可靠性和时序控制比如给每个包加序号、做缓冲、做前向纠错。UDP不是“不能可靠”而是“把可靠的选择权向上转移”。3.4 队头阻塞TCP可靠性的背面阴影说到TCP的代价不得不提队头阻塞。HTTP/2之前一个TCP连接同时交错传输多个请求时如果一个片段丢了接收方缓存里后面所有完整收到的数据都无法上抛给应用只能等待重传整个连接被一个包卡住。视频卡顿、页面加载慢很多时候不是服务器慢而是TCP队头阻塞在作祟。QUIC协议正是冲着这个问题来的。它基于UDP在用户态实现了类似TCP的可靠传输、拥塞控制和加密同时让多个“流”互相独立一个流丢包只影响自己不会阻塞其他流。HTTP/3就是建立在QUIC之上的新一代应用层协议。理解了这个背景你再去读QUIC的文档会顺畅得多。4. 应用层的那些协议DNS、HTTP与TLS搭档干活4.1 DNS你在地址栏敲下域名后系统做了什么不管用什么访问网站第一步几乎都是DNS解析。你在浏览器输入一个域名操作系统会先查本地hosts文件再查本地DNS客户端的缓存都没有就去找配置的递归DNS服务器。递归DNS服务器拿到域名后如果自己缓存里没有就会从根域服务器开始逐级查询先问根服务器“.com是谁管的”再问“.com服务器这个域名该找谁”然后问权威服务器拿到最终的IP。这个过程中每一级都可能缓存结果TTL决定了缓存的有效时间。你自己手动修改过DNS配置的话应该感受过“改完不生效”的困扰多半就是缓存还没过期。DNS记录不止A记录一种。邮件服务器看MX记录子域委托看NS记录验证域名归属用TXT记录负载均衡还可能依赖多条A记录轮询。还有一类叫CNAME的别名记录一个域名指向另一个域名最终解析到IPCDN厂商特别喜欢用它来灵活切换源站。4.2 HTTP的三次版本换代都在解决同一个问题HTTP协议从1.0到1.1再到2.0和3.0核心矛盾始终没变如何在一条链路上更高效地传递多个请求。HTTP/1.1用keep-alive支持持久连接减少反复握手但同一时刻一个连接只能处理一个请求浏览器想并行加载多个资源只能开多个连接很浪费。HTTP/2引入多路复用和二进制分帧一个连接上可以同时交错传输多个请求和响应还做了头部压缩。它解决了应用层的队头阻塞但别忘了上一章说的TCP层丢包时照样会堵住整条连接这是HTTP/2的软肋。HTTP/3把传输层从TCP换成基于UDP的QUIC后多路复用和可靠传输做到了真正互不干扰。每一次HTTP版本升级本质都是对“连接效率”和“拥塞耐受性”的重新平衡。我经常跟团队说一个判断方法如果你们的接口调用是短平快的低并发场景HTTP/1.1足够如果页面依赖几十个并行静态资源HTTP/2收益明显如果在弱网环境和移动端下仍有高并发诉求值得认真评估HTTP/3。4.3 TLSHTTP身边的加密保镖HTTP本身是明文协议在公共Wi-Fi等场景下裸奔风险极大。HTTPS就是在HTTP和TCP之间夹了一层TLS协议来加密和认证。TLS握手的过程可以浓缩为几步客户端问候ClientHello带支持的加密套件和随机数→服务器问候ServerHello选加密套件自己的证书→客户端验证证书并生成会话密钥用公钥加密传给服务器→双方用会话密钥加密一个Finished消息相互确认。完成之后之后的所有应用数据都走对称加密速度快得多。这里有两个高频考点一是证书链信任浏览器内置的根证书颁发机构信任根证书根证书签名给中间证书中间证书再签发站点证书形成信任链二是TLS 1.3大幅精简了握手把原来最多两个RTT的握手压缩到1个RTT恢复会话时甚至支持0-RTT。对用户体感而言TLS握手少一个RTT就是打开网页快了几十毫秒。4.4 HTTP之外的常客WebSocket和DHCP如果你的应用需要服务器主动推送消息比如在线聊天、协作编辑、实时行情用HTTP轮询会非常低效。WebSocket先通过HTTP完成协议升级握手之后双方在同一个TCP连接上全双工通信服务器可以随时把数据推给客户端这是它与HTTP“一问一答”最大的不同。另一个很容易被忽略的是DHCP。设备接入网络时如果没有手动配置IP就会通过DHCP广播去“租”一个IP地址、子网掩码、网关和DNS地址租约到期还要续租。这个协议平时感觉不到存在但如果公司网络里混入一个假冒的DHCP服务器就可能把客户端引导到错误的网关属于经典的网络层安全风险。5. 协议踩坑现场真实链路问题的分层排查法5.1 三层视角先定位故障侧再动手查细节工作中遇到“打不开网站”先不要急着改代码或重启服务按下面的顺序判断问题在哪一层链路层/网络层先在客户端ping网关、ping目标IP确认链路通不通、路由通不通。传输层确认目标端口是否监听常用本机telnet目标IP端口或者用curl -v看TCP连接是否建立。应用层如果TCP能连上但响应不对再去看HTTP状态码、应用日志、DNS解析结果。有个非常典型的排查案例某一台服务器访问某业务系统很慢抓包发现TCP三次握手没问题但TLS握手迟迟没完成最后定位到是证书链里缺了中间证书导致客户端在证书验证阶段等超时。这就是典型的“网络通、HTTP起不来、TLS层卡住”的场景没有分层意识的人会一直查错方向。5.2 用抓包工具让你对协议“眼见为实”纸上谈兵再多不如实际抓一次包。抓包工具最常用的功能是先设置过滤器比如只保留特定IP和端口再观察数据包列表。建议自己搭一个极简环境做实验本机开启一个监听某端口的小服务然后用客户端访问它抓包看完整过程。你会非常直观地看到先是TCP三次握手的三个包然后是HTTP请求和响应最后是四次挥手。如果访问的是HTTPS站点还能看到TLS ClientHello在哪里插入、证书是在哪个包返回的。看过一遍协议栈里各层的关系就再也忘不掉了。抓包时最常用的筛选条件大致如下观察目标常用筛选只看某个IP的流量ip.addr x.x.x.x只看某端口的TCP流量tcp.port 443只看DNS查询dns.qry.name contains 域名只看HTTP请求http.request只看TLS握手tls.handshake.type 1不要被抓包工具里满屏的包吓到正常浏览一个网页就有上百个包。先加过滤器再按“时间先后”和“协议类型”两个维度看很快就能建立感觉。5.3 几个我最常用的命令组合排查网络问题我的固定起手式是这几件套ping 网关IP确认本机到网关的链路是否正常顺便看延时有没有明显波动。traceroute 目标IP看数据包经过哪些路由器定位是不是在中间某跳丢了。nslookup 域名确认解析到的IP地址是否符合预期重点看是不是缓存了旧的记录。curl -v 目标URL一次性把DNS解析、TCP握手、TLS握手、HTTP请求响应全部打出来是排查服务端问题最高效的命令。ss -antp看本机端口监听状态和连接状态确认服务有没有起来、连接总数是不是异常高。整套命令跑下来问题出在哪一层基本上就缩小到很小的范围了。之后再进行针对性抓包效率会高很多。6. 协议的安全本色从明文裸奔到证书信任链6.1 常见协议层面的安全风险与对策协议设计时优先考虑的是“能通”很多安全属性是后来补的。日常防护里下面几类风险最常见明文协议的风险像早期HTTP、部分内部服务用的明文TCP数据可被网络上的其他设备读取。对策是全站启用HTTPS敏感接口额外做加密和签名。ARP欺骗与恶意DHCP攻击者伪造ARP应答或接入假冒DHCP服务器把客户端流量劫持到自己的设备。对策是网关部署ARP防护、交换机开DAI、重要主机配静态ARP。DNS劫持和缓存投毒客户端拿到错误域名解析结果被引导到仿冒站点。对策是使用可信的DNS服务、开启DNS安全扩展校验客户端注意证书告警。TLS配置不当证书过期、私钥泄露、使用了已不安全的加密套件、客户端跳过证书验证等情况会让HTTPS形同虚设。对策是定期检查证书有效期、做TLS配置审查、客户端做好证书校验与强提示。6.2 理解“信任链”就理解了HTTPS为什么能防冒充HTTPS防的不是“数据包被看到”而是“你正在跟谁说话”。公网世界里靠的是证书信任链根证书机构预置在操作系统里由它签发中间证书再签发给具体域名。当客户端收到服务器的证书时会往上找签发者一路找到自己信任的根证书同时校验证书域名和有效期确认无误后才完成握手。如果中间任何一环对不上浏览器就会弹出红色告警。这个机制决定了“冒充域名”在正规HTTPS下极难实现除非客户端自己跳过了证书校验——这就是我反复提醒不要随便“忽略证书错误继续访问”的原因。6.3 协议安全自查的小清单无论你维护的是网站还是内部中间件做安全排查时建议过一遍这份清单所有对外服务是否都强制HTTPSTLS版本是否不低于1.2加密套件里是否还有弱算法证书是否在有效期内证书链是否完整网络边界有没有防止ARP欺骗、DHCP欺骗的机制关键主机的DNS配置是不是可信的日志里有没有异常的TCP重传、频繁连接断开、大量的ACK轰炸这六项过完大部分协议层的明显弱点都能暴露出来。最后说一点个人体会学协议最忌“看完就合上书”。哪怕只是在自己电脑上开一个抓包工具把一次HTTPS访问从DNS到TLS再到HTTP的完整包看一遍抵得上背十遍OSI七层模型。我带的同学里凡是踏踏实实做过一轮抓包实验的后面面试和工作里谈到计网基本不会被问倒。按这条“数据包旅行”的主线再回头看整个协议体系你会发现它们不再是散落的缩写而是一套环环相扣的分工协作。