HTTP是基于TCP协议传输的, 所以在这我们先了解下TCP协议
TCP包头格式
我们先看看TCP报文头部的格式:

image.png
首先 源端口号和目标端口号是必不可少的, 没有没有这两个端口,数据就不知道应该发给哪个应用
序号: 是为了解决发送包的乱序问题
确认号: 是为了确认发出去的包对象是否有收到, 如果没有收到,就应该重新发送, 直到送到为止, 这就是为了解决丢包问题
接下来就是状态位. TCP是面向连接的, 因而双方需要维护连接的状态, 这些带状态的数据包发送, 会引起双方的连接状态变更
SYN 发起一个连接,
ACK回复,
RST重新连接,
FIN结束连接
窗口大小: TCP要做流量控制, 通信双方各生成一个窗口(缓存大小), 标识自己当前能够处理的数据的能力, 别发送的太快, 撑死我, 也别发送的太慢, 饿死了
拥塞控制: 对于真正的道路堵不堵车, 它无能为力, 唯一能做的就是控制自己, 也及控制发送的速度,
TCP传输数据之前,要先建立三次握手
在HTTP传输数据之前, 首先需要TCP连接, TCP连接建立, 通常称为三次握手
这个所谓的[连接] 只是双方计算机里维护一个状态, 在连接建立的过程中, 双方的状态变为时序图就想这样

image.png
- 一开始, 客户端服务端都处于close状态, 服务端主动监听某个端口,变为LISTEN状态
- 客户端发起来一个
syn连接请求, 之后处于syn_send状态 - 服务端收到客户端的连接请求会回复一个
syn + ack的确认请求给客户端, 然后状态变为,syn_rcvd - 客户端收到服务器的确认后,也会发一个
ACK确认给服务端告诉他, 收到了你的ACK确认,然后状态变为ESTABLISHED,连接已建立 , 因为它一发一收成功 - 服务端收到
ACK后也会变为ESTABLISHED连接已建立状态, 因为它也一发一收成功
所以三次握手是保证双方都有发送和接收的能力