HTTP的三次握手以及四次挥手
一、三次握手
本质是客户端与浏览器总共发送了3个包,目的就是为了确认双方的接受和发送能力是否正常,为之后建立TCP链接做准备
(1)客户端向服务端发送一个SYN报文(一个数据包),来请求链接
(2)服务端接受到SYN报文,并发送自己的ACK报文,表示自己接受到了客户端的SYN,然后把自己的SYN报文发出作为应答发送给客户端
(3) 客户端接受到了SYN报文,再发送ACK报文,给予确认,双方已经建立起链接
扩展问题:
1、为什么是3次握手,而不是2次?
因为三次握手的目的是为了确认双方的接受和发送能力是否正常,为之后建立TCP链接做准备
(1)先来看第一次,是客户端发送网络包,服务端接受到了,这样得出结论:客户端的发送能力正常,服务端的接受能力正常
(2)第二次握手,表示服务端发包,客户端接受到了,得出结论:服务端的接受、发送能力正常,客户端的接受能力正常,但是此时服务器还不知道客户端的接受能力是否正常
(3)客户端发包,服务端收到了,得出结论:服务端知道了客户端的接受能力正常
2、三次握手可以携带数据吗?
第一、二次不可以,因为如果第一次可以携带数据的话,会有人在此环节,发送大量的数据,造成客户端疯狂向服务端发送SYN报文,这会让服务端花费很长时间及内存空间来接受这些报文。
但是对于第三次握手,前两次握手已经建立起了链接,这时候发送数据也没毛病
二、四次挥手
由于TCP提供了链接一段在结束自己的发送后还能接受来自另一端的数据的能力,被称为TCP的半关闭
(1) 客户端发送一个fin报文,停止发送数据,准备关闭TCP链接,等待服务端确认
(2) 服务端接受到fin,并且会发送自己的ack报文,表示已经收到报文了,此时客服端TCP处于半关闭状态,结束了自己的发送,但能接受数据
(3)等待服务端处理好所有报文之后,客户端想要断开链接,发送链接释放报文,等待客户端的确认
(4) 客户端接受到,发送fin报文,确定关闭链接'
问题:挥手为什么四次
因为服务端收到客户端的fin报文后,可直接发送fin+ack报文,表示收到了报文,但是服不会立即关闭链接,等到所有报文都发送完,再发fin报文,因此不能一起发送,才需要四次