计算机网络核心知识体系:从分层模型到实战排查

📅 发布时间:2026/10/19 5:11:04
计算机网络核心知识体系:从分层模型到实战排查
1. 为什么网络知识总是一学就忘刚入行那会儿我也翻过不少所谓的“知识点汇总”密密麻麻的表格、缩写、协议分层背完就忘面试一问就卡壳。后来带过几个新人发现大家卡在同一个地方把网络知识当成文科来背而不是当成一套“数据怎么从一台机器走到另一台机器”的工程问题来理解。这篇汇总不打算给你一张死记硬背的清单而是按我自己梳理知识体系的路子把计算机网络里真正高频、真正会在排查问题时用到的部分重新串一遍。核心关键词就几个OSI七层与TCP/IP四层、TCP三次握手四次挥手、HTTP与HTTPS、DNS解析、IP与子网划分、常见网络排查命令。它适合刚接触网络的新人建立框架也适合工作两三年、发现自己“好像都懂但说不清”的人回头补课。你不需要一次看完建议当成手册遇到具体问题回来翻对应章节。2. 分层模型别背七层先搞懂每层在干嘛2.1 OSI七层和TCP/IP四层的对应关系很多人一上来就背“物数网传会表应”背完不知道有什么用。我的建议是先记住一件事分层是为了解耦。每一层只解决一类问题上层不用关心下层怎么实现。你写HTTP的时候不需要知道网线是双绞线还是光纤这就是分层的价值。OSI七层TCP/IP四层典型协议这一层解决什么问题应用层应用层HTTP、DNS、SMTP给具体应用提供通信能力表示层应用层TLS、JPEG数据格式、加密压缩会话层应用层RPC会话管理会话连接传输层传输层TCP、UDP端到端可靠/不可靠传输网络层网络层IP、ICMP寻址和路由跨网络找路数据链路层网络接口层Ethernet、ARP同一局域网内帧的传输物理层网络接口层网线、电信号比特流的物理传输实际工作中我们几乎只用TCP/IP四层来思考。OSI七层更多是教学和理论描述。你面试被问“表示层干嘛的”答“数据格式转换和加密比如TLS握手其实横跨表示层和会话层”就够了不用死抠。2.2 数据封装与解封装一个包裹的旅行理解分层最好的方式是跟着一个数据包走一遍。假设你在浏览器输入一个网址按下回车应用层浏览器生成HTTP请求报文比如GET /index.html HTTP/1.1。传输层TCP给这段数据加上TCP头包含源端口、目的端口比如443、序号、确认号。网络层IP加上IP头包含源IP、目的IP、TTL。数据链路层以太网加上帧头帧尾包含源MAC、目的MAC。物理层变成电信号或光信号发出去。到了对端一层层剥掉头部最后把HTTP请求交给服务器进程。这个过程叫封装与解封装。你抓包看到的每一层头部就是封装留下的痕迹。我常跟新人说抓包是理解网络最直观的方式没有之一。提示抓包时先看端口号判断应用再看IP判断路径最后看TCP标志位判断连接状态。这个顺序能帮你快速定位问题在哪一层。3. TCP协议可靠传输的代价与细节3.1 三次握手为什么不是两次或四次三次握手的核心目的是双方都确认对方的收发能力正常并且同步初始序列号。第一次客户端发SYN带自己的初始序列号seqx。服务端收到知道客户端发送能力正常。第二次服务端回SYNACK带自己的seqy确认号ackx1。客户端收到知道服务端收发都正常。第三次客户端回ACKacky1。服务端收到知道客户端接收能力正常。为什么不是两次如果只有两次服务端无法确认客户端能收到自己的包。为什么不是四次第二次已经把SYN和ACK合并了没必要拆开。这里有个经典问题第三次握手可以携带数据吗可以。TCP规定第三次握手时客户端已经进入ESTABLISHED状态可以带数据但实际中很少这么做因为要等服务端也进入ESTABLISHED。3.2 四次挥手TIME_WAIT为什么必须等2MSL挥手比握手多一次因为TCP是全双工的每个方向都要单独关闭。第一次主动关闭方发FIN表示“我没数据要发了”。第二次被动方回ACK表示“知道了”。第三次被动方发FIN表示“我也没数据要发了”。第四次主动方回ACK然后进入TIME_WAIT等2MSL才关闭。TIME_WAIT等2MSLMaximum Segment Lifetime报文最大生存时间有两个原因一是确保最后一个ACK能到达对端如果丢了对端会重发FIN这边还能响应二是让本次连接的所有报文在网络中消失避免影响后续相同四元组的新连接。MSL在Linux上通常硬编码为60秒所以TIME_WAIT是60秒。高并发服务器上大量TIME_WAIT会占用端口可以通过net.ipv4.tcp_tw_reuse复用但不要开tcp_tw_recycle它在NAT环境下会出问题。3.3 滑动窗口与拥塞控制TCP怎么既快又稳TCP的可靠性不是靠傻等而是靠滑动窗口做流量控制靠拥塞控制做网络适应。滑动窗口接收方告诉发送方“我还能收多少”发送方根据这个窗口调整发送速率。窗口为0时发送方停止发送但会定期发窗口探测包。拥塞控制包括慢启动、拥塞避免、快重传、快恢复。慢启动时窗口指数增长到阈值后线性增长。遇到丢包窗口减半。我实测过一个场景内网两台机器传大文件吞吐上不去抓包发现窗口一直很小。查下来是接收方应用层读得太慢导致接收缓冲区满窗口收缩。把应用改成边收边写磁盘吞吐立刻翻倍。这说明TCP性能问题不一定是网络问题可能是应用层消费速度跟不上。注意net.ipv4.tcp_window_scaling要开启否则窗口最大只有64KB高带宽高延迟场景下吞吐会被限制死。4. HTTP与HTTPS从明文到加密的演进4.1 HTTP/1.1、HTTP/2、HTTP/3的关键差异HTTP是应用层协议核心是请求-响应模型。但不同版本差异很大版本传输层核心特点解决的问题HTTP/1.1TCP持久连接、管道化减少连接建立开销HTTP/2TCP多路复用、头部压缩、二进制分帧解决队头阻塞应用层HTTP/3QUICUDP0-RTT、无队头阻塞解决TCP层队头阻塞HTTP/1.1的队头阻塞是指一个连接上前一个请求没响应完后面的请求就得等。HTTP/2通过流和帧把请求拆开并行传输。但HTTP/2还是跑在TCP上TCP丢包会导致所有流都等这是TCP层队头阻塞。HTTP/3干脆换UDP用QUIC自己实现可靠传输彻底解决。实际部署中HTTP/2需要HTTPS因为浏览器只支持加密的HTTP/2。HTTP/3也在逐步普及但UDP在某些网络环境会被限速或阻断所以很多站点同时支持HTTP/2和HTTP/3。4.2 HTTPS握手对称加密与非对称加密的配合HTTPS不是新协议是HTTP over TLS。TLS握手核心是用非对称加密协商出一个对称密钥之后用对称密钥加密数据。为什么这么设计因为非对称加密慢对称加密快。TLS 1.2握手过程简化客户端发ClientHello带支持的加密套件和随机数。服务端回ServerHello选一套加密套件带自己的随机数和证书。客户端验证证书用证书公钥加密一个预主密钥发过去。双方用三个随机数算出会话密钥。之后用会话密钥对称加密通信。TLS 1.3把握手压缩到1-RTT甚至0-RTT会话恢复时。它去掉了RSA密钥交换只用ECDHE保证前向安全。前向安全的意思是即使服务器私钥泄露之前的通信记录也无法解密。提示用openssl s_client -connect example.com:443 -tls1_3可以看TLS握手细节。证书链问题、协议版本不匹配、加密套件不支持都能从这里看出来。5. IP与子网地址规划和路由的基础5.1 IP地址分类与私有地址IPv4地址32位点分十进制表示。传统分类A/B/C已过时现在用CIDR无类别域间路由。但私有地址范围要记住10.0.0.0/8172.16.0.0/12192.168.0.0/16这些地址不会在公网路由只用于内网。你家里路由器分的就是192.168.x.x。NAT网络地址转换让内网多台设备共享一个公网IP。5.2 子网划分怎么算网络号和广播地址子网划分是面试高频也是实际配网络必会。给你一个IP和掩码要能算出网络号、广播地址、可用主机范围。例子192.168.1.130/26掩码/26 255.255.255.192二进制前26位是1。块大小 256 - 192 64。子网间隔0, 64, 128, 192。130落在128-191之间所以网络号是192.168.1.128。广播地址是192.168.1.191。可用主机192.168.1.129 到 192.168.1.190共62个。计算技巧块大小 256 - 掩码最后一段。然后看IP最后一段落在哪个块区间。这个方法比二进制转换快得多。5.3 路由选择最长前缀匹配路由器选路时看目的IP和路由表里的条目选前缀最长的那条。比如路由表有10.0.0.0/8 下一跳A10.1.0.0/16 下一跳B10.1.1.0/24 下一跳C目的IP是10.1.1.5三条都匹配但/24最长所以走C。这就是最长前缀匹配。默认路由0.0.0.0/0前缀最短所以最后才匹配。6. DNS解析从域名到IP的翻译过程6.1 递归查询与迭代查询DNS是把域名翻译成IP的系统。你浏览器输入www.example.com背后发生的事浏览器查本地缓存没有。查操作系统hosts文件和DNS缓存没有。向本地DNS服务器通常是运营商或8.8.8.8发递归查询。本地DNS服务器如果没缓存向根域名服务器发迭代查询。根返回.com顶级域服务器地址。本地DNS向.com服务器查返回example.com的权威服务器地址。本地DNS向权威服务器查拿到www.example.com的IP。返回给客户端并缓存。递归是“你帮我查到底”迭代是“你告诉我下一步问谁”。客户端到本地DNS通常是递归本地DNS到根/顶级/权威是迭代。6.2 DNS缓存与TTL每条DNS记录有TTL生存时间单位秒。TTL越长缓存越久解析越快但变更生效越慢。TTL越短变更快但解析压力大。实际中A记录常用300-3600秒。做迁移时提前把TTL调小比如60秒等生效后再改IP最后调回。注意浏览器、操作系统、本地DNS、权威服务器都有缓存。排查DNS问题时用dig trace example.com看完整解析路径用dig 8.8.8.8 example.com指定DNS服务器查。7. 网络排查命令与实战思路7.1 常用命令速查表命令用途关键参数ping测连通性-c 次数-i 间隔traceroute看路径-n 不解析域名netstat看连接-tunlp 看TCP/UDP监听ss看连接更快-tunlp 同上tcpdump抓包-i 网卡-w 写文件dig查DNStrace 追踪curl测HTTP-v 详细-I 只看头mtr结合ping和traceroute实时路径质量7.2 一个真实排查案例某服务偶发超时客户端报“连接超时”。排查步骤ping目标IP通排除网络层不通。telnet目标端口有时通有时不通怀疑TCP层。netstat -s看重传统计发现重传率很高。tcpdump抓包看到SYN发出去SYNACK很久才回或者没回。查服务端ss -lnt发现监听队列满了Send-Q很大。原因是服务端backlog设置太小并发连接上来时来不及accept导致握手失败。调整net.core.somaxconn和应用的backlog后问题消失。这个案例说明网络问题可能出在服务端配置不一定是网络设备。7.3 排查思路总结我习惯按“从下到上”排查先物理层网线、网卡灯再网络层ping、路由再传输层端口、防火墙再应用层服务日志、HTTP状态码。但如果是偶发问题抓包是最有效的。抓包时先定过滤条件比如tcp port 443 and host 10.0.0.1不然数据太多看不过来。提示tcpdump抓包时加-s 0抓完整包否则默认只抓68字节HTTP头可能被截断。8. 几个容易混淆的概念8.1 TCP和UDP的本质区别TCP可靠、有序、面向连接、有流量控制和拥塞控制。UDP不可靠、无序、无连接、开销小。但“可靠”不是免费的TCP的确认、重传、窗口、拥塞控制都带来延迟和开销。所以实时音视频用UDP丢了就丢了重传反而卡顿。DNS查询用UDP因为请求小一次往返就够重传成本低。8.2 交换机与路由器的区别交换机工作在数据链路层看MAC地址转发同一局域网内。路由器工作在网络层看IP地址转发跨局域网。家用路由器其实是“路由器交换机AP”的组合设备。三层交换机兼具交换和路由功能但通常用于内网高速转发。8.3 对称加密与非对称加密对称加密加密解密同一密钥快但密钥分发是问题。非对称加密公钥加密私钥解密慢但解决密钥分发。HTTPS用非对称协商密钥用对称传数据取两者之长。9. 我踩过的坑与实操心得第一个坑以为ping通就代表服务正常。ping只测ICMP服务端口可能被防火墙挡了。一定要用telnet或nc测端口。第二个坑忽略MTU问题。有一次跨机房传大包失败小包正常。查下来是路径MTU不一致中间设备不转发大包也不回ICMP。用ping -M do -s 1472测出MTU是1400调整后正常。第三个坑DNS缓存导致迁移失败。改完IP后部分用户还是访问旧IP因为本地DNS缓存没到期。后来学乖了迁移前先把TTL降到60秒等一天再改。第四个坑TIME_WAIT过多导致端口耗尽。高并发短连接服务netstat看到几万个TIME_WAIT。开了tcp_tw_reuse缓解但根本解法是改用长连接或连接池。第五个坑HTTP/2多路复用下一个慢请求拖累整个连接。虽然HTTP/2解决了应用层队头阻塞但如果服务端处理某个请求特别慢占着流不放其他流也会受影响。后来把慢接口拆到独立域名用不同连接隔离。这些坑的共同点是网络知识不是背出来的是排查出来的。你背一百遍三次握手不如抓一次包看SYN、SYNACK、ACK的实际顺序。你背子网划分不如实际配一次路由器算错一次广播地址就记住了。最后分享一个我常用的学习路径先用tcpdump抓一次自己访问网页的完整流量对照着看每一层头部然后用dig trace跟一次DNS解析最后用curl -v看一次HTTPS握手。这三件事做完网络知识就不再是纸上的表格而是你脑子里能跑起来的流程。后续还可以往深里走比如看TCP拥塞控制的论文、研究QUIC的实现、或者用eBPF做网络观测。但基础框架搭好了往上加东西就快了。