三次握手
第1次握手:客户端向服务端发送SYN报文(用于同步请求),报文中指明了客户端的初始化序列号ISN,表示客户端想要进行连接(初始化序列号是随机生成的)
第2次握手:服务端向客户端 发送SYN+ACK报文,报文中指明了服务端的初始化序列化ISN(s);同时,将客户端的初始化序列号ISN(c) + 1 作为确认序号ack,确认应答(对第一次握手做回应),表示收到客户端的SYN报文。
第3次握手:客户端向服务端 发送 ACK报文。和前面一样,把服务端的初始化序列号ISN(s) + 1 作为确认序号ack的值,表示收到服务端的SYN报文。
四次断开
第1次断开:客户端向服务端发生FIN报文,报文会指定一个序列号u,表明想要断开连接。(停止正常的数据发送,不是停止所有数据的发送)
第2次断开:服务端收到后,会发送ACK报文,并且把客户端的序列号u +1 作为ack的值,表明收到了客户端的报文。(服务端进入CLOSE_WAIT状态)
//等待一段时间后,(保证服务端发完了数据包)
第3次挥手:服务端向客户端发送FIN报文,报文会指定一个序列号w。(服务端LAST_ACK状态)
第4次挥手:客户端收到后,发送ACK报文,作为应答。ACK标志符号对应的ack值为w + 1。
//客户端发送完ACK报文后,进入TIME_WAIT状态。等待2MSL时间后,才进入CLOSE状态。
//2MSL,MSL是“最长报文寿命”,2倍的MSL表示一个FIN报文的时间+一个ACK报文的时间(如果最后一次ACK报文丢失,服务端会重复发FIN报文,直到服务端收到最后的ACK报文为止,这段时间就是2MSL)
//所以,等待2MSL作用就是:保证最后发送的ACK报文能送达接收端。即:最后一个ACK报文可能会丢失,TIME_WAIT状态就是用来重发可能丢失的ACK报文的。