网络(自行整理,交由大模型写成markdown)

TCP 的粘包和拆包

  • 粘包:多个数据包在接收时合并成一个包
  • 拆包:一个数据包被分成多个包接收
  • 原因
    • TCP 是面向字节流的协议,不关心数据边界,发送方可以随意发送
    • 拆包是因为网络传输有 MTU(最大传输单元),不能一次发送太大的包
  • 解决办法
    1. 使用 定长消息(双方固定读取)
    2. 添加 消息分隔符(双方约定好)
    3. 使用 消息头(标明包的长度)

三次握手

  1. 发起方发送 SYN
  2. 服务器回复 SYN + ACK
  3. 发起方回复 ACK

TCP 初始序列号 ISN 如何取值?

  • 时间戳 为基础生成,超过 2^32 会回到 0
  • 加入一些 随机值 防止被猜到

TCP 三次握手时,客户端发送 SYN 之后宕机了会怎样?

  • 服务器会正常发送 SYN + ACK,但对方无响应
  • 服务器会 重试多次,若仍无回复则 主动断开
  • 重试次数tcp_synack_retries 参数决定

SYN Flood / DDoS 攻击

  • 攻击方式:客户端不断发送 SYN(第一次握手),但不进行第三次握手,导致服务器资源耗尽
  • 防御方法
    1. SYN Cookie:要求客户端在第三次握手时带上 cookie
    2. 增加 SYN 队列缩短超时时间

四次挥手

  1. 客户端 FIN → 进入 FIN_WAIT_1
  2. 服务器 ACK → 进入 CLOSE_WAIT
  3. 服务器 FIN → 进入 LAST_ACK
  4. 客户端 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

四层 & 七层模型

四层模型

  1. 应用层
  2. 传输层
  3. 网络层
  4. 网络接口层

七层模型

  1. 物理层
  2. 数据链路层
  3. 网络层
  4. 传输层
  5. 会话层
  6. 表示层
  7. 应用层
Cookie Session Token
存储位置 客户端 服务器 客户端(无状态)
存储内容 小型数据文件 用户数据 认证信息
工作方式 浏览器带上 Cookie 认证 客户端只存 SessionID 无需数据库查询,直接校验
示例 购物车 登录状态 JWT(JSON Web Token)

DNS(域名解析系统)

  • Domain Name System
  • 解析域名IP 地址
  • 负载均衡:同一域名可以解析多个 IP

CDN(内容分发网络)

  • 缓存服务器 分布多个地点
  • 用户请求时选择最近的缓存站
  • 适用于 静态资源(图片、CSS、JS)

用户输入网址到网页显示全过程

  1. 解析 URL 生成 HTTP 请求
  2. DNS 解析:域名 → IP
  3. TCP 三次握手
  4. 封装 TCP 数据包
  5. 封装 IP、MAC 数据包
  6. 网卡 转换成 电信号 通过 网线传输
  7. 交换机 → 路由器 → 服务器
  8. 服务器处理请求,返回数据
  9. 浏览器解析并渲染页面