基于TCP协议的“可靠”连接
HTTP 是基于传输层的TCP协议而构建。
TCP的待发送数据会被放入SOCKET的缓冲区,并且通过一些标记位和指针字段来控制所有缓冲区中的数据有序可靠的被发送到对端。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| ┌──────────────────────────── IP 报文头(IPv4) ─────────────────────────────┐ │ 版本 (4b) | 首部长度 (4b) | 区分服务(8b) | 总长度(16b) │ 标识 (16b) | 标志(3b) | 片偏移(13b) │ 生存时间 TTL(8b) | 协议 (8b: 0x06 表示 TCP) │ 首部校验和 (16b) │ 源 IP 地址 (32b) │ 目的 IP 地址 (32b) │ (+ 可选项) └────────────────────────────────────────────────────────────────────────────┘ ↓ ┌──────────────────────────── TCP 段头 ──────────────────────────────────────┐ │ 源端口 (16b) | 目标端口 (16b) │ 序列号 (32b) │ 确认号 (32b) │ 数据偏移(4b) | 保留(3b) | 标志位(9b: SYN, ACK, etc.) │ 窗口大小 (16b) │ 校验和 (16b) │ 紧急指针 (16b) │ (+ 可选项,如MSS、窗口缩放、SACK等) └────────────────────────────────────────────────────────────────────────────┘ ↓ ┌────────────────────── HTTP 请求报文(以 GET 为例) ─────────────────────────┐ │ 起始行(Request Line) │ GET /index.html HTTP/1.1 ← 方法(变量长) 路径(变量长) 协议版本 │ │ 首部字段(Headers) │ Host: www.example.com ← Key:Value,每行为一字段 │ User-Agent: curl/7.64.1 │ Accept: */* │ ... │ │ 空行(\\r\\n)表示首部结束 │ │ 实体主体(Body,可选) │ (如POST中的表单数据,如 x-www-form-urlencoded 格式) └─────────────────────────────────────────────────────────────────────────────┘
|
Socket
socket是协议栈在操作系统上的具体实现。设计为一种通用网络接口,通过定义具体的协议和响应的地址,端口信息来实现服务端与客户端的连接。
传输性能
DNS 到 IP 的地址转换
DNS解析时间
TCP 连接时延
请求报文处理
构造响应报文
网络扰动