一、TCP三次握手
1、Client首先发送一个连接试探,ACK=0表示确认号无效,SYN = 1表示这是一个连接请求报文,同时表示这个数据报不能携带数据,seq = x表示Client自己的初始序号,表示客户端等待服务器的回复。
2、Server监听到连接请求报文后,如同意建立连接,则向Client发送确认。SYN和 ACK都置1,ack = x + 1表示期望收到对方下一个报文段的第一个数据字节序号是x + 1,同时表明x为止的所有数据都已正确收到,seq = y 表示Server自己的初始序号,表示服务器已经收到Client的连接请求,等待client的确认。
3、Client收到确认后还需再次发送确认,同时携带要发送给Server的数据。ACK置1,ack = y + 1表示期望收到对方下一个报文段的第一个数据字节序号是y + 1,seq= x + 1表示Client自己的初始序号,一旦收到Client的确认之后,TCP连接就建立完毕。
二、TCP四次挥手
1、Server端向Client端发送一个FIN数据段,序列号为i,FIN和ACK都置1 ,用来关闭Server端到Client端的数据传送,也就是告诉Client端,Server端已经不会再发数据了(当然,在FIN包之前发送出去的数据,如果没有收到对应的ACK确认报文,Client端依然会重发这些数据),但此时Server端还可以接收数据。
2、Client端接到FIN(i)报文后,但是如果还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据,Client端发送ACK,序列号为i + 1,ACK置1,告诉Server端请求已经收到了,但Client端还没准备好,Server端继续等待Client端的FIN报文。
3、当Client端确定数据已发送完成,则向Server端发送FIN报文,序列号为j,FIN和ACK都置1,告诉Server端,Client端数据发完了,准备好关闭连接了。
4、Server端收到FIN(j)报文后,就知道可以关闭连接了,Server端发送ACK,序列号为j + 1,ACK置1, Client端收到ACK后,就知道可以断开连接了,至此,TCP连接就已经完全关闭了!