网络通信与 TCP/IP 协议基础
Netty 系列 · 第 1/8 篇
下一篇:《BIO、NIO、直接内存与零拷贝》
开头:为什么学 Netty 要先补网络基础?
你在 Dubbo、ZooKeeper、RocketMQ 的源码里反复看到 Netty,但面试被问到「三次握手为什么需要三次」「65535 个端口够用吗」时却答不顺——问题往往不在 Netty API,而在 TCP/IP 这层地基没打牢。
本篇从计算机网络是什么讲起,一路梳理 OSI/TCP 模型、IP/MAC/端口、TCP 握手挥手与 Wireshark 抓包,为后面 BIO/NIO、epoll 和 Netty 线程模型打底。


一、计算机网络与协议分层
计算机网络的本质:利用通信线路把地理上分散、功能独立的计算机和通信设备连接起来,通过协议实现资源共享与信息传递。


按覆盖范围可分为 LAN、MAN、WAN;按功能分层则有两种常见模型:
| 模型 | 层数 | 记忆要点 |
|---|---|---|
| OSI | 7 层 | 学术完整,面试偶考 |
| TCP/IP | 4~5 层 | 互联网事实标准 |

面试常考:物理层≈网卡,数据链路层≈驱动,网络/传输层由 OS 处理,应用层是 HTTP 等程序。
二、IP、TCP、UDP 与数据封装
- IP:给每台主机一个逻辑地址,负责寻址与路由。
- TCP:面向连接、可靠传输,类似「打电话」——确认、重传、滑动窗口、全双工。
- UDP:无连接、不保证送达,类似「寄快递不管收没收到」,适合 DNS、音视频等场景。
数据从应用层往下,每层加首部;接收端逐层剥首部还原。A 发 B 的完整路径:应用 → TCP 分段 → IP 数据报 → 链路帧 → 物理传输,反向同理。


MAC 由厂商烧录,48 位,与网络拓扑无关;IP 逻辑可配,32 位(IPv4);端口 16 位,标识同一主机上的不同应用,知名端口 0~1023,客户端临时端口通常 >10000。
面试题:为什么端口是 65535 个?
TCP/UDP 首部各用 16 位存端口号,2^16=65536,其中 0 表示「所有端口」,实际可用 65535。
面试题:一台主机最多 65535 个 TCP 连接?
不对。TCP 四元组是(源 IP、源端口、目的 IP、目的端口)。服务端固定目的端口时,不同客户端 IP/端口组合可建立远超 65535 的连接;工程上单机可达千万级(Netty 篇末会再讲调优)。客户端侧若固定源 IP,则受临时端口数量限制更明显。
三、TCP 三次握手与四次挥手
3.1 三次握手(建立连接)
简易记忆:SYN → SYN+ACK → ACK。
详细过程:
- 客户端发 SYN,seq=J,进入 SYN_SENT。
- 服务端回 SYN+ACK,seq=K,ack=J+1,进入 SYN_RCVD。
- 客户端发 ACK,ack=K+1,双方进入 ESTABLISHED。


为什么必须三次? 双方都要确认对方的序列号起始值;两次握手无法保证双方都知道对方已收到自己的 seq;四次则多余。
SYN 洪泛攻击:攻击者伪造 IP 狂发 SYN,占满半连接队列。应对:防火墙、延缓 TCB 分配、调 tcp_max_syn_backlog 等。
3.2 四次挥手(关闭连接)
全双工连接,每方向单独关闭,通常需要 FIN+ACK 共四次。主动关闭方最后进入 TIME_WAIT(约 2×MSL),作用:可靠终止连接、让迟到的报文被丢弃,避免新连接收到旧数据。


MySQL 大量 TIME_WAIT 时可调 wait_timeout、内核参数 tcp_tw_reuse、tcp_fin_timeout 等(生产需评估后再改)。
常见调优参数:net.ipv4.tcp_tw_reuse=1 允许复用 TIME_WAIT 套接字;net.ipv4.tcp_fin_timeout 缩短 FIN_WAIT_2 超时;应用侧 wait_timeout 控制空闲连接回收。修改前需在测试环境验证对长连接业务的影响。
四、Wireshark 实战:亲眼看见握手
抓包是定位网络问题、学习协议最直观的方式。常用工具:Wireshark、Fiddler、Charles。


连接 MySQL 云端实例,过滤器 tcp and !mysql,可看到 SYN、SYN/ACK、ACK 三条记录:








五、UDP 与新一代传输协议
UDP 支持单播与广播,NTP、DNS、DHCP、实时音视频常用 UDP;QQ 以 UDP 为主、TCP 为辅。
- UDT:基于 UDP 的可靠传输,面向广域网大数据量。
- QUIC:Google 提出,多路复用、0-RTT/1-RTT 建连、纠错代替部分重传,运行在 UDP 之上,部署不依赖改内核 TCP 栈。
小结
- 网络分层与 TCP/IP 是 Netty 的底层语境;IP+端口 定位主机与应用,TCP 保证可靠字节流。
- 三次握手交换序列号并防半连接浪费;四次挥手 + TIME_WAIT 保证连接干净关闭。
- 会用 Wireshark 看握手报文,线上问题才不至于只会猜。
下一篇进入 Java 原生 BIO/NIO、Socket 编程常识与零拷贝。