TCP/IP协议栈完全入门教程
网络编程是每个后端工程师的必修课.本文通过循序渐进的讲解,带你从零开始理解TCP/IP协议栈的核心原理.
第1步:理解分层架构
为什么网络要分层?想象寄快递的过程:
- 应用层 = 你写的快递单内容(HTTP请求)
- 传输层 = 快递公司分拣(TCP确保送达)
- 网络层 = 物流路线规划(IP路由)
- 数据链路层 = 货车运输(以太网帧)
第2步:动手观察三次握手
用tcpdump抓包观察连接建立过程:
# 在终端1启动监听 sudo tcpdump -i any port 80 -nn -S # 在终端2发起请求 curl http://example.com # 你会看到类似输出: # 1. 客户端 → 服务器: Flags [S], seq 1000 # 2. 服务器 → 客户端: Flags [S.], seq 2000, ack 1001 # 3. 客户端 → 服务器: Flags [.], ack 2001
三次握手的本质:确认双方的发送和接收能力都正常.
第3步:理解滑动窗口
TCP用滑动窗口实现流量控制:
# Python模拟滑动窗口原理
def sliding_window_demo():
'''
滑动窗口原理演示
假设窗口大小为4,表示最多允许4个未确认的数据包在空中
'''
window_size = 4 # 接收方告知的窗口大小
sent_packets = [] # 已发送但未确认的包
for seq_num in range(1, 11): # 发送10个包
if len(sent_packets) < window_size:
# 窗口未满,可以发送
print(f"发送包 seq={seq_num}")
sent_packets.append(seq_num)
else:
# 窗口已满,等待ACK
print(f"窗口已满,等待确认...")
# 收到ACK后,窗口滑动
ack = sent_packets.pop(0) # 最老的包被确认
print(f"收到ACK={ack},窗口滑动,继续发送 seq={seq_num}")
sent_packets.append(seq_num)
# 运行演示
sliding_window_demo()
第4步:实战排查连接问题
遇到连接超时?按这个顺序排查:
ping 目标IP- 检查网络连通性telnet IP 端口- 检查端口是否开放netstat -an | grep 端口- 查看连接状态tcpdump抓包- 看握手是否成功
总结
理解TCP/IP不要死记硬背,多抓包,多实验,网络协议其实很简单.
