TCP三次握手:
- 第一次握手:客户端TCP报文种设置"syn=1",第一个数据包"seq"序列号(X)默认为0,然后把报文给服务端,请求建立连接
- 第二次握手:服务端接收到客户端报文中请求建立连接的请求,也向客户端发送一个TCP报文,“syn"设置为1,请求客户端的连接,同时"ack"控制字段也设置为1,表示对确认收到客户端的请求。
服务端TCP报文中第一个数据包的"seq"序列号(Y)也默认为0,报文中"ACK"确认号为"X+1”,告诉客户端下次要发数据包的序列号 - 第三次握手:客户端向服务端发送"ack=1"的确认控制字段,发送"seq"序列号信息(X+1),发送"ACK"确认号(Y+1)
通过一张图更直观的描述三次握手的过程,(下面的TCP报文为简写,只写了些重要信息)其中"fin"控制字段是请求断开连接的字段,当"fin"设置为1时,即为请求断开连接
TCP四次挥手
- 第一次挥手:客户端向服务端发送断开连接请求,控制字段"fin"设置为1
- 第二次挥手:服务端向客户端发送确认信息,控制字段"ack"设置为1,表示收到了客户端的请求
- 第三次挥手:服务端向客户端发送请求断开连接的请求,控制字段"fin"设置为1,并向客户端发送确认信息,控制字段"ack"设置为1
- 第四次挥手:客户端向服务端发送确认信息,控制字段"ack"设置为1,表示确认收到服务端发来的断开连接的信息
TIP:为什么建立连接进行三次握手,断开连接却需要四次握手?
- 服务端开启服务后,就一直处于监听状态,等待想要与其建立连接的客户机。所以一旦有客户机来连接自己,不需要向上层(会话层)汇报,就可以直接给客户端发送确认信息,并向客户端发送建立连接的请求。所以只需要三次握手即可连接
- 而客户端在请求断开连接时,服务端只能先发一个确认信息,表示自己已经收到客户端的断开连接请求,但是不能立马也向客户端发送断开连接的请求,因为服务端需要向上层(会话层)汇报一下,得到会话层的允许后,再向客户端发送请求端开连接的请求。所以需要四次挥手
- 会话层主要用于建立连接;tcp协议处于传输层,主要用于传输数据
TCP十一种状态集
- TCP三次握手:5种状态
- TCP四次挥手:6种状态