数据封包过程
当应用程序(比如客户端要发送 "Hello" 消息)有数据要传输时:
- 应用层:应用程序会把原始数据(像 "Hello" 字符串)准备好,这是应用层能识别和处理的应用数据。
- 传输层:传输层会给应用数据添加传输层的头部信息。以 TCP 协议为例,头部会包含源端口、目的端口、序列号、确认号等信息。这些信息的作用是为了在传输过程中能对数据进行可靠传输的控制,比如确保数据按序到达、进行流量控制等,添加头部后就形成了传输层的报文段。
- 网络层:网络层会给传输层传来的报文段添加网络层头部。以 IP 协议为例,头部包含源 IP 地址、目的 IP 地址、协议类型(表明传输层用的是 TCP 还是 UDP 等)等信息,这些信息用于确定数据在网络中的传输路径,添加头部后就形成了 IP 数据报。
- 数据链路层:数据链路层会给网络层传来的 IP 数据报添加数据链路层的头部和尾部。头部包含源 MAC 地址、目的 MAC 地址等信息,尾部包含用于校验数据完整性的帧校验序列(FCS)等信息,添加后就形成了数据帧。之后,数据帧会通过物理介质(如网线、无线信号等)发送出去。
数据拆包过程
当数据帧到达目的设备(比如服务器)后:
- 数据链路层:首先对收到的数据帧进行校验,如果 FCS 校验通过,就会去掉数据链路层的头部和尾部,然后把剩下的 IP 数据报交给网络层。
- 网络层:网络层会去掉 IP 头部,检查目的 IP 地址是否是自己,如果是,就把剩下的传输层报文段交给传输层。
- 传输层:传输层会去掉传输层头部,根据头部里的信息(如序列号等)对数据进行重组、确认等操作,然后把应用数据交给应用层。
- 应用层:应用层最终获取到原始的应用数据(比如 "Hello" 字符串),然后进行相应的处理,这样就完成了整个数据从发送到接收的过程。
HTTP 基于 TCP 实现,核心分 4 步,重点是 "建连接→传请求→回响应→关连接":
-
建连接(TCP 三次握手)
客户端和服务器先 "握手",确认双方能正常通信,建立稳定的数据传输通道(比如:"我要连你"→"我收到了,你连吧"→"好的,连好了")。
-
发请求
连接通后,客户端给服务器发 "需求"(比如 "我要首页的内容"),包含要什么资源、用什么方式要(如 GET/POST)。
-
回响应
服务器看懂 "需求" 后,处理并返回结果:要么给所需数据(如 HTML 页面、图片),要么告诉客户端结果(如 "找到了""没找到")。
-
关连接(TCP 四次挥手)
数据传完,双方 "挥手" 断开连接,释放资源(比如:"我用完了,关吧"→"知道了,等我收尾"→"我也收尾完了,关"→"好的,关了")。
(若用 "长连接",第 4 步会延迟,后续请求可直接复用连接,不用重复握手)
TCP 头部
标志位名称 | 比特位位置 | 符号 | 核心作用 |
---|---|---|---|
紧急指针有效位 | 第 1 位 | URG | 表示 TCP 报文段中的 "紧急指针" 字段有效,用于发送紧急数据(如中断指令),无需排队。 |
确认位 | 第 2 位 | ACK | 表示 "确认号" 字段有效,用于确认已收到对方发送的 TCP 报文段(通信中大部分报文段会置 1)。 |
推送位 | 第 3 位 | PSH | 要求接收方立即将数据交给应用层(而非缓存),适用于需要实时交互的场景(如 SSH 命令)。 |
复位位 | 第 4 位 | RST | 强制重置 TCP 连接,用于处理连接异常(如对方端口未监听、连接超时),表示 "连接不可用"。 |
同步位 | 第 5 位 | SYN | 用于建立 TCP 连接的 "三次握手":首次握手(客户端发 SYN=1)、第二次握手(服务端回 SYN=1+ACK=1)。 |
终止位 | 第 6 位 | FIN | 用于释放 TCP 连接,标识发送方已无数据要传输,触发 "四次挥手" 过程(双方需分别发送 FIN)。 |