【教程】TCP/IP协议栈完全入门:从0到1理解网络通信


阿里云特惠 - 新用户专享

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步:实战排查连接问题

遇到连接超时?按这个顺序排查:

  1. ping 目标IP - 检查网络连通性
  2. telnet IP 端口 - 检查端口是否开放
  3. netstat -an | grep 端口 - 查看连接状态
  4. tcpdump抓包 - 看握手是否成功

总结

理解TCP/IP不要死记硬背,多抓包,多实验,网络协议其实很简单.

发表评论