1. 为什么我们需要重新理解TCP/IP第一次接触网络协议的人往往会被各种缩写和术语吓到——TCP、IP、UDP、ICMP这些字母组合就像一堵高墙。但当我真正开始用Wireshark抓包分析网络流量时才发现这些协议就像城市地下的管道系统平时看不见却支撑着整个数字世界的运转。2003年RFC 3439里有个经典比喻互联网就是一系列管道的集合。这个比喻现在看依然精准。我们每天刷视频、传文件、开视频会议底层全是TCP/IP在默默工作。但大多数人只停留在三次握手这种概念层面遇到实际网络问题依然束手无策。2. 协议栈全景图从物理层到应用层2.1 五层模型 vs 七层模型教科书上常看到OSI七层模型但实际工程中我们用的是简化版的五层模型| 应用层(HTTP/FTP) | | 传输层(TCP/UDP) | | 网络层(IP/ICMP) | | 数据链路层(ARP) | | 物理层(网线/WiFi)|关键区别在于实际编码时不需要考虑表示层和会话层应用层直接对接传输层比如HTTP over TCP抓包工具显示的都是五层结构2.2 各层典型协议与设备层级典型协议典型设备数据单元应用层HTTP/HTTPS/DNS浏览器/服务器消息(Message)传输层TCP/UDP操作系统协议栈段(Segment)网络层IP/ICMP路由器包(Packet)数据链路层Ethernet/ARP交换机/网卡帧(Frame)物理层802.3/WiFi网线/光纤比特流(Bits)提示用tcpdump -X命令可以看到从数据链路层开始的完整帧结构3. IP协议互联网的邮政系统3.1 IPv4报文结构详解一个标准的IPv4报文头长这样以字节为单位0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 -------------------------------- |Version| IHL |Type of Service| Total Length | -------------------------------- | Identification |Flags| Fragment Offset | -------------------------------- | Time to Live | Protocol | Header Checksum | -------------------------------- | Source Address | -------------------------------- | Destination Address | -------------------------------- | Options | Padding | --------------------------------关键字段解析TTL(Time to Live): 每经过一个路由器减1到0时丢弃。用traceroute命令就是利用这个特性Protocol字段: 6TCP, 17UDP, 1ICMP。可以用cat /etc/protocols查看完整列表Checksum: 只校验头部不校验数据部分3.2 子网划分实战假设公司拿到192.168.1.0/24网段需要划分5个子网计算需要的主机位5个子网需要3位2^38≥5新的子网掩码24327即255.255.255.224子网范围192.168.1.0/27 (1-30)192.168.1.32/27 (33-62)192.168.1.64/27 (65-94)192.168.1.96/27 (97-126)192.168.1.128/27 (129-158)注意每个子网的第一个IP是网络地址最后一个IP是广播地址这两个不能分配给主机4. TCP协议可靠传输的魔法4.1 三次握手与四次挥手连接建立过程客户端 - SYN1, seqx - 服务端 客户端 - SYN1, ACK1, seqy, ackx1 - 服务端 客户端 - ACK1, seqx1, acky1 - 服务端连接终止过程客户端 - FIN1, sequ - 服务端 客户端 - ACK1, acku1 - 服务端 (服务端可能还有数据要发送) 客户端 - FIN1, seqv - 服务端 客户端 - ACK1, ackv1 - 服务端常见问题半关闭状态一方发送FIN后还能接收数据TIME_WAIT状态主动关闭方会等待2MSL通常1-4分钟用netstat -antp | grep TIME_WAIT查看调优sysctl -w net.ipv4.tcp_tw_reuse14.2 流量控制与拥塞控制滑动窗口实战# 查看窗口大小 ss -itn ( sport :80 )输出示例Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 192.168.1.100:80 203.0.113.45:54321 cubic wscale:7,7 rto:204 rtt:1.234/0.987 ato:40 mss:1460 cwnd:10 ssthresh:7 bytes_acked:12345 bytes_received:67890 segs_out:123 segs_in:456 send 1.1Mbps lastsnd:12 lastrcv:34 lastack:34 pacing_rate 1.2Mbps rcv_rtt:34 rcv_space:28960拥塞控制算法选择# 查看可用算法 sysctl net.ipv4.tcp_available_congestion_control # 设置算法需要root sysctl -w net.ipv4.tcp_congestion_controlbbr5. 实战抓包分析从HTTP到TCP5.1 Wireshark过滤器语法常用过滤表达式tcp.port 443过滤HTTPS流量http.request.method GET过滤GET请求tcp.stream eq 5查看完整TCP流ip.addr 192.168.1.100特定IP的流量5.2 HTTPS解密技巧前提条件浏览器设置SSLKEYLOGFILE环境变量Wireshark配置TLS解密编辑→首选项→Protocols→TLS添加(Pre)-Master-Secret log文件名注意这只能解密自己浏览器产生的流量不能解密他人流量6. 网络问题诊断工具箱6.1 基础诊断命令# 连通性测试ICMP ping -c 4 example.com # 路由追踪TTL递增 traceroute -n example.com # DNS查询 dig trace example.com # 端口测试 nc -zv example.com 443 # 查看路由表 ip route show # ARP缓存 ip neigh show6.2 高级诊断场景案例TCP连接缓慢检查MTUping -M do -s 1472 example.com # 1472281500检查MSStcpdump -ni eth0 tcp[tcpflags] (tcp-syn) ! 0 and dst port 80检查窗口缩放sysctl net.ipv4.tcp_window_scaling案例DNS解析失败检查本地解析nslookup example.com 127.0.0.1检查上级DNSdig 8.8.8.8 example.com检查DNS缓存sudo systemd-resolve --statistics7. 协议栈优化实践7.1 内核参数调优/etc/sysctl.conf关键配置# 启用快速回收TIME_WAIT net.ipv4.tcp_tw_recycle 1 net.ipv4.tcp_tw_reuse 1 # 增大端口范围 net.ipv4.ip_local_port_range 1024 65535 # 增大连接跟踪表 net.netfilter.nf_conntrack_max 655360 # TCP缓冲区自动调整 net.ipv4.tcp_moderate_rcvbuf 17.2 应用层优化建议HTTP/2优于HTTP/1.1多路复用长连接减少TCP握手开销TLS 1.3比TLS 1.2快1-RTT握手QUIC协议基于UDP解决TCP队头阻塞8. 常见问题排查指南现象可能原因排查命令能ping通但无法TCP连接防火墙拦截telnet ip port,iptables -L -n连接经常超时网络拥塞ping -f,mtr下载速度慢接收窗口小ss -it,sysctl net.ipv4.tcp_rmemDNS解析慢本地缓存问题time nslookup,dig traceHTTPS证书错误时间不同步date,ntpstat9. 协议栈安全防护9.1 常见攻击与防御SYN Flood攻击# 模拟攻击仅供测试 hping3 -S --flood -p 80 target_ip # 防御措施 sysctl -w net.ipv4.tcp_syncookies1 sysctl -w net.ipv4.tcp_max_syn_backlog4096ARP欺骗检测# 查看异常ARP条目 arp -an | grep -v incomplete # 静态绑定ARP arp -s 192.168.1.1 00:11:22:33:44:559.2 安全加固建议禁用ICMP重定向sysctl -w net.ipv4.conf.all.accept_redirects0启用反向路径过滤sysctl -w net.ipv4.conf.all.rp_filter1限制ICMP速率iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT10. 现代网络演进方向10.1 IPv6的必然选择IPv6相比IPv4的核心改进地址空间从2^32扩大到2^128取消校验和交由上层协议负责内置IPsec支持无状态地址自动配置(SLAAC)测试你的网络准备情况curl --ipv6 https://test-ipv6.com10.2 云原生网络变化容器网络特点每个Pod都有独立IPIP-per-PodService通过kube-proxy实现负载均衡CNI插件实现跨主机通信Flannel/Calico等查看Kubernetes网络规则iptables-save | grep KUBE-SVC11. 学习资源推荐11.1 必读RFC文档RFC 791 - IP协议RFC 793 - TCP协议RFC 768 - UDP协议RFC 826 - ARP协议RFC 2460 - IPv6协议11.2 实用工具清单抓包分析Wireshark/tcpdump/tshark网络测试iperf3/hping3/nmap协议调试telnet/netcat/socat流量监控iftop/nethogs/bmon11.3 进阶学习路径用Python实现简易TCP栈Scapy库研读Linux内核网络栈源码net/ipv4/目录参加Cisco/Juniper认证CCNA/JNCIA学习eBPF进行网络观测BCC工具集