三次握手四次挥手
了解三次握手四次挥手之气那需要先先了解几个基本知识点
1、FIN=1表示此报文段的发送方的数据已经发送完毕,请求释放传输连接。
2、确认字段号(ACK):期望接收报文段的数据的第一个字节的序号,ack=N表示序号N-1为止的所有数据都正确接收到。
3、确认位:只有ACK=1时确认号字段才有效,ACK=0时无效
连接状态:
1、CLOSE_WAIT状态下只能发送数据,不能接收数据
2、LAST_ACK状态:被动断开连接的一端在缓冲区数据发送完成后发送FIN=1
3、TME_WAIT:此状态下连接已经断开,断开后保留2MSL后进入CLOSE(起始状态)状态
注:MSL:报文最大存在时间,2MSL为两倍MSL,1MSL为2分钟
为什么最后一次挥手要等是2MSL:
防止最后一个ack丢失
如果不等待直接关闭的话,服务端之前发送的消息可能还没有完全到达客户端。关闭了则会导致发送失败
如果不等待,最后一次发送的SYN可能网络滞后,这样服务端的FIN包可能重新发送出现错误了
为啥要等两次MSL == 一次为了等待ACK包到达==,一次为了等待二次重新发送第三次的FIN包到达。
三次握手
三次握手是指建立TCP连接,需要在客户端和服务器之间发送三个包,握手的过程传送的包里不包含数据,三次握手完毕后,客户端与服务器开始传送数据。
第一次握手:客户端发送一个包,尝试建立连接
第二次握手:服务器接受到这个包后发送第二个包,告诉客户端收到连接请求,可以连接了
第三次握手:客户端接受到服务器传来的包后,向服务器发送第三个包,至此客户端与服务器确认连接,接下来开始传送数据
为什么要多次确认呢?
因为传输协议式建立在网络层之上的,而底层网络存在不确定性,可能网线会出问题,可能路由出问题,没办法保服务发送的数据客户端一定能接收到,就跟我们打电话一下,先要喂一下,确定信号好好不好,对方是否能听到我们讲话。总之,握手的最终目的就是确保双方都准备就绪。
四次挥手
所谓四次挥手就是种植TCP连接,但是终止前需要客服端和服务器发四次包来确认
第一次挥手:客户端准备关闭连接,向TCP发送释放报文段,报文段的FIN=1。
第二次挥手:服务器接受到释放报文段后,发送一个ACK给客户端,服务器进入CLOSE_WAIT状态。
第三次挥手:服务器进入LAST_ACK状态,发送FIN=1,用来关闭服务器到客户端的数据传送
第四次挥手:客户端接受到FIN后客户端进入TME_WAIT状态,并发送一个ACK给服务器,服务器接收到ACK后进入CLOSED状态,至此完成四次挥手。