整理的一点网络方面的八股文 | 欢迎来到小面包的小站🥝
网络(自行整理,交由大模型写成markdown)
TCP 的粘包和拆包
- 粘包:多个数据包在接收时合并成一个包
- 拆包:一个数据包被分成多个包接收
- 原因:
- TCP 是面向字节流的协议,不关心数据边界,发送方可以随意发送
- 拆包是因为网络传输有 MTU(最大传输单元),不能一次发送太大的包
- 解决办法:
- 使用 定长消息(双方固定读取)
- 添加 消息分隔符(双方约定好)
- 使用 消息头(标明包的长度)
三次握手
- 发起方发送
SYN
- 服务器回复
SYN + ACK
- 发起方回复
ACK
TCP 初始序列号 ISN 如何取值?
- 以 时间戳 为基础生成,超过
2^32
会回到 0
- 加入一些 随机值 防止被猜到
TCP 三次握手时,客户端发送 SYN
之后宕机了会怎样?
- 服务器会正常发送
SYN + ACK
,但对方无响应
- 服务器会 重试多次,若仍无回复则 主动断开
- 重试次数 由
tcp_synack_retries
参数决定
SYN Flood / DDoS 攻击
- 攻击方式:客户端不断发送
SYN
(第一次握手),但不进行第三次握手,导致服务器资源耗尽
- 防御方法:
- SYN Cookie:要求客户端在第三次握手时带上
cookie
- 增加 SYN 队列 或 缩短超时时间
四次挥手
- 客户端
FIN
→ 进入 FIN_WAIT_1
- 服务器
ACK
→ 进入 CLOSE_WAIT
- 服务器
FIN
→ 进入 LAST_ACK
- 客户端
ACK
→ 进入 TIME_WAIT
,服务器 CLOSE
为什么需要四次挥手?
- 类似打电话,要两对
ACK + FIN
确保数据完整
- 不一定是四次:服务器可以在
ACK
时同时 FIN
TIME_WAIT
作用
- 确保服务器收到最后的
ACK
- 防止端口复用时收到过期数据
- 2MSL:等待两倍的最大生存时间
MSL
(Linux 默认 MSL=30s
,所以 2MSL=1min
)
其他断开方式
- RST(Reset)报文:异常情况下立即断开(如主机崩溃)
- 超时断开(Timeout):连接长时间无数据传输
超时重传机制
SACK(选择性确认)
- 告诉发送方自己接收到的数据块
- 发送方只需重传丢失的部分
滑动窗口的作用
- 协调发送方和接收方速率(一般等于接收缓冲区大小)
- 提高吞吐量(允许一次发送多个包)
拥塞控制
1. 慢启动
- 一开始 小量发送,若成功则 指数增长
- 直到 丢包 或 达到慢启动阈值
2. 拥塞避免
3. 快速重传
- 发送 10 个包,9 个
ACK
回来了 → 直接重传丢失的(只需 3 个重复 ACK
)
4. 快速恢复
- 发生 快速重传 后,将窗口 砍半
- 慢启动阈值 设为新窗口大小(进入拥塞避免)
滑动窗口 vs 拥塞窗口
|
作用 |
滑动窗口 |
接收方信箱大小(控制接受能力) |
拥塞窗口 |
送货公司送货能力(控制发送速度) |
ARP 和 RARP
- ARP(Address Resolution Protocol):IP → MAC
- RARP(Reverse ARP):MAC → IP
四层 & 七层模型
四层模型
- 应用层
- 传输层
- 网络层
- 网络接口层
七层模型
- 物理层
- 数据链路层
- 网络层
- 传输层
- 会话层
- 表示层
- 应用层
Cookie vs Token vs Session
|
Cookie |
Session |
Token |
存储位置 |
客户端 |
服务器 |
客户端(无状态) |
存储内容 |
小型数据文件 |
用户数据 |
认证信息 |
工作方式 |
浏览器带上 Cookie 认证 |
客户端只存 SessionID |
无需数据库查询,直接校验 |
示例 |
购物车 |
登录状态 |
JWT(JSON Web Token) |
DNS(域名解析系统)
- Domain Name System
- 解析域名 → IP 地址
- 负载均衡:同一域名可以解析多个 IP
CDN(内容分发网络)
- 缓存服务器 分布多个地点
- 用户请求时选择最近的缓存站
- 适用于 静态资源(图片、CSS、JS)
用户输入网址到网页显示全过程
- 解析 URL 生成 HTTP 请求
- DNS 解析:域名 → IP
- TCP 三次握手
- 封装 TCP 数据包
- 封装 IP、MAC 数据包
- 网卡 转换成 电信号 通过 网线传输
- 交换机 → 路由器 → 服务器
- 服务器处理请求,返回数据
- 浏览器解析并渲染页面