计算机网络知识体系概览(Java)
什么是计算机网络?
计算机网络是将分布在不同地理位置的计算机通过通信线路和设备连接起来,实现数据交换和资源共享的系统。互联网(Internet)就是全球最大的计算机网络。
对于 Java 后端工程师来说,几乎所有的工作都建立在网络之上——HTTP 请求处理、数据库连接、微服务通信、RPC 调用、消息队列、缓存访问——理解网络原理是排查线上问题(超时、丢包、连接泄漏)的基础能力。
网络分层模型
每一层只关心自己的职责:应用层定义数据格式(HTTP 报文)→ 传输层保证可靠传输(TCP 三次握手)→ 网络层寻址和路由(IP 地址)→ 链路层实际传输数据帧。
核心知识点
TCP 与 UDP——传输层的两大协议
| 特性 | TCP | UDP |
|---|---|---|
| 连接方式 | 面向连接(三次握手) | 无连接 |
| 可靠性 | 可靠传输(确认、重传、排序) | 不保证可靠 |
| 传输效率 | 较低(协议开销大) | 高(轻量) |
| 流量控制 | ✅ 滑动窗口 | ❌ |
| 拥塞控制 | ✅ 慢启动/拥塞避免 | ❌ |
| 适用场景 | HTTP、文件传输、数据库连接 | 视频直播、DNS、游戏 |
三次握手(建立连接):
四次挥手(断开连接):因为 TCP 是全双工的,每个方向需要单独关闭,所以需要四次。
面试高频
"为什么是三次握手而不是两次?"——两次握手无法确认客户端的接收能力,可能导致服务端建立无效连接(旧的 SYN 延迟到达)。
HTTP 与 HTTPS——应用层的核心
HTTP(超文本传输协议) 是 Web 的基础协议——客户端发送请求(Request),服务端返回响应(Response)。
常见 HTTP 状态码:
| 状态码 | 含义 | 常见场景 |
|---|---|---|
| 200 | OK | 请求成功 |
| 301 | 永久重定向 | 域名迁移 |
| 302 | 临时重定向 | 短链接跳转 |
| 304 | Not Modified | 协商缓存命中 |
| 400 | Bad Request | 请求参数错误 |
| 401 | Unauthorized | 未登录 |
| 403 | Forbidden | 无权限 |
| 404 | Not Found | 资源不存在 |
| 500 | Internal Server Error | 服务器报错 |
| 502 | Bad Gateway | 网关收到上游无效响应 |
| 503 | Service Unavailable | 服务过载/维护 |
HTTPS = HTTP + TLS/SSL 加密。TLS 握手过程使用非对称加密交换密钥,之后使用对称加密传输数据,兼顾安全性和性能。
Socket 编程——底层网络通信
Socket(套接字) 是应用层与传输层之间的编程接口。Java 网络编程的三种 IO 模型:
- BIO(同步阻塞):一个连接一个线程,简单但不适合高并发
- NIO(同步非阻塞):基于 Channel + Buffer + Selector,一个线程管理多个连接
- AIO(异步非阻塞):操作系统完成 IO 后回调通知,Linux 内核实现不成熟
Netty 是基于 NIO 的高性能网络框架,几乎所有 Java 通信中间件(Dubbo、RocketMQ、Elasticsearch)都使用 Netty。
WebSocket——全双工实时通信
HTTP 是"请求-响应"模式(客户端不请求,服务端不能推送数据)。WebSocket 在一次 HTTP 握手后建立长连接,实现服务端主动推送。IM 聊天、实时通知、协同编辑等场景都依赖 WebSocket。
学习建议
推荐学习路径
- 网络分层模型 → 理解每层的职责
- TCP → 三次握手、四次挥手、可靠传输(面试必考)
- HTTP/HTTPS → 请求方法、状态码、TLS 握手
- DNS → 域名解析过程
- Socket + Netty → Java 网络编程基础
- WebSocket → 实时通信方案