1. 这不是教科书,是我在机房熬了七个通宵后整理出的“网络生存指南”
你打开浏览器输入一个网址,三秒内页面就跳出来——这背后不是魔法,而是一整套精密咬合的齿轮在转动。我第一次真正看懂这个过程,是在某高校网络实验室调试一台三层交换机时:当traceroute命令打出第7跳突然卡住,屏幕光标无声闪烁,而隔壁工位的同事正用Wireshark抓到一包TTL超时的ICMP报文。那一刻我才明白,“网络基础”四个字不是课本目录里的章节标题,而是你排查故障时手边最锋利的解剖刀,是你设计系统时脚下最坚实的地基,更是你在面试官问出“TCP三次握手为什么不是两次”时,能不假思索画出时序图并解释SYN洪泛攻击原理的底气。
这篇内容专为两类人准备:一类是刚接触网络概念、被OSI七层模型绕晕的新手,另一类是写了三年业务代码却说不清HTTP请求到底经过了几层封装的老兵。它不讲抽象定义,只拆解真实场景中高频出现的12个核心节点——从网线插进RJ-45接口那一瞬间的电信号变化,到浏览器地址栏敲下回车后,数据如何穿越物理层、数据链路层、网络层、传输层,最终被应用层的JavaScript代码读取。所有解释都遵循一个原则:用你每天都在用的东西当参照物。比如把MAC地址比作快递员记在小本子上的门牌号(精确到楼栋单元),而IP地址则是高德地图里能导航到的完整地址(包含省市区街道);把TCP的滑动窗口机制,类比成高铁站台的电子屏——它不等你买完票才显示下一班车,而是持续滚动更新,让你随时掌握运力余量。
关键词“计算机网络与通信”在这篇内容里不是空泛标签,而是贯穿始终的操作坐标系。你会发现,所谓“基础”,从来不是孤立的知识点堆砌,而是环环相扣的因果链:没有对以太网帧结构的理解,就无法看懂交换机的MAC地址表学习过程;不厘清ARP协议的工作边界,就会在配置静态路由时误以为直连网段不需要网关;不清楚NAT转换发生在哪一层,就可能在部署家庭NAS时陷入端口映射失效的死循环。接下来的内容,将带你亲手拧开每一颗螺丝,看清内部咬合的齿纹。这不是速成课,但每一步都踩在真实问题的痛点上——因为真正的基础,永远生长在解决问题的土壤里。
2. 网络分层的本质:不是为了考试背诵,而是为了解耦故障排查路径
2.1 为什么必须坚持分层?一次真实故障的倒推复盘
去年参与某智慧园区物联网平台上线,现场反馈“传感器数据上传延迟高达30秒”。运维团队第一反应是检查云服务器CPU负载,结果发现一切正常。我们调出设备端日志,看到HTTP POST请求发出后,足足等待28秒才收到200响应。如果按传统思路从应用层开始查,可能要花两天时间翻阅Spring Boot的异步线程池配置。但我们直接执行tcpdump -i eth0 port 8080,发现客户端发出SYN包后,1.2秒才收到服务端SYN+ACK——问题瞬间锁定在传输层以下。
这就是分层设计最残酷也最实用的价值:它把混沌的网络世界切割成可独立验证的切片。当数据传输出现异常,你不需要成为全栈神人,只需按顺序做三件事:
- 物理层验证:用
ethtool eth0确认网卡链路状态是否为“Link detected: yes”,用mii-tool检测双工模式是否匹配(曾因一台老交换机强制半双工,导致千兆网卡实际吞吐不足100Mbps); - 数据链路层验证:执行
arp -a查看目标IP对应的MAC地址是否存在,若为空则说明ARP请求未得到响应,此时再用tcpdump arp抓包确认是本地没发出去,还是对方根本没回复; - 网络层验证:
ping测试连通性,但注意ping用的是ICMP协议,而你的业务走TCP,所以必须补测telnet 目标IP 端口或nc -zv 目标IP 端口,这才是对传输层连接的真实检验。
提示:很多新手误以为
ping通就代表网络通畅,这是致命误区。我见过太多案例:ping能通(ICMP走通),但telnet不通(TCP被防火墙拦截),根源在于ICMP和TCP在防火墙策略中属于完全不同的规则项。
2.2 OSI七层与TCP/IP四层:别再死记硬背,用“快递流程”彻底吃透
把网络分层想象成顺丰快递的作业流程,立刻清晰:
| 快递环节 | 对应网络层 | 关键动作 | 现实类比 |
|---|---|---|---|
| 包裹打包 | 应用层 | HTTP/FTP/DNS协议封装数据 | 你填好收件人信息、写好包裹内容 |
| 贴运单 | 表示层 | 数据加密/压缩/编码(如TLS加密、JPEG压缩) | 给包裹加防伪封条、真空压缩衣服 |
| 协议协商 | 会话层 | 建立/管理/终止会话(如RPC会话控制) | 拨打客服电话确认配送时间窗口 |
| 分段运输 | 传输层 | TCP/UDP分段、端口号标识进程 | 快递公司把大包裹拆成多个小箱,每个箱贴不同运单号 |
| 路径规划 | 网络层 | IP寻址、路由器转发、ICMP差错报告 | 高德地图规划从北京朝阳区到深圳南山区的最优路线 |
| 局域投递 | 数据链路层 | MAC地址寻址、交换机转发、CRC校验 | 顺丰小哥根据运单号,在朝阳区某写字楼内逐层派送 |
| 信号传输 | 物理层 | 电信号/光信号/无线电磁波传输 | 快递车在公路上行驶,轮胎与地面摩擦产生震动 |
重点来了:TCP/IP模型为何只有四层?因为它把OSI的上三层(表示层、会话层、应用层)合并为“应用层”,把数据链路层和物理层合并为“网络接口层”。这不是偷懒,而是工程实践的胜利——绝大多数开发者根本不需要单独操作表示层(TLS已由OpenSSL库封装)或会话层(HTTP/2的多路复用已内置会话管理)。当你用curl发送请求时,你调用的是应用层API,但底层自动完成了从SSL握手(表示层)、HTTP连接维持(会话层)到TCP分段(传输层)的全部工作。
注意:不要纠结“哪一层该做什么”,而要记住“哪一层能解决什么问题”。例如DNS解析失败,一定是应用层或网络层的问题(DNS服务器IP是否可达),绝不会是物理层故障——因为物理层断了,连ping都ping不通。
2.3 五元组:定位网络连接的“身份证号”,比IP地址更精准
所有网络连接的本质,都是一个五元组(Five-tuple)的唯一标识:
{源IP, 源端口, 目的IP, 目的端口, 协议类型}
这就像快递单号不只是“北京市朝阳区”,而是“SF123456789BJ-001-20231015-1422-03”,其中:
- 源IP = 发件人地址(如192.168.1.100)
- 源端口 = 发件人手机号(操作系统随机分配,如54321)
- 目的IP = 收件人地址(如202.108.22.5)
- 目的端口 = 收件人分机号(如HTTP默认80)
- 协议类型 = 快递公司(TCP/UDP/ICMP)
为什么强调五元组?因为它是理解NAT、防火墙、负载均衡的核心钥匙。举个实例:某公司出口路由器做SNAT,将内网192.168.1.0/24网段所有流量映射到公网IP 203.204.205.206。当内网两台电脑同时访问百度,它们的五元组分别是:
- 电脑A:{192.168.1.10, 54321, 202.108.22.5, 80, TCP} → 映射为 {203.204.205.206, 60001, 202.108.22.5, 80, TCP}
- 电脑B:{192.168.1.11, 54322, 202.108.22.5, 80, TCP} → 映射为 {203.204.205.206, 60002, 202.108.22.5, 80, TCP}
路由器正是靠记录这个映射表,才能把百度返回的数据准确送回对应内网主机。如果你在抓包时只看IP地址,会误以为所有流量都来自同一个源——而五元组让你一眼看穿背后的连接关系。
3. 核心协议深度拆解:从原理到抓包验证的完整闭环
3.1 ARP协议:局域网里的“人肉通讯录”,为什么它不跨网段?
当你的电脑要访问同网段的打印机(192.168.1.100),它知道目标IP,但不知道打印机的MAC地址。这时它会广播一个ARP请求:“谁是192.168.1.100?请告诉我你的MAC!”——这个过程就像在办公室大喊:“张三在吗?我是李四,有文件要给你!”
关键细节:
- 广播范围严格限定在二层广播域:交换机收到ARP请求后,会向所有端口(除接收端口外)转发,但路由器不会转发,因为路由器是三层设备,其职责是隔离广播域;
- ARP缓存有生命周期:Linux系统默认ARP缓存超时时间为300秒(可通过
ip neigh show查看),超时后需重新广播查询; - 存在安全风险:ARP欺骗攻击正是伪造ARP响应,让受害者把攻击者MAC当成网关MAC,从而劫持流量。
实操验证步骤:
- 清空本地ARP缓存:
ip neigh flush all - 执行
ping -c 1 192.168.1.100(确保目标在线) - 立即执行
arp -a | grep 192.168.1.100,观察MAC地址是否已填充 - 用Wireshark过滤
arp,可清晰看到Type字段为1(Request)和2(Reply)的交互过程
实操心得:在排查“能ping通但无法访问服务”时,务必先确认ARP表是否正常。我曾遇到某企业AP设备因固件BUG,收到ARP请求后不回复,导致所有终端无法获取其MAC地址,现象就是WiFi连得上但网页打不开——此时
arp -a会显示目标IP对应的MAC为“incomplete”。
3.2 IP协议:无连接的“邮政系统”,靠什么保证不丢信?
IP协议被诟病“不可靠”,但它的设计哲学恰恰是极致的务实:不承诺送达,只专注高效路由。就像中国邮政平信,寄出即完成使命,至于信件是否被签收、是否被退回,不在其职责范围内。
IP数据报的关键字段解析:
- TTL(Time To Live):初始值通常为64(Linux)或128(Windows),每经过一个路由器减1,减到0时路由器丢弃该包并发送ICMP超时报文。这既是防止路由环路的保险丝,也是traceroute的实现基础;
- DF(Don't Fragment)标志位:当设置为1时,禁止分片。若数据报长度超过路径MTU(最大传输单元),路由器直接丢弃并返回ICMP“需要分片但DF置位”错误。这是Path MTU Discovery(PMTUD)机制的核心;
- 首部校验和:仅校验IP首部(不含数据部分),且每次经过路由器都要重新计算——因为TTL值在变,校验和必须同步更新。
抓包实证:用ping -s 1472 8.8.8.8(1472字节数据 + 28字节IP+ICMP首部 = 1500字节,刚好等于以太网MTU)测试,再用ping -s 1473 8.8.8.8,后者会触发ICMP错误报文,证明DF位生效。
3.3 TCP三次握手:不是仪式感,而是双向能力确认的严谨契约
“为什么不是两次握手?”这个问题的答案藏在最后一个ACK包的携带信息里。标准三次握手流程:
- 客户端→服务端:SYN(seq=x)
- 服务端→客户端:SYN+ACK(seq=y, ack=x+1)
- 客户端→服务端:ACK(seq=x+1, ack=y+1)
关键洞察:第三次ACK不仅是确认服务端的SYN,更是携带了客户端自己的初始序列号x+1。如果只有两次握手,服务端无法确认客户端是否真的收到了自己的SYN+ACK。试想:客户端发送SYN后崩溃,服务端回复SYN+ACK,但客户端没收到。此时服务端认为连接已建立,开始等待数据,而客户端根本不知情——资源就这样被白白占用。
实操中必须掌握的三个参数:
- MSS(Maximum Segment Size):在SYN包中协商,表示本端能接收的最大TCP段数据长度。通常为MTU减去IP首部(20字节)和TCP首部(20字节),即1460字节;
- Window Size:滑动窗口大小,决定一次能发送多少字节而无需等待ACK。现代系统普遍启用Window Scaling选项,可突破65535字节限制;
- SACK(Selective ACK):允许接收方告知发送方哪些数据块已收到,哪些丢失,避免TCP的“回退N步”重传浪费带宽。
用Wireshark过滤tcp.flags.syn==1 and tcp.flags.ack==0,可精准捕获所有SYN包,观察MSS值是否符合预期。
3.4 UDP协议:轻量级“明信片”,何时选择它比TCP更合理?
UDP常被误解为“低端协议”,实则在特定场景下是更优解。它的核心优势在于:
- 零握手开销:发送数据前无需建立连接,适合毫秒级响应场景;
- 无拥塞控制:不因网络拥塞而降低发送速率,适合实时音视频流;
- 报文边界保留:每个sendto()调用对应一个独立UDP数据报,应用层可天然按包处理。
典型应用场景对比:
| 场景 | 选择UDP原因 | 风险控制手段 |
|---|---|---|
| DNS查询 | 单次请求-响应,53端口默认使用UDP | 超时后重试,重试失败再用TCP |
| 视频会议 | 允许少量丢包换取低延迟 | 前向纠错(FEC)、丢包隐藏(PLC) |
| IoT传感器上报 | 设备资源受限,无法维护TCP状态 | 应用层添加简单序列号与重传机制 |
抓包验证:执行dig @8.8.8.8 google.com,Wireshark中过滤udp.port==53,可见DNS请求与响应均为单个UDP报文,耗时通常<20ms。
4. 网络设备工作原理:交换机、路由器、防火墙的本质差异
4.1 交换机:二层“智能分拣员”,靠MAC地址表吃饭
交换机的核心能力是学习+转发:
- 学习:当设备A(MAC: aa:aa:aa:aa:aa:aa)向设备B(MAC: bb:bb:bb:bb:bb:bb)发送数据帧时,交换机从端口1收到该帧,立即记录“aa:aa:aa:aa:aa:aa → 端口1”;
- 转发:当设备C(MAC: cc:cc:cc:cc:cc:cc)向设备A发送帧时,交换机查MAC地址表,发现aa:aa:aa:aa:aa:aa对应端口1,于是只向端口1转发,其他端口静默。
关键参数实测:
- MAC地址表容量:家用交换机通常支持2K-8K条,企业级可达64K。用
show mac address-table(Cisco)或brctl showmacs br0(Linux桥接)可查看; - 老化时间:默认300秒,可通过
mac-address-table aging-time 600延长。曾有项目因设备休眠时间超300秒,唤醒后需重新学习MAC,导致短暂通信中断; - 广播风暴抑制:开启
storm-control broadcast level 5(限制广播流量占带宽5%),避免ARP泛洪拖垮网络。
注意:交换机不处理IP地址!所有基于IP的配置(如VLAN间路由、ACL)都是三层交换机的附加功能,本质是内置了路由器模块。
4.2 路由器:三层“交通指挥中心”,靠路由表决定数据去向
路由器的核心是路由表(Routing Table),每条记录包含:目的网络、子网掩码、下一跳IP、出接口、管理距离(AD)、度量值(Metric)。当收到IP包时,路由器执行最长前缀匹配(Longest Prefix Match):
- 目的IP:192.168.3.5
- 路由表有两条:
- 192.168.0.0/16 → 下一跳10.0.0.1
- 192.168.3.0/24 → 下一跳10.0.1.1
- 选择/24这条路由,因为前缀更长(24>16),匹配更精确。
实操中必须掌握的三个命令:
show ip route:查看完整路由表,注意标记符(C=直连,S=静态,O=OSPF,B=BGP);ping+traceroute:验证路由可达性,traceroute通过TTL递增探测路径;debug ip packet(慎用):开启数据包级调试,但会严重消耗CPU,生产环境禁用。
经典故障:某园区网络新增一条静态路由ip route 0.0.0.0 0.0.0.0 10.0.0.1(默认路由),但管理员忘记删除原有默认路由,导致路由表出现两条AD值相同的默认路由,形成负载均衡——结果部分用户访问外网正常,部分用户完全不通。解决方案:为新路由设置更低AD值(如ip route 0.0.0.0 0.0.0.0 10.0.0.1 1)。
4.3 防火墙:网络世界的“海关检查站”,状态化检测才是灵魂
传统包过滤防火墙(如iptables)仅检查单个数据包的五元组,而现代状态防火墙(Stateful Firewall)会维护连接状态表,记录每个连接的生命周期。例如:
- 当内网发起TCP连接(SYN包),防火墙创建状态条目:{192.168.1.100:54321 → 202.108.22.5:80, state=SYN_SENT};
- 收到服务端SYN+ACK后,状态变为ESTABLISHED;
- 后续所有属于该连接的数据包,只要五元组匹配状态表,直接放行,无需重复规则匹配。
这带来两个关键优势:
- 高效性:避免对每个数据包重复解析规则;
- 安全性:可阻止非法连接(如外部主动发起的SYN包,因无对应状态条目而被拒绝)。
配置实操要点:
- 默认策略:永远遵循“最小权限原则”,默认拒绝所有,再按需开放;
- 规则顺序:iptables中规则自上而下匹配,第一条匹配即执行,后续规则不再检查;
- 连接跟踪:
conntrack -L可查看当前所有连接状态,conntrack -D --orig-src 192.168.1.100可手动删除异常连接。
实操心得:某次线上事故,因防火墙规则中
-A INPUT -p tcp --dport 22 -j ACCEPT放在了-A INPUT -j DROP之后,导致SSH完全无法登录。教训是:规则顺序即安全策略,必须用iptables -L -n --line-numbers确认位置。
5. 网络排障实战手册:从“网络不通”到精准定位的完整路径
5.1 “网络不通”四步诊断法:拒绝盲目重启
当用户报告“上不了网”,按此顺序执行,90%问题可在5分钟内定位:
第一步:确认物理层连通性
- 检查网线指示灯:绿色常亮=链路正常,黄色闪烁=有数据传输;
- 执行
ethtool eth0,确认Link detected: yes且Speed: 1000Mb/s; - 若为无线,用
iwconfig wlan0查看Link Quality(理想值>60/70)。
第二步:验证本机网络协议栈
ping 127.0.0.1:测试本地回环,失败说明TCP/IP协议栈损坏;ping 192.168.1.100(本机IP):确认IP配置正确;ping 192.168.1.1(网关):确认到网关的二层连通性。
第三步:测试三层可达性
ping 8.8.8.8:确认到公网IP的路由可达;- 若失败,执行
traceroute 8.8.8.8,观察在哪一跳中断; - 若
ping通但telnet 8.8.8.8 53不通,说明DNS端口被阻断。
第四步:应用层服务验证
nslookup google.com 8.8.8.8:测试DNS解析是否正常;curl -v http://httpbin.org/get:验证HTTP协议栈及代理设置;openssl s_client -connect google.com:443:检查TLS握手是否成功。
提示:永远先做
ping 127.0.0.1!我见过太多案例:因虚拟机网络驱动异常,导致ping本机IP失败,但用户执着于检查路由器设置,浪费数小时。
5.2 Wireshark抓包分析黄金法则:从海量数据中锁定关键证据
面对Wireshark满屏滚动的数据包,新手常陷入“信息过载”。掌握以下三招,效率提升十倍:
法则一:用显示过滤器(Display Filter)替代捕获过滤器(Capture Filter)
- 捕获过滤器(如
tcp port 80)在抓包时就过滤,可能漏掉关键上下文; - 显示过滤器(如
http && ip.addr == 192.168.1.100)在抓包后筛选,保留完整会话。常用语法:tcp.stream eq 5:显示编号为5的TCP流所有数据包;http.request.method == "GET":筛选所有HTTP GET请求;icmp.type == 3 && icmp.code == 1:筛选“主机不可达”ICMP错误。
法则二:关注TCP流的“异常标记”
- RST(Reset)包:红色高亮,表示连接被强制重置。常见原因:服务端进程未监听端口、防火墙拦截、连接超时;
- Retransmission:黑色背景,表示数据包重传。若连续出现,说明网络丢包严重;
- Duplicate ACK:紫色背景,表示接收方收到乱序包,要求重传缺失数据。
法则三:利用“Follow TCP Stream”功能
右键任意TCP包 → “Follow” → “TCP Stream”,Wireshark自动重组该连接的所有应用层数据,以纯文本形式展示。这对分析HTTP、SMTP、FTP等明文协议极其高效——你能直接看到完整的HTTP请求头、JSON响应体,甚至SQL注入语句。
5.3 常见故障速查表:那些年我们踩过的坑
| 故障现象 | 可能原因 | 快速验证命令 | 解决方案 |
|---|---|---|---|
| 能上网但无法访问公司内网系统 | 内网DNS服务器未配置,或DNS解析指向公网 | nslookup 内网域名,对比cat /etc/resolv.conf | 在/etc/resolv.conf中添加内网DNS服务器IP |
| SSH连接频繁中断 | TCP Keepalive未启用,NAT设备老化连接 | `ss -i | grep :22查看rto和retrans`值 |
| 视频会议卡顿严重 | 网络抖动大,UDP丢包率高 | ping -f -c 100 192.168.1.1观察丢包率 | 启用QoS策略,为UDP流量标记DSCP EF( Expedited Forwarding) |
| 网站打开慢但ping延迟低 | SSL/TLS握手耗时长,证书链不完整 | openssl s_time -connect google.com:443 | 优化证书链,启用OCSP Stapling |
| 同一局域网内部分设备无法互访 | VLAN配置错误,端口未划分到同一VLAN | show vlan brief(交换机) | 检查交换机端口VLAN成员关系,确认PVID设置正确 |
实操心得:某次客户现场,所有设备
ping网关正常,但无法访问内网NAS。执行arp -a发现NAS的MAC地址为incomplete,进一步tcpdump arp发现ARP请求发出后无响应。最终定位为NAS网卡驱动BUG,升级固件后解决。这印证了一个真理:最简单的命令,往往指向最深的根因。
6. 网络安全基础:加密、认证、访问控制的落地实践
6.1 TLS 1.3握手:从2-RTT到1-RTT的革命性优化
TLS 1.3相比1.2的最大改进,是将握手时间从2个往返(2-RTT)压缩到1个往返(1-RTT),甚至支持0-RTT(0-RTT)快速恢复。其核心在于:
- 废弃RSA密钥交换:改用ECDHE(椭圆曲线迪菲-赫尔曼),前向安全性更强;
- 合并ServerHello与密钥交换:服务端在ServerHello中直接发送密钥共享参数;
- 0-RTT模式:客户端缓存之前会话的密钥材料,首次发送应用数据时即可加密,但存在重放攻击风险,需应用层防护。
验证方法:用openssl s_client -tls1_3 -connect google.com:443,观察输出中的Protocol字段是否为TLSv1.3,以及Cipher是否为TLS_AES_256_GCM_SHA384。
6.2 SSH密钥认证:告别密码,用非对称加密守护服务器
密码认证的脆弱性在于:暴力破解、中间人窃听、键盘记录。SSH密钥认证则利用RSA/ECDSA算法:
- 客户端生成密钥对(私钥本地保存,公钥上传至服务器
~/.ssh/authorized_keys); - 登录时,服务器用公钥加密一段随机数,客户端用私钥解密并返回,完成身份验证。
实操步骤:
- 生成密钥:
ssh-keygen -t ed25519 -C "your_email@example.com"(推荐Ed25519,比RSA更安全高效); - 复制公钥:
ssh-copy-id user@server_ip; - 禁用密码登录:编辑
/etc/ssh/sshd_config,设置PasswordAuthentication no,重启服务。
注意:私钥文件权限必须为600(
chmod 600 ~/.ssh/id_ed25519),否则SSH服务拒绝加载。
6.3 ACL与防火墙策略:用“白名单思维”构建最小权限网络
企业网络最常见的安全失误,是采用“黑名单思维”——先开放所有,再逐步封堵。正确做法是“白名单思维”:默认拒绝,仅开放必需端口。例如某Web服务器的安全策略:
- 入方向(Inbound):
ALLOW TCP 0.0.0.0/0 → 80,443(开放HTTP/HTTPS)ALLOW TCP 192.168.10.0/24 → 22(仅允许运维网段SSH)
- 出方向(Outbound):
ALLOW TCP 80,443 → 0.0.0.0/0(允许访问公网HTTP/HTTPS)ALLOW UDP 53 → 0.0.0.0/0(允许DNS查询)
用iptables实现:
# 清空现有规则 iptables -F # 设置默认策略为DROP iptables -P INPUT DROP iptables -P OUTPUT DROP # 开放SSH(仅限运维网段) iptables -A INPUT -p tcp --dport 22 -s 192.168.10.0/24 -j ACCEPT # 开放HTTP/HTTPS iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 允许已建立连接的返回流量 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT7. 网络性能优化:从理论带宽到实际吞吐的差距弥合
7.1 带宽、吞吐量、时延:三个常被混淆的概念精确定义
- 带宽(Bandwidth):链路的理论最大数据传输速率,单位bps(如千兆网卡=1Gbps)。它像高速公路的车道数,决定了上限;
- 吞吐量(Throughput):实际成功传输的数据速率,单位bps。受协议开销、网络拥塞、设备性能影响,永远≤带宽;
- 时延(Latency):数据包从发送到接收的时间,单位ms。包括传播时延(光速限制)、处理时延(设备转发)、排队时延(缓冲区等待)、传输时延(数据长度/带宽)。
实测案例:某千兆局域网,iperf3 -c 192.168.1.100测得吞吐量仅850Mbps。分析原因:
- TCP窗口大小限制:
ss -i显示rwnd(接收窗口)为64KB,远小于BDP(带宽时延积); - 解决方案:增大TCP窗口,
echo 'net.core.rmem_max = 16777216' >> /etc/sysctl.conf,再sysctl -p。
7.2 BDP(带宽时延积):决定TCP窗口大小的黄金公式
BDP = 带宽 × 往返时延(RTT)
例如:100Mbps带宽,RTT=50ms,则BDP = 100×10⁶ bps × 0.05s = 5,000,000 bits = 625,000 bytes ≈ 610KB
这意味着:若TCP接收窗口小于610KB,网络链路就无法被填满,吞吐量将远低于带宽。Linux内核默认net.ipv4.tcp_rmem为[4096, 131072, 6291456],最大值6MB已足够覆盖多数场景,但需确认应用是否启用SO_RCVBUF。
7.3 QoS(服务质量):给关键业务“开绿色通道”
在带宽有限的网络中,QoS通过优先级队列保障关键业务。以企业网络为例:
- 语音流量(VoIP):标记DSCP EF(46),放入严格优先队列(PQ),确保<150ms时延;
- 视频会议:标记DSCP AF41(34),放入加权公平队列(WFQ),保障带宽;
- 普通上网:标记DSCP BE(0),放入尽力而为队列(BE),带宽剩余时才调度。
在Linux上用tc命令实现:
# 创建HTB根队列 tc qdisc add dev eth0 root handle 1: htb default 30 # 为VoIP创建高优先级类(10Mbps) tc class add dev eth0 parent 1: classid 1:10 htb rate 10mbit ceil 10mbit # 为普通流量创建低优先级类(剩余带宽) tc class add dev eth0 parent 1: classid 1:30 htb rate 1kbit ceil