一、网络编程基础
1. 什么是网络编程?
网络编程的本质是 多台计算机之间的数据交换。
- 采用 请求/响应模型:客户端发起请求,服务器返回响应。
- 客户端(Client):按需启动,主动发起连接。
- 服务器(Server):常驻运行,监听端口,响应请求。
📞 类比:打电话时拨号方是客户端,接听方是服务器;连接建立后,双方平等通信。
2. 网络编程中的两个核心问题
- 如何准确定位主机? → 由 IP 地址 解决(网络层)
- 如何可靠高效传输数据? → 由 TCP/UDP 解决(传输层)
当前主流模型为 C/S(Client-Server)架构:服务器作为守护进程持续监听,客户端按需连接。
3. 什么是网络协议?
网络协议是 数据交换过程中必须遵守的规则集合,包括:
- 数据格式
- 传输顺序
- 错误处理
- 是否需要确认等
4. 为什么要对网络协议分层?
- 降低复杂度:将大问题拆解为小问题
- 提高灵活性:某层技术变更不影响其他层
- 便于实现与维护
- 促进标准化:每层功能可独立定义和优化
5. 计算机网络体系结构
| 模型 | 层数 | 各层名称 |
|---|---|---|
| OSI 参考模型 | 7 层 | 物理层 → 数据链路层 → 网络层 → 传输层 → 会话层 → 表示层 → 应用层 |
| TCP/IP 模型 | 4 层 | 数据链路层 → 网络层(IP) → 传输层(TCP/UDP) → 应用层 |
✅ 实际开发中主要使用 TCP/IP 四层模型。
二、TCP 与 UDP
6. 什么是 TCP/IP 和 UDP?
- TCP(Transmission Control Protocol):面向连接、可靠、有序、基于字节流的传输协议。
- UDP(User Datagram Protocol):无连接、不可靠、基于报文、低开销的传输协议。
7. TCP 与 UDP 的区别
| 对比项 | TCP | UDP |
|---|---|---|
| 连接方式 | 面向连接(三次握手) | 无连接 |
| 可靠性 | 可靠(重传、校验、顺序) | 不可靠(可能丢包、乱序) |
| 通信模式 | 仅点对点 | 支持一对一、一对多、多播 |
| 数据单位 | 字节流(可拆分) | 报文(不可拆分) |
| 首部开销 | 20 字节 | 8 字节 |
| 状态维护 | 需维护连接状态表 | 无状态 |
| 适用场景 | 文件传输、HTTP、邮件 | 视频直播、游戏、DNS 查询 |
📞 类比:
- TCP 像打电话:先确认对方在线,再说话
- UDP 像广播:直接喊话,不管是否有人听
8. TCP/UDP 的典型应用场景
- TCP:Web 浏览(HTTP/HTTPS)、文件传输(FTP)、邮件(SMTP/POP3)、SSH
- UDP:DNS 查询、NTP 时间同步、DHCP 动态分配 IP、实时音视频、在线游戏
9. 常见协议所属传输层
| 协议 | 传输层 |
|---|---|
| HTTP / HTTPS / FTP / SMTP / POP3 / SSH / TELNET | TCP |
| DNS / DHCP / NTP / BOOTP / SNMP / ECHO | TCP & UDP(DNS 默认 UDP,大响应走 TCP) |
| ARP | 数据链路层(非传输层) |
⚠️ DNS 通常使用 UDP(端口 53),但当响应 > 512 字节时自动切换到 TCP。
10. 什么是 ARP 协议?
ARP(Address Resolution Protocol) :将 IP 地址解析为 MAC 地址。
- 主机维护 ARP 缓存表
- 若缓存无目标 MAC,则广播 ARP 请求
- 目标主机回复 ARP 响应,源主机更新缓存并发送数据
🌐 跨网段通信时,ARP 解析的是 网关路由器的 MAC 地址。
11. 什么是 NAT?
NAT(Network Address Translation) :将 私有 IP 转换为公网 IP,解决 IPv4 地址不足问题。
- 静态 NAT:一对一固定映射
- 动态 NAT / PAT(端口复用):多对一,通过端口号区分内网主机
12. 从输入 URL 到页面加载全过程
- DNS 解析:浏览器 → OS 缓存 → Hosts 文件 → 本地 DNS → 递归/迭代查询 → 获取 IP
- TCP 三次握手:建立可靠连接
- 发送 HTTP 请求:GET /index.html
- 服务器处理请求:返回 HTML 内容
- 浏览器解析渲染:遇到 JS/CSS/图片 → 重复步骤 1~4
- 页面完整呈现
三、TCP 核心机制
13. TCP 三次握手详解
| 步骤 | 客户端 | 服务器 | 状态变化 |
|---|---|---|---|
| 1 | 发送 SYN(seq=x) | --- | SYN_SENT |
| 2 | --- | 回复 SYN+ACK(seq=y, ack=x+1) | SYN_RCVD |
| 3 | 发送 ACK(ack=y+1) | --- | ESTABLISHED |
✅ 目的:确认双方收发能力正常,同步初始序列号(ISN)
14. 为什么不能两次握手?
- 防止历史连接请求突然到达:旧 SYN 报文滞留后重传,若两次握手会导致服务器误建连接并浪费资源。
- 无法确认客户端收到服务端的 SYN+ACK
15. 第三次握手 ACK 丢失怎么办?
- 服务器未收到 ACK → 每隔 3 秒重发 SYN+ACK(默认 5 次)
- 若客户端在此期间发送数据(带 ACK=1),服务器可进入 ESTABLISHED
- 若超时仍未收到 → 关闭连接(CLOSED)
16. 客户端故障如何检测?
- 服务器启用 TCP Keep-Alive 机制 :
- 空闲 2 小时后发送探测包
- 每 75 秒一次,连续 10 次无响应 → 断开连接
17. 什么是初始序列号(ISN)?
- 随机生成的 32 位数字(如 1000)
- 用于标识数据字节流起始位置
- 防止旧连接数据被新连接误接收
18. TCP 四次挥手详解
| 步骤 | 发起方 | 接收方 | 状态 |
|---|---|---|---|
| 1 | 发 FIN | --- | FIN_WAIT_1 |
| 2 | --- | 回 ACK | CLOSE_WAIT(服务端仍可发数据) |
| 3 | --- | 发 FIN | LAST_ACK |
| 4 | 回 ACK | --- | TIME_WAIT(等待 2×MSL)→ CLOSED |
⏳ TIME_WAIT 存在原因:
- 确保最后一个 ACK 能被服务器收到
- 防止旧连接的延迟报文干扰新连接
19. 为什么不能合并为三次挥手?
因为 服务端可能还有数据未发送完,需先 ACK 客户端的关闭请求,等数据发完再发 FIN。
四、Socket 编程
20. 什么是 Socket?
- Socket 是应用层与 TCP/IP 协议族通信的抽象接口
- 由 IP + 端口 唯一标识一个通信端点
- 是 长连接 的实现基础(如 WebSocket、游戏后台)
🔧 在 Java 中,Socket 编程主要指基于 TCP/UDP 的网络通信。
21. Socket 属于哪一层?
- 位于应用层与传输层之间,是对 TCP/IP 协议的封装(外观模式)
22. Socket 通信流程
TCP 模式:
text
编辑
Server: bind → listen → accept → read/write → close
Client: connect → write/read → close
UDP 模式:
text
编辑
Server: bind → receive
Client: send → (无需连接)
23. 常用 Socket 类(Java)
| 类名 | 协议 | 作用 |
|---|---|---|
Socket |
TCP | 客户端/服务端数据读写 |
ServerSocket |
TCP | 服务端监听端口,accept 新连接 |
DatagramSocket |
UDP | 发送/接收数据报 |
DatagramPacket |
UDP | 封装 UDP 数据包 |
InetAddress |
--- | 表示 IP 地址 |
InetSocketAddress |
--- | 封装 IP + 端口 |
💡 示例代码已验证:TCP 使用
InputStream/OutputStream,UDP 使用DatagramPacket
五、HTTP 协议
24. 什么是 HTTP?
HTTP(HyperText Transfer Protocol) 是应用层协议,用于在客户端与服务器之间传输超文本(HTML、图片、音视频等)。
25. Socket 与 HTTP 的区别
| 对比项 | Socket | HTTP |
|---|---|---|
| 连接类型 | 长连接(持久) | 短连接(请求-响应后断开) |
| 协议层级 | 传输层抽象 | 应用层协议 |
| 控制粒度 | 细(自定义协议) | 粗(标准方法/状态码) |
| 适用场景 | 实时通信(游戏、直播) | Web 页面、API 接口 |
26. HTTP 请求体组成
- 请求行 :
GET /index.html HTTP/1.1 - 请求头 :
Host: www.example.com - 空行
- 请求体(仅 POST/PUT 等有,GET 无)
❗ GET 请求 没有请求体,参数在 URL 中。
27. HTTP 响应报文组成
- 状态行 :
HTTP/1.1 200 OK - 响应头 :
Content-Type: text/html - 空行
- 响应体:HTML 内容等
28. HTTP 与 HTTPS 的区别
| 项目 | HTTP | HTTPS |
|---|---|---|
| 安全性 | 明文传输 | SSL/TLS 加密 |
| 端口 | 80 | 443 |
| 证书 | 无需 | 需 CA 证书(付费/免费) |
| 性能 | 高 | 略低(加密开销) |
| 连接 | 无状态 | 加密通道 + 身份认证 |
29. HTTPS 工作原理
- 客户端验证服务器证书(有效期、域名、CA)
- 生成随机数,用 服务器公钥加密 后发送
- 服务器用 私钥解密,得到随机数
- 双方用该随机数作为 AES 对称密钥 进行后续通信
🔐 结合了 非对称加密(安全交换密钥) + 对称加密(高效传输)
30. 一次完整 HTTP 请求的 7 个步骤
- 建立 TCP 连接(三次握手)
- 发送请求行(如
GET / HTTP/1.1) - 发送请求头
- 发送空行(表示头结束)
- 服务器返回状态行(
200 OK) - 返回响应头
- 返回响应体 → 关闭 TCP 连接(或保持)
31. HTTP 状态码分类
| 类别 | 含义 | 常见码 |
|---|---|---|
| 1xx | 信息 | 101(切换协议) |
| 2xx | 成功 | 200(OK)、204(无内容)、206(范围请求) |
| 3xx | 重定向 | 301(永久)、302/307(临时)、304(未修改) |
| 4xx | 客户端错误 | 400(语法错)、401(未认证)、403(禁止)、404(未找到) |
| 5xx | 服务器错误 | 500(内部错)、503(服务不可用) |
32. HTTP 请求方法
| 方法 | 用途 |
|---|---|
| GET | 获取资源 |
| POST | 提交数据 |
| PUT | 上传文件(全量替换) |
| PATCH | 部分更新 |
| DELETE | 删除资源 |
| HEAD | 获取头部(无 body) |
| OPTIONS | 查询支持的方法 |
| TRACE | 回显请求(调试用) |
33. GET 与 POST 的区别
| 对比项 | GET | POST |
|---|---|---|
| 数据位置 | URL 参数 | 请求体 |
| 数据长度 | 受 URL 长度限制(约 2KB) | 无限制 |
| 安全性 | 低(参数可见) | 较高(隐藏在 body) |
| 幂等性 | 是 | 否 |
| 缓存 | 可缓存 | 一般不缓存 |
✅ 敏感信息(密码)必须用 POST!
34. HTTP 版本对比
| 特性 | HTTP/1.0 | HTTP/1.1 | HTTP/2 |
|---|---|---|---|
| 连接 | 短连接 | 默认长连接 | 多路复用 |
| 并发 | 串行请求 | 管线化(少用) | 并行请求 |
| 编码 | 文本 | 文本 | 二进制分帧 |
| 头部 | 重复传输 | --- | HPACK 压缩 |
| 新特性 | --- | 断点续传 | 服务器推送、流优先级 |
🚀 HTTP/2 显著提升性能,尤其适合现代 Web 应用。
六、安全与会话
35. 对称加密 vs 非对称加密
| 类型 | 密钥 | 速度 | 安全性 | 用途 |
|---|---|---|---|---|
| 对称加密 | 同一密钥(如 AES) | 快 | 密钥分发难 | 数据传输 |
| 非对称加密 | 公钥+私钥(如 RSA) | 慢 | 高 | 密钥交换、签名 |
HTTPS = 非对称加密(交换密钥) + 对称加密(传输数据)
36--38. Cookie 与 Session
| 项目 | Cookie | Session |
|---|---|---|
| 存储位置 | 客户端(浏览器) | 服务器内存/数据库 |
| 安全性 | 低(可篡改) | 高 |
| 大小限制 | ≤ 4KB | 无限制 |
| 性能影响 | 无 | 占用服务器资源 |
| 关联方式 | 通过 Set-Cookie 设置 |
服务器生成 sessionid 存入 Cookie |
✅ 实际中常结合使用:Cookie 存 sessionid,Session 存用户数据。
七、补充高频考点(39--47)
39. 什么是 MSL?
MSL(Maximum Segment Lifetime):TCP 报文在网络中的最大存活时间(通常 30~120 秒)。
TIME_WAIT = 2 × MSL:确保旧连接报文彻底消失
40. 为什么 TIME_WAIT 必须存在?
- 防止最后一个 ACK 丢失导致服务器重发 FIN
- 避免新连接收到旧连接的延迟数据包
41. 如何减少 TIME_WAIT?
- 启用
SO_REUSEADDR(允许端口复用) - 调整内核参数(如
net.ipv4.tcp_tw_reuse)
42. UDP 如何实现可靠传输?
应用层自行实现:
- 序列号 + 确认应答(ACK)
- 超时重传
- 流量控制(如 QUIC 协议)
43. HTTP 是无状态的,如何保持登录状态?
通过 Cookie + Session 或 Token(JWT) 机制。
44. 什么是管线化(Pipelining)?
HTTP/1.1 允许客户端 连续发送多个请求,无需等待响应。
⚠️ 实际中因队头阻塞(Head-of-Line Blocking)问题,很少启用。
45. HTTP/2 的多路复用解决了什么问题?
- 消除 HTTP/1.x 的 队头阻塞
- 单个 TCP 连接上并行传输多个请求/响应
46. 什么是 CDN?
CDN(Content Delivery Network):将静态资源缓存到离用户最近的节点,加速访问。
47. 常见抓包工具?
- Wireshark(图形化,功能强)
- tcpdump(命令行,轻量)
- 浏览器 DevTools(HTTP 层)