作为互联网通信的事实标准,TCP/IP协议栈由四层架构组成,每层都承担着不可替代的关键职能。物理层之上,链路层负责相邻节点间的帧传输,典型代表是以太网协议;网络层通过IP协议实现主机到主机的逻辑寻址与路由;传输层提供端到端的可靠(TCP)或不可靠(UDP)传输服务;最上层的应用层则承载着HTTP、FTP等具体业务协议。
关键点:TCP/IP采用分层封装设计,数据从应用层向下传递时,每层都会添加自己的头部信息,形成"协议数据单元"(PDU)。比如HTTP报文被封装为TCP段,TCP段又被封装为IP包,最终以以太网帧的形式在物理介质上传输。
这种分层设计带来三大核心优势:
32位的IPv4地址采用点分十进制表示(如192.168.1.1),包含网络标识和主机标识两部分。子网掩码(如255.255.255.0)用于划分网络边界,通过CIDR表示法(192.168.1.0/24)可以更灵活地分配地址空间。
实际工程中常遇到这些地址类型:
避坑指南:子网划分时务必留足地址余量。我曾在一个园区网络项目中,将200个终端划分到/24子网(254个可用地址),结果三个月后因设备扩容导致地址耗尽,不得不重新规划网络拓扑。
128位地址长度(如2001:0db8:85a3::8a2e:0370:7334)彻底解决地址枯竭问题,主要改进包括:
迁移方案示例:
bash复制# 双栈部署配置示例(Linux)
sysctl -w net.ipv6.conf.all.disable_ipv6=0 # 启用IPv6
sysctl -w net.ipv6.conf.default.accept_ra=2 # 允许路由通告
三次握手建立连接:
四次挥手终止连接:
实战经验:TIME_WAIT状态会维持2MSL(通常4分钟),高并发服务端可通过调整内核参数缓解:
bash复制sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_tw_recycle=1 # 注意NAT环境下可能引发问题
code复制SRTT = α·SRTT + (1-α)·RTT_sample
RTO = min(UBOUND, max(LBOUND, β·SRTT))
基础过滤语法:
bash复制tcpdump -i eth0 host 192.168.1.100 and port 80 -w capture.pcap
高级分析技巧:
tcpdump -nnA -r capture.pcaptcpdump -r capture.pcap -nn | awk '{print $3,$5}' | sort | uniq -c | sort -nrtcpdump -r capture.pcap 'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-ack'连通性检查:
bash复制mtr -n 8.8.8.8 # 可视化路由跟踪
nc -zv example.com 80 # 端口检测
性能测试:
bash复制# 测量TCP吞吐量
iperf3 -c server_ip -t 30 -w 256K
# 模拟丢包环境测试
tc qdisc add dev eth0 root netem loss 5%
案例1:TCP连接数暴涨
bash复制ss -antp | awk 'NR>1 {print $1}' | sort | uniq -c
lsof -i :8080 | grep CLOSE_WAIT
案例2:间歇性传输中断
bash复制tcpdump -i eth0 'tcp[13] & 8!=0' # 捕获RST包
sysctl -w net.ipv4.tcp_retries2=8 # 增加重试次数
关键内核参数调整:
bash复制# 增大端口范围
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
# 启用窗口缩放
sysctl -w net.ipv4.tcp_window_scaling=1
# 调整缓冲区大小
sysctl -w net.ipv4.tcp_rmem="4096 87380 6291456"
sysctl -w net.ipv4.tcp_wmem="4096 16384 4194304"
SYN Cookie防护:防止SYN Flood攻击
bash复制sysctl -w net.ipv4.tcp_syncookies=1
连接追踪优化:
bash复制sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=86400
sysctl -w net.netfilter.nf_conntrack_max=1000000
TCP指纹混淆:对抗OS探测
bash复制sysctl -w net.ipv4.tcp_timestamps=0
sysctl -w net.ipv4.tcp_window_scaling=0
端口敲门(Port Knocking):
bash复制# 使用knockd实现动态防火墙规则
apt install knockd
cat > /etc/knockd.conf <<EOF
[options]
UseSyslog
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 10
command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
EOF