2026年7月11日 · 5 分钟阅读
Java 网络编程基础:TCP/IP、HTTP、URL 与一次请求的完整链路
基于网络编程课程笔记,梳理网络协议、TCP/IP、TCP 与 UDP、三次握手、四次挥手、URL 请求链路、HTTP 与 HTTPS。
网络编程的核心,是让不同机器上的程序能够按照共同规则交换数据。Java 里的 Socket、NIO、Netty、RPC,本质上都是建立在网络协议之上的编程模型。
学网络编程,不能只从 API 开始。先理解协议、连接、数据传输和一次请求的完整链路,再看代码会清楚很多。
什么是网络通信协议
协议可以理解为通信双方共同遵守的规则。
人和人交流需要使用共同语言,计算机之间通信也需要共同规则。网络协议规定了数据如何组织、如何传输、如何校验、出错后如何处理。
常见网络协议包括:
- TCP/IP。
- UDP。
- HTTP/HTTPS。
- IPX/SPX。
- NetBEUI。
现在互联网最核心、最常见的是 TCP/IP 协议族。
TCP/IP 分层模型
TCP/IP 不是一个单独协议,而是一组协议的集合。它通常按四层模型理解:
| 层级 | 作用 | 常见协议 |
|---|---|---|
| 应用层 | 面向应用,定义业务数据格式 | HTTP、HTTPS、FTP、DNS |
| 传输层 | 负责端到端传输 | TCP、UDP |
| 网络层 | 负责寻址和路由 | IP |
| 网络接口层 | 负责物理网络传输 | Ethernet、Wi-Fi |
分层的好处是职责清晰。应用层不用关心网线怎么传输,网络接口层也不用关心 HTTP 报文含义。
TCP 和 UDP
TCP 和 UDP 都属于传输层协议,但设计目标不同。
| 对比项 | TCP | UDP |
|---|---|---|
| 是否连接 | 面向连接 | 无连接 |
| 可靠性 | 可靠传输 | 不保证可靠 |
| 顺序性 | 保证数据有序 | 不保证顺序 |
| 速度 | 相对较慢 | 相对较快 |
| 典型场景 | 网页、文件传输、RPC | 直播、语音、游戏、广播 |
TCP 更像打电话:先建立连接,再持续通信。UDP 更像发短信:直接发送,不保证对方一定收到。
TCP 三次握手
TCP 建立连接需要三次握手。
客户端 -> 服务端:SYN
服务端 -> 客户端:SYN + ACK
客户端 -> 服务端:ACK
三次握手的目标是让双方确认:
- 客户端具备发送能力。
- 服务端具备接收和发送能力。
- 客户端具备接收能力。
如果只有两次握手,服务端无法确认客户端是否真的能收到自己的响应,容易建立无效连接。
TCP 四次挥手
TCP 断开连接通常需要四次挥手。
主动方 -> 被动方:FIN
被动方 -> 主动方:ACK
被动方 -> 主动方:FIN
主动方 -> 被动方:ACK
为什么不是三次?因为 TCP 是全双工通信。主动方说“我没有数据要发了”,不代表被动方也立刻没有数据要发。被动方需要先 ACK,再等自己的数据发送完成后发送 FIN。
输入 URL 到页面展示发生了什么
浏览器输入一个 URL 后,背后大致会经历这些步骤:
- 浏览器解析 URL。
- 查询域名对应的 IP 地址。
- 建立 TCP 连接。
- 如果是 HTTPS,还要进行 TLS 握手。
- 浏览器发送 HTTP 请求。
- 服务器处理请求,生成响应。
- 服务器返回 HTML、CSS、JavaScript 等资源。
- 浏览器解析和渲染页面。
在这个过程中,DNS、TCP、IP、HTTP、TLS 都可能参与。
HTTP/1.0 和 HTTP/1.1
HTTP/1.1 相比 HTTP/1.0 有几个重要变化。
| 能力 | HTTP/1.0 | HTTP/1.1 |
|---|---|---|
| 连接复用 | 默认短连接 | 默认长连接 |
| 缓存控制 | 相对简单 | 增加更多缓存头 |
| 状态码 | 较少 | 增加更多错误状态码 |
| 断点续传 | 支持较弱 | Range 机制更完善 |
| Host 头 | 不强制 | 支持虚拟主机 |
长连接的价值很大。它避免每个请求都重新建立 TCP 连接,减少握手和挥手成本。
URI 和 URL
URI 是统一资源标识符,URL 是统一资源定位符。
可以简单理解:
URL 是 URI 的一种
URI 负责标识一个资源,URL 不仅标识资源,还说明如何定位这个资源。
一个 URL 通常包含:
- 协议:
http、https。 - 主机名或 IP。
- 端口号。
- 路径。
- 查询参数。
- 片段标识。
HTTP 和 HTTPS
HTTP 和 HTTPS 最大区别是安全性。
| 对比项 | HTTP | HTTPS |
|---|---|---|
| 默认端口 | 80 | 443 |
| 传输方式 | 明文 | 加密 |
| 证书 | 不需要 | 需要证书 |
| 安全性 | 容易被窃听和篡改 | 提供加密、认证和完整性保护 |
HTTPS = HTTP + TLS/SSL。它不是替代 HTTP 的全新应用层协议,而是在 HTTP 和 TCP 之间加了一层安全保护。
Java 网络编程关注什么
Java 网络编程并不是自己实现 TCP/IP,而是在这些协议基础上编写应用程序。
常见层次是:
| 层次 | Java 技术 |
|---|---|
| 原始网络通信 | Socket、ServerSocket |
| 非阻塞 IO | NIO、Selector、Channel、Buffer |
| 网络框架 | Netty |
| 远程调用 | RPC、Dubbo、gRPC |
| Web 容器 | Tomcat、Undertow |
越往上,开发者越少关心底层细节;越往下,开发者越需要理解连接、线程、缓冲区和协议边界。
小结
网络编程基础可以按这条线理解:
- 协议是通信双方共同遵守的规则。
- TCP/IP 是互联网通信的基础协议族。
- TCP 可靠但成本更高,UDP 简单但不保证可靠。
- HTTP 构建在 TCP 之上,HTTPS 在 HTTP 和 TCP 之间增加安全层。
- Java 网络编程是在协议基础上封装应用通信能力。
理解这些基础后,再学习 BIO、NIO、Netty 和 RPC,就不会只停留在 API 层面。