:传输层、网络层与应用层排障指南)
计算机网络基础2这个标题一看就知道是系列内容。上一篇大概率已经把物理层、链路层、局域网还有基础的网络设备讲完了这一篇要往前再走一步去碰传输层、网络层和应用层。我最近在帮团队带新人也顺便翻了不少期末复习笔记发现一个共性很多人不是不理解协议而是不知道这些协议到底在什么场景下被触发更不知道抓包看到的内容长什么样。这篇就把“计算机网络基础”里最容易考、也最影响排障能力的三个层次拆开讲给你一份可复用的学习路径。先说明白这篇适合谁看。如果你是准备期末考试的计算机专业学生这篇能帮你把TCP、UDP、IP、DNS、HTTP这些高频考点串成线如果你是想转DevOps或者已经在做运维开发这篇会更偏实战感你会看到这些协议怎么在日常排障里起作用哪怕你只是好奇为什么有时候网页会弹系统检测到异常流量这种提示阅读这篇也能理解背后是服务端的限流策略而不是你电脑出了问题。1. 先搞清楚基础2到底该学什么1.1 从检索热词里看真实的网络基础需求把这次的热搜词摊开看能发现很有意思的现象。围绕计算机网络基础检索的人画风基本分三类一类是学生在搜王道谢希仁自顶向下期末复习这说明大家卡在教材和考试的对应关系上一类是技术人员在搜DevOps工程师学习的计算机网络应用层这属于想学以致用的还有一类是搜系统检测到您的计算机网络中存在异常流量明显是遇到实际问题来求答案的。这三类需求其实指向同一个底层问题教材里的网络体系是分层的但真实世界的网络问题是跨层的。异常流量提示到底是应用层的限流还是网络层的丢包应用层该学多深和期末复习该背什么听起来是两个问题答案却都在同一个协议栈里。所以基础2的内容编排我的建议是不要按书上的章节顺序机械地往后翻。更高效的方式是先把传输层吃透因为TCP的状态机制是后面所有排障的抓手再学网络层的IP编址和路由逻辑因为真实系统的IP规划问题全在这里最后看应用层的HTTP、DNS、DHCP因为这些是你平时敲命令、写脚本时真正打交道的东西。1.2 自顶向下、王道、谢希仁怎么选这几乎是每个学网络基础的人都会问的问题。湖科大教书匠的视频在B站很火适合配合课件理解概念尤其是动画演示三次握手和滑动窗口比死读书快很多。王道的书和课程定位是考研知识点密集重点突出但如果你不是要考试读起来会有点干。谢希仁的《计算机网络》是很多学校的教材写法比较传统胜在完整缺点是概念密度高容易看完一章忘一章。我的实话是不要同时开三本书会精神分裂。选一条主线比如谢希仁或者王道作为骨架再选一个视频课作为画外音帮你把动态过程看明白最后必须配一个抓包工具让自己亲手看到报文长什么样。三条腿走路比任何单本书都管用。自顶向下的《计算机网络自顶向下方法》其实特别适合作为第一本入门书它从应用层开始讲先让你看到HTTP、DNS这些能感知的东西再往底层挖对于我学这玩意儿到底干嘛用的困惑这个切入角度天然有优势。2. 传输层TCP和UDP基础阶段最值钱的战场2.1 三次握手和四次挥手别只背状态名传输层是计算机网络基础2的核心也是期末和面试的必考点。TCP三次握手大家都会背SYN、SYNACK、ACK。但我发现一个普遍问题很多人能背出状态名却看不懂抓包结果更不知道握手失败时怎么排查。实际的握手过程是客户端先发一个SYN包携带一个初始序列号比如1000服务器收到后回复SYNACK携带自己的初始序列号比如5000同时确认收到客户端的1000客户端再发一个ACK确认收到服务器的5000。这个时候连接建立。你抓包时会看到三次TCP握手颜色各不相同第一次是SYN第二次是SYNACK第三次是ACK。为什么需要三次而不是两次核心原因是双方需要确认彼此的收发能力都正常。第一次客户端发SYN服务器能收到说明客户端的发送能力和服务器的接收能力没问题。第二次服务器回复SYNACK客户端能收到说明服务器的发送能力和客户端的接收能力也没问题但此时服务器还不知道客户端能不能正常收到自己发的数据所以第三次客户端必须发ACK确认服务器收到后才确认他也能正常收我发的数据。这个逻辑类似两个人对讲机试麦你说一句你能听到我吗对方回我能听到你能听到我吗你再回一句我也能听到你这才算链路完全可靠。四次挥手也一样别死记FIN的顺序。重点是理解TCP是全双工的两条方向的数据通道是独立的。A说我这边数据发完了准备关闭发FINB回复ACK表示收到了但B可能还有数据要继续发等B也发完了才发FINA再回ACK连接才真正关闭。所以你会看到四次交互偶尔还会合并成三次因为B的ACK和FIN可能在同一个包里发出。这种细节为什么重要因为实际排障时你执行netstat看到大量TIME_WAIT或者CLOSE_WAIT如果不懂四次挥手的状态转移就完全不知道问题出在哪一端。比如CLOSE_WAIT堆积通常是服务端收到了对方的FIN却没有正确调用close说明应用层漏了资源释放TIME_WAIT过多则通常是主动关闭方在高并发场景下积累的可以通过调整内核参数缓解。2.2 可靠传输、流量控制和拥塞控制搞懂为止TCP的可靠传输依赖三件事序列号、确认应答、超时重传。序列号解决了数据乱序怎么排序的问题确认应答告诉发送方我收到了哪些数据超时重传处理的是没收到确认怎么办。这三件事合在一起TCP才能在一个可能丢包的IP网络上给上层应用提供一条看起来不会丢数据的通道。流量控制解决的是别把接收方撑爆。接收方会在ACK里带上自己的窗口大小告诉发送方你最多再发这么多。这就像一个仓库管理员在门口挂牌子写着还能再卸三车发送方看到牌子就控制发货速度。如果接收方处理不过来窗口变成0发送方就停下来但会定期发探测包问仓库腾出地方了吗。拥塞控制解决的是别把网络本身搞崩溃。这里面有几个经典算法慢启动、拥塞避免、快重传、快恢复。慢启动不是真的慢而是一个探测过程从很小的拥塞窗口开始每轮翻倍指数增长直到达到阈值然后进入拥塞避免的线性增长阶段。一旦发生丢包就把阈值降一半窗口回退重新开始。这块内容期末复习时很容易出计算题比如已知RTT问慢启动到某个窗口需要几轮。我的建议是不要死记公式而是画一张拥塞窗口随时间变化的锯齿图把慢启动的翻倍增长、拥塞避免的加性增长、超时后的乘法减小标清楚所有计算题都能从这张图推出来。2.3 UDP看起来简单排障时却容易忽略UDP和TCP最大的区别总结成一句话UDP只管发不管有没有送到。没有握手、没有确认、没有重传头部只有源端口、目的端口、长度和校验和。这种不管不顾反而让UDP在很多场景下不可或缺DNS查询、DHCP、视频会议、游戏实时通信都用UDP。这个特性带来的排障思路差异非常大。TCP连接如果出现问题你第一反应是查握手流程可能卡在防火墙或者SYN包被丢。UDP出了问题没有握手可查只能看三个层面端口通不通、服务有没有监听、防火墙有没有放行UDP流量。我遇到过好几次服务正常但客户端连不上的问题排查到最后都是云安全组或者iptables策略没放开UDP端口而因为TCP是通的大家总觉得网络没问题。这就是只看TCP不看UDP的典型教训。很多人还会忽略一个细节UDP是面向报文的TCP是面向字节流的。这意味着用UDP发一次数据对方一次recv就收到完整报文用TCP发送两次数据接收端可能一次就收到也可能分很多次收到。应用层用TCP协议时必须在消息边界上做处理比如加长度头或者分隔符这也是为什么HTTP/1.1需要Content-Length字段的原因。期末复习的时候如果题目问你为什么TCP粘包而UDP不粘包答案就在于这个面向字节流和面向报文的区别。3. 网络层IP编址与路由帮你把拓扑图看懂3.1 子网划分和CIDR做需求计算最有用应用层因为贴近工作是很多人实际接触最多的部分但如果真的在实施环境里做规划你马上会发现底层IP知识不够用。网络层这一块期末爱考子网划分和路由协议实际工作中最常用的则是CIDR、VLSM、路由表查表逻辑和NAT。子网划分的核心思路是把你手上的IP段切分成更小的网段每个网段对应一个广播域或者一个部门。比如你拿到一个192.168.1.0/24需要给三个部门各分配一个子网每部门最多50台设备。/24表示子网掩码有24个1主机位只有8位可用地址最多254个。想分三个子网至少得借2位主机位给网络位/26每个子网可用地址是2^(32-26)-262够50台用四个子网给三个部门还多一个备用。这类计算题到期末非常常见。我不建议靠背诵2的幂次表来硬算更推荐用二进制快速转换子网掩码255.255.255.192写成二进制是最后8位为11000000说明主机位6位2^6 - 2 62。借了2位所以/24变成/26。所有变长子网划分题基本都能用这个思路推算。实际项目中两个最常见的问题都出在子网规划上一是IP冲突机器多起来后有人手动配置了重复地址二是子网掩码写错导致广播域扩大网络里到处是广播包整体性能下降。所以我一直强调网络基础不是纯理论它直接决定你会不会把一套几百台设备的办公网搞崩。3.2 路由与NAT真实环境的转发逻辑路由协议分为静态路由和动态路由。动态路由里RIP是距离矢量协议跳数作为度量值适合小型网络OSPF是链路状态协议基于带宽计算开销适合中大型网络BGP是边界网关协议用在互联网AS之间的互联。期末考试的复习重点通常是RIP和OSPF的对比一个靠听说一个靠地图。OSPF为什么比RIP强因为RIP只知道自己到目标有几跳不关心链路质量一个1Mbps的链路和一个10Gbps的链路跳数相同它会傻乎乎地选1Mbps那条。OSPF让每台路由器把自己知道的所有链路信息广播给全网每台路由器都构建出完整的网络拓扑图然后用Dijkstra算法算出最短路径树。这一套机制不复杂但它能解释为什么现代企业网都在用OSPF而不是RIP。NAT就更是网络基础里的重点了。内网设备使用的是私有IP地址比如192.168.x.x、10.x.x.x要访问公网必须经过NAT转换把私有IP映射成公网IP和端口。家用路由器就是在帮你做这个事。抓包的时候你会经常看到源地址是192.168.x.x但到了公网抓包看到的源地址已经变成运营商分配的公网IP了。这个看不见的转换经常导致两个问题第一个是内网设备从外网无法主动访问因为NAT映射表里根本没有这条记录第二个是某些应用层协议携带了自身的IP地址信息比如FTP的PORT命令做主被动模式切换时会莫名失败。4. 应用层基础阶段离工作最近的部分4.1 HTTP/HTTPS从URL到响应抓包看一次就够了应用层是计算机网络基础2里最亲民的部分因为你日常开发、写接口、调API全在跟它打交道。学习HTTP最有效的方法不是背状态码而是打开抓包工具亲手发几个请求看看报文结构。一个HTTP请求报文由请求行、请求头、空行、请求体组成。请求行包含方法、URI、协议版本请求头里的Host、User-Agent、Accept、Cookie各有各的意思。响应报文则是状态行、响应头、空行、响应体。你只要抓几次包就能记住200表示成功、301/302表示重定向、403禁止访问、404不存在、500服务器内部错误。这个状态码分布是分布式系统排障的基本语言。HTTPS则是HTTP之上加了TLS/SSL加密层。基础阶段至少要理解两件事非对称加密用来协商对称密钥对称加密用来加密实际数据数字证书用来验证服务器身份。很多人面试被问HTTPS握手过程会紧张其实抓住主干就够了客户端连上服务器后服务器把证书发过来客户端验证证书是否可信可信就生成一个随机密钥用服务器的公钥加密发回去服务器用私钥解密拿到随机密钥之后双方就用这个随机密钥做对称加密通信。我强烈建议做一个小实验命令行里执行curl -v https://example.com观察输出的* Connected to、subject、issuer、SSL connection using这些段落你立刻就能把证书验证和密钥协商的全过程串起来。比反复看时序图强得多。4.2 DNS和DHCP两个没人注意但坏了就全挂的服务考试里DNS、DHCP通常只是选择题的配角可一旦工作中DNS出问题全公司都会沸腾。DNS负责域名解析把www.example.com变成IP地址。解析过程是递归加迭代你的电脑先问本地配置的DNS服务器这个服务器如果没有缓存就替你去问根服务器再问顶级域服务器再问权威服务器逐级拿到答案最后把结果返回给你。排查DNS问题常用命令是nslookup和dig。dig的输出比nslookup详细得多可以直接看到ANSWER SECTION、查询耗时和DNS服务器IP。有一次同事反馈网站打不开但浏览器访问IP地址却正常我一查dig发现是本地DNS解析到一个已经下线的旧IPTTL又特别长刷新缓存后问题立刻解决。这种场景学的就是DNS那一小节的应用。DHCP就更有意思了。它让你的设备开机后自动获得IP地址、子网掩码、网关和DNS。DHCP通信过程用UDP协议客户端发DISCOVER广播去找服务器服务器发OFFER提供地址租约客户端发REQUEST确认要这一个地址服务器回ACK批准。四个步骤DISCOVER、OFFER、REQUEST、ACK。抓包时你会看到四次交互而且因为客户端此时还没有IP源地址是0.0.0.0目的地址是255.255.255.255。在企业网络里DHCP服务器配置错误经常导致IP地址范围不够用或者错误分配网关学基础的时候把这些细节过一遍后面工作能少踩很多坑。4.3 给DevOps方向的一点延伸DevOps工程师学的计算机网络和应用开发、运维工程师侧重点不同。你不一定需要能手写复杂协议但必须建立请求从客户端到一个复杂系统走通全链路的能力。具体来说需要掌握几个实操点理解HTTP的幂等语义设计健康检查接口时避免非幂等下被误判理解TCP连接池和TIME_WAIT调优负载均衡器的长连接参数理解DNS解析和CDN回源排查调度的延迟问题理解TLS握手和证书链处理证书过期和双向认证理解NAT和网关打通Kubernetes里Pod跨节点通信的规则。这些能力听起来分散归根到底都是对数据包经过每一层发生了什么的理解。所以我说基础2其实是整个职业生涯的底层建筑不是考完试就可以扔的东西。5. 实操建议三组命令和一个抓包习惯5.1 用命令行建立网络感学网络基础光看书不行。至少要把下面这组命令练到下意识就会用。ping用来测连通性看ICMP回包和丢包率但它只能说明通或者不通不能说明为什么不通。tracerouteWindows下是tracert可以看到经过每一跳路由器的延迟排查链路瓶颈和黑洞路由时特别好用。netstat是查看本机端口状态和连接状态的利器LISTEN表示有服务在监听ESTABLISHED表示已建立连接前面提到的TIME_WAIT和CLOSE_WAIT都是在这里看的。ss是netstat的现代替代品输出更快更准我建议直接用ss。curl是应用层排障神器-I拿响应头-v看完整握手过程-k跳过证书验证-x指定代理配合-w还能输出耗时明细直接定位哪里慢。有一类常见问题值得单独说浏览器访问网页出现我们的系统检测到您的计算机网络中存在异常流量这类提示。这通常是目标服务的网关或安全组件在做请求频率限制、验证码校验或风控策略判定你的来源IP在同一时间窗口内请求次数过多于是临时拦截提示你稍后重试。它和本机TCP/IP协议栈坏没坏基本无关和计算机网络基础这门课的关系也不大。如果你遇到优先看自己是不是单位出口IP或者运营商NAT出口IP因为是多人共享出口别人刷得太猛也会连坐你其次看是否短时间内有脚本或自动化工具在请求该站点实在不行就等一段时间再访问或者换一个网络环境验证。这个提示并不是说你的电脑被入侵或网络故障不用自己吓自己。5.2 抓包怎么抓才不白抓抓包工具两个主流选择命令行首选tcpdump图形界面首选Wireshark。新手最常犯的错误是一上来就直接抓一整块网卡把几万条报文全抓到然后懵住。正确做法是先明确目标再抓包。我举一个经典实验抓一次访问网站首页的完整HTTP请求。第一步清空浏览器缓存第二步先开好抓包工具过滤条件写成tcp port 80 or tcp port 443或者更直接地host example.com第三步发起访问记录时间点第四步停止抓包看报文列表你会发现TCP三次握手的三个包颜色分别是深灰、浅灰、深灰然后出现一个携带GET / HTTP/1.1的TCP报文接着服务器返回一堆HTTP报文。对照着书本上的图看你会瞬间理解什么叫分层的协议栈。排查性能问题时抓包看两个关键指标TCP重传和往返时间RTT。如果大量重传说明有丢包可能链路质量差或带宽打满如果RTT不稳定时高时低可能有问题在队列排队。学会用Wireshark的过滤表达式和在tcpdump里加-vv选项排障效率比什么都高。6. 期末复习与面试速查概念怎么背、题怎么做6.1 高频概念速查表基础2这部分考试高频考点集中在传输层和应用层顺手整理成一张速查表适合考前翻概念核心要点常考形式三次握手SYN / SYNACK / ACK问为什么不是两次四次挥手FIN / ACK / FIN / ACK问TIME_WAIT为什么存在流量控制接收方窗口问窗口为0会怎样拥塞控制慢启动、拥塞避免、快重传、快恢复计算题UDP特性无连接、不可靠、面向报文对比TCP粘包IP子网划分借位、可用主机数计算题NAT私有IP转公网IP问端口映射原理HTTP缓存Cache-Control、ETag、Last-Modified案例分析题DNS解析递归迭代问解析流程DHCPDISCOVER/OFFER/REQUEST/ACK问四步交互考前建议把所有协议画在一张分层图上。自底向上网卡和物理线路属于物理层交换机、MAC地址、ARP解析属于链路层IP编址、子网划分、路由属于网络层端口、连接管理、可靠传输属于传输层HTTP、DNS、DHCP、FTP这些具体服务属于应用层。这张图自己画一遍比背十遍笔记都有效。6.2 常见问题与答法从记忆到理解期末复习光背概念容易翻车因为现在很多题型是给场景、找原因。举两个典型。第一个题目说客户端连接服务器很慢但连接建立后数据传输正常该怎么分析答案主线是看握手阶段哪里卡。如果SYN发出后一直没有SYNACK大概率是防火墙丢弃了SYN包或者服务器半连接队列满了如果SYNACK正常但最后一次ACK丢了服务器一直处于SYN_RECV状态会反复重发SYNACK。这些都需要结合TCP状态机去回答而不是背一句可能是网络慢。第二个题目说应用层收到的数据顺序是对的从未丢失为什么还需要传输层做可靠传输这个问题是本质题。答案在于IP层只负责尽力而为地交付它不管顺序、不管丢包、不管重复。TCP提供的可靠服务是在不可靠IP之上建立的一层可信抽象它通过序列号解决顺序和重复通过确认和重传解决丢失。理解了这个层与层之间的依赖和增强关系你就抓住了整个计算机网络体系设计的灵魂。6.3 给学习进度提个醒如果你在准备期末建议用三遍法过基础2第一遍用自顶向下或者王道快速通读标记不懂的点不纠结细节目标是有整体框架第二遍对着视频课详细过一遍传输层和网络层配合抓包实验加深印象目标是理解机制的动线第三遍只刷期末题和历年考研题真题的意义不只是练计算更是帮你把不同章节的知识串联起来比如一道NAT的题实际在同时考网络层和传输层端口的作用。如果你是已经开始工作的DevOps工程师方法略有不同。我建议不要从头到尾刷书而是挑实际痛点往回找知识点。比如Kubernetes集群里服务间调不通就去看Service和Pod的IP转发逻辑追到iptables规则和网络策略比如Nginx出现大量TIME_WAIT就回头复习TCP四次挥手的内核参数优化比如某个域名解析时快时慢就去看DNS的TTL和CDN架构。这个从问题到原理的方式比按章节顺序学更不容易忘。写在最后的一点体会我自己学网络基础的时候走过不少弯路最深的感触是不要把协议当成一坨一坨需要背的文字而是把它们当成一整套对话规则。你的电脑每时每刻都在跟路由器、DNS服务器、对方的服务器说很多话只是你听不见。抓包工具就是让你听见这些对话的翻译器。当你第一次用Wireshark亲眼看到三次握手的过程看到HTTP请求一行一行地发出去再回头看那些教材里的图你会觉得整门课突然通透了。计算机网络基础2不是一个孤立的知识模块它正好处于承上启下的位置往下是已经讲过的物理和链路物理连接往上是所有你能感知到的互联网应用。把这一篇学扎实不管是期末考试、面试还是实际的系统排障你都会比别人多一份我知道底层在发生什么的底气。最后分享一个小技巧。学网络的时候每学一个协议就顺手问自己三个问题这个协议解决什么问题不解决会怎样它依赖了下面哪一层的能力比如学TCP问为什么UDP做不到可靠传输学DNS问为什么还需要ARP。这种自问自答的习惯能把你从记住知识推向理解系统。这套方法在我带过的每一届新人和每一个转行同事身上都验证过有效。