HTTP是基于TCP协议传输的, 所以在这我们先了解下TCP协议
TCP包头格式
我们先看看TCP报文头部的格式:
image.png
首先 源端口号和目标端口号
是必不可少的, 没有没有这两个端口,数据就不知道应该发给哪个应用
序号: 是为了解决发送包的乱序问题
确认号: 是为了确认发出去的包对象是否有收到, 如果没有收到,就应该重新发送, 直到送到为止, 这就是为了解决丢包问题
接下来就是状态位
. TCP是面向连接的, 因而双方需要维护连接的状态, 这些带状态的数据包发送, 会引起双方的连接状态变更
SYN
发起一个连接,
ACK
回复,
RST
重新连接,
FIN
结束连接
窗口大小
: TCP要做流量控制, 通信双方各生成一个窗口(缓存大小), 标识自己当前能够处理的数据的能力, 别发送的太快, 撑死我, 也别发送的太慢, 饿死了
拥塞控制
: 对于真正的道路堵不堵车, 它无能为力, 唯一能做的就是控制自己, 也及控制发送的速度,
TCP传输数据之前,要先建立三次握手
在HTTP传输数据之前, 首先需要TCP连接, TCP连接建立, 通常称为三次握手
这个所谓的[连接
] 只是双方计算机里维护一个状态, 在连接建立的过程中, 双方的状态变为时序图就想这样
- 一开始, 客户端服务端都处于close状态, 服务端主动监听某个端口,变为LISTEN状态
- 客户端发起来一个
syn
连接请求, 之后处于syn_send
状态 - 服务端收到客户端的连接请求会回复一个
syn + ack
的确认请求给客户端, 然后状态变为,syn_rcvd
- 客户端收到服务器的确认后,也会发一个
ACK
确认给服务端告诉他, 收到了你的ACK确认
,然后状态变为ESTABLISHED,连接已建立 , 因为它一发一收成功 - 服务端收到
ACK后
也会变为ESTABLISHED连接已建立状态, 因为它也一发一收成功
所以三次握手是保证双方都有发送和接收的能力
网友评论