我们都知道http协议是无状态的,且只能通过客服端向服务器发起请求,所有每次请求将伴随着一次的连接的开启与关闭。那么具体是怎么个流程保证开启和关闭正常进行的呢,这就要引出我们今天要谈的三次握手(连接)和四次挥手(断开连接)了
三次握手:
三次握手主要是用来建立http协议的期间主要过程是
1:客户端发送了一个带有SYN的Tcp报文到服务器,这个三次握手中的开始。表示客户端想要和服务端建立连接。
2:服务端接收到客户端的请求,返回客户端报文,这个报文带有SYN和ACK标志,询问客户端是否准备好。
3:客户端再次响应服务端一个ACK,表示我已经准备好。
之所以用三次确定状态是因为很可能在某个阶段因为网络延迟导致无数传输客户端 服务端正确的信息,所以要客户端收到服务端返回的syn ack后再返回一个ack给客户端表示准备好了,
含义意思
下面我们再来解释一下具体名词的含义
SYN:synchronous建立联机
ACK:acknowledgement 确认
第一次握手:我们发送一个SYN=1,seq=x(x是随机数字的意思)的数据包,服务器看到我们发过来数据包,就知道你要跟他建立链接。
第二次握手:服务器发给我们一个SYN=1,seq=y,ACK=x+1。服务器发送前两个数据是为了确认自己的发消息能力,第三个数据在我们的seq上加1,以确认建立的是同一个链接。
第三次握手:我们只需要向服务器发送一个ACK=y+1,服务器便可以确认自己的发送能力了。
四次挥手:
由于http是基于tcp的,tcp是双向的,所以http关闭的时候需要分别关闭客服端和服务端,且客服端和服务端都可以主动进行关闭。我们就以客户端主动断开连接为例子
1:客户端设置seq=u,fin=1。值,发送fin报文给服务端,然后进入fin_wait等待阶段。
2:服务端收到fin报文段,如果此时还有还有数据未传完,则会反一个ack=u+1,seq=v。 如果 传完了,则直接返回fin报文 fin=1 ack=u+1 seq=w
3:客户端如果收到ack则进入继续等待阶段,等待服务端返回fin报文,接收到fin则进入下一阶段
4:客户端收到了fin进入time-wait阶段,向服务端发送 ack=w+1,seq=u+1,如果服务端没收到会继续发送fin给客户端,客户端会等待2MSL(数据包在网络中最长存在时间)后关闭