三次握手
作用是为了确认双方的接收与发送能力是否正常
为了防止服务器端开启一些无用的连接增加服务器开销以及防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误
ACK字段:在TCP报文段中,字段ACK=1时,确认号字段才有效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1。
- 第一次客户端向服务器发送TCP报文 开启 SYN = 1 序列号 seq = x
SYN = 1 seq = x
- 标记位为SYN,表示“请求建立新连接”
- 服务器端接收到来自客户端的TCP报文之后 服务器的序列号seq = y 服务器的确认号 ack = x + 1
SYN = 1、ACK = 1 、seq = y、ack = x + 1
- 服务端的序列号是自己的 确认号 = 客户端传递的序列号 + 1
- ack = x+ 1 表示收到客户端的序号Seq并将其值加1作为自己确认号Ack的值
- 客户端接收到来自服务器端的确认收到数据的TCP报文 seq = x + 1 ack = y + 1
ACK = 1 、seq = x + 1 、ack = y + 1
- 序列号 = 服务端的确认号 确认号 = 服务端传递的序列号 + 1
- 三次握手完成 客户端和服务器端进行正常的数据传输
客户端 seq = x -----------> 服务器 seq = y 、ack = x + 1 -----------> 客户端 seq = x + 1 、ack = y + 1
四次挥手
四次挥手即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。
- TCP客户端发送一个FIN报文,请求关闭连接,用来关闭客户端与服务端之间的数据传输
FIN = 1 、seq =x
- 标记位为FIN,表示“请求释放连接“;
- 客户端的序号 seq = x
- 服务器端接收到从客户端发出的TCP报文之后,知道了客户端想要断开连接的想法,发送了一个ACK (确认收到)
ACK= 1 、seq = y 、ack = x + 1
- 标记位为ACK,表示“接收到客户端发送的释放连接的请求”;
- 序号为 seq = y
- 确认号为ack=x + 1,收到客户端报文,将其序号Seq值加1作为本段报文确认号Ack的值
- 服务端也想断开与客户端的连接,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号
FIN = 1、ACK= 1 、seq = z 、ack = x + 1
- 客户端收到 FIN 之后,发送一个 ACK 报文作为应答
ACK= 1 、seq = x + 1 、ack = z + 1
- 服务端收到 ACK 报文之后,关闭连接
客户端发送一个想要关闭连接的 FIN + ACK --------> 服务器端 ACK(第一次先告诉客户端 我知道你想关闭连接) 、服务器端ACK + FIN(第二次服务器确定完数据已经发送完毕,然后告诉客户端 可以确认关闭了) --------> 客户端响应收到服务器的确认关闭 ACK