以下是通俗易懂、从零开始的 TCP/IP 完整教程,适合初学者到进阶开发者,内容按层次结构组织,你可以按需跳着看。
一、TCP/IP 是什么?
TCP/IP 不是一个协议,而是一整套协议族(Protocol Suite)的简称,全称是 Transmission Control Protocol / Internet Protocol。
简单来说:
- IP 负责把数据包从 A 送到 B(寻址和路由)
- TCP 在 IP 之上提供可靠、可靠、有序、面向连接的传输(类似于打电话)
- 还有 UDP 提供无连接、不可靠但快速的传输(类似于寄明信片)
整个互联网实际上跑的就是 TCP/IP 协议族。
二、TCP/IP 五层模型(实际工程中最常用)
| 层级 | 名称 | 对应 OSI 模型 | 典型协议和设备 | 主要功能 |
|---|---|---|---|---|
| 5 | 应用层 | 应用/表示/会话层 | HTTP、HTTPS、FTP、SMTP、DNS、SSH | 直接为应用程序提供服务 |
| 4 | 传输层 | 传输层 | TCP、UDP | 端到端通信(进程到进程) |
| 3 | 网络层 | 网络层 | IP、ICMP、ARP、路由器 | 逻辑寻址和路由 |
| 2 | 数据链路层 | 数据链路层 | Ethernet、Wi-Fi、交换机、MAC 地址 | 相邻节点之间可靠传输帧 |
| 1 | 物理层 | 物理层 | 网线、光纤、Wi-Fi 无线电、网卡 | 把比特流变成电信号/光信号/无线电波 |
三、关键协议详解
- IP(Internet Protocol)
- IPv4:32 位,例如 192.168.1.1
- IPv6:128 位,例如 240e:390:1f2c:1234::1
- 无连接、不可靠、尽最大努力交付(Best Effort)
- IP 数据包头部最重要字段:源 IP、目的 IP、TTL、协议号(6=TCP,17=UDP)
- TCP(Transmission Control Protocol)
特点:面向连接、三次握手、四次挥手、可靠传输、流量控制、拥塞控制、有序
TCP 头部关键字段:
- 源端口、目的端口(16位)
- 序列号 Seq(32位)
- 确认号 Ack(32位)
- 标志位:SYN、ACK、FIN、RST、PSH、URG
- 窗口大小(流量控制)
- 校验和
三次握手(建立连接)
客户端 服务端
SYN (seq=x) →
← SYN+ACK (seq=y, ack=x+1)
ACK (ack=y+1) →
连接建立,可以传输数据
四次挥手(断开连接)
客户端 服务端
FIN →
← ACK
← FIN
ACK →
连接彻底关闭
- UDP(User Datagram Protocol)
- 无连接、无序、不可靠、开销极小
- 仅8字节头部
- 适合视频直播、DNS、游戏、IoT
- 其他重要协议
- DNS:域名 → IP(端口 53(UDP为主)
- HTTP/HTTPS:80 / 443(TCP)
- FTP:20(数据)、21(控制)
- SSH:22
- SMTP:25 / 465 / 587
- ICMP:ping、traceroute 用
四、一个数据包的完整旅程(举例:你打开 www.baidu.com)
- 浏览器向 DNS 服务器发 UDP 查询 www.baidu.com 的 A 记录 → 得到 220.181.38.148
- 浏览器向 220.181.38.148:443 发起 TCP 三次握手
- 握手成功后发送 HTTPS 请求(基于 TLS 加密的 HTTP)
- 服务器返回 HTML、图片等资源
- 浏览器渲染页面
- TCP 四次挥手关闭连接(或保持长连接)
五、常用工具实战命令(Linux/macOS/Windows 都可用)
# 查看本机 IP
ip addr show # Linux
ifconfig # macOS/old Linux
ipconfig # Windows
# 测试连通性
ping www.baidu.com
# 查看路由路径
traceroute www.baidu.com # Linux/macOS
tracert www.baidu.com # Windows
# 查看端口监听
netstat -tunlp # Linux
netstat -an | find "LISTEN" # Windows
# 抓包神器(需要管理员权限)
tcpdump -i eth0 tcp port 80 -n
# 或者用 Wireshark 图形化更直观
# 测试端口是否开放
nc -zv www.baidu.com 443
telnet www.baidu.com 80
六、常见面试/实战问题
- TCP 和 UDP 的区别?什么时候用哪个?
- 三次握手为什么要三次?两次行不行?
→ 防止已失效的连接请求突然又传到了服务器 - 四次挥手为什么要四次?
→ 因为 TCP 是全双工,双方都要确认对方不再发送数据 - TIME_WAIT 状态有什么作用?为什么是 2MSL?
- TCP 如何保证可靠传输?(序号、确认、重传、校验和、流量控制、拥塞控制)
- HTTP 是基于 TCP 还是 UDP?HTTP/3 呢?
→ HTTP/1.1 和 HTTP/2 基于 TCP,HTTP/3 基于 QUIC(基于 UDP)
七、推荐学习资源(2025年最新)
免费:
- 《图解TCP/IP》(第6版)——日本人写的,最通俗
- 韩立刚《TCP/IP协议族详解》视频(B站)
- Computer Networking: A Top-Down Approach(经典大学教材)
付费但极强:
- 小林coding 的《图解网络》《图解TCP》(公众号+网站)
- 云原生时代必学:深入理解 QUIC、HTTP/3、gRPC
动手实践:
- 用 Python 写一个最简单的 TCP 服务器/客户端
- 用 Wireshark 抓自己浏览网页的全过程
需要我给你贴一个「30分钟上手」的 Python TCP/UDP 示例代码吗?或者你想重点深入哪一部分(比如三次握手细节、拥塞控制算法、HTTP/3)?告诉我,我可以继续展开!