三次握手 Three-Way Handshake

建立TCP连接时所采用的一种过程,它确保客户端和服务器之间的通信通道是可靠的

目的

  1. 同步双方的序列号:确保双方都知道彼此的数据传输从哪里开始。
  2. 确认彼此的存在:确认对方能够接收到发送的信息,并准备好发送和接收数据。
  3. 初始化连接参数:设置通信的基本参数,如初始序列号和窗口大小。

第一次握手 SYN

客户端向服务器发送一个SYN(同步序列编号)包,包含一个初始序列号 Seq = X

第二次握手 SYN - ACK

服务器收到SYN包后,回复一个SYN-ACK(同步-确认)包。这个包包含服务器的初始序列号Seq = Y,并确认收到了客户端的序列号Ack = X + 1

第三次握手:ACK

客户端收到SYN-ACK包后,向服务器发送一个ACK(确认)包。这个包确认了服务器的序列号Ack = Y + 1,并使用自己的序列号Seq = X + 1

为什么需要三次握手

  1. 防止重复连接:三次握手确保了双方都知道彼此的存在,并且没有误解或重复的连接请求。
  2. 同步序列号:通过交换SYN和ACK包,双方能够同步初始序列号,从而正确地管理数据包的顺序。
  3. 测试双方的可达性:确保双方的网络路径是通畅的,数据包能够正确地传递和接收。

wireshark 抓取三次握手的包

第一次握手的时候,ack == 0, syn == 1 因此filter 的使用代码tcp.flags.ack == 0 and tcp.flags.syn == 1
第二次握手的时候 tcp.flags.syn == 1 and tcp.flags.ack == 1
第三次握手的时候 tcp.flags.ack == 1 and tcp.flags.syn == 0

四次挥手 Four-Way Handshake

当一方想要终止连接时所采用的关闭过程。确保了在连接关闭时,双方都能有序地终止通信,并且没有任何数据丢失。

步骤

  1. 第一次挥手(FIN):客户端发送连接释放报文
  2. 第二次挥手(ACK):服务器确认接收连接释放报文
  3. 第三次挥手(FIN):服务器发送连接释放报文
  4. 第四次挥手(ACK):客户端确认接收连接释放报文

超时和重传

在实际网络中,由于可能存在网络延迟或丢包的情况,TCP四次挥手中的每一步都可能会涉及超时和重传机制:

  1. 超时:如果一方在合理时间内没有收到对方的确认,它会重新发送FIN或ACK包。
  2. 重传:为了保证连接的可靠关闭,TCP协议会在超时后重传未被确认的包,直到收到对方的确认或超时次数达到上限。