如果想要了解TCP三次握手,可以看下我这篇博客
首先我们要简单了解TCP三次握手的目的
- 确认客户端和服务器的接受和发送能力
- 确认双方的seq序列号
- 使双方协商一些参数,比如窗口大小等
第一次握手丢失
客户端发送SYN请求连接报文,如果迟迟等不到服务器的请求确认报文段,那么就会进行超时重传,具体重传几次,要看tcp_syn_retries内核参数,一般默认是5次。要注意的是,重传的请求连接报文的seq序列号字段还是之前的seq,不会重新生成哦。
第二次握手丢失
第二次握手丢失就有意思了,因为服务器发送的第二次握手是连接确认报文段,既包括对第一次握手的ACK确认,同时还有SYN字段表示要建立连接,所以第二次握手也可以成为SYN-ACK报文。所以当第二次握手丢失,客户端迟迟等不到第一次握手的确认,就会触发超时重传机制,进行超时重传;服务器等不到自己SYN连接的确认,也会进行超时重传。客户端和服务器具体的超时重传次数还是由内核参数决定。
第三次握手丢失
第三次握手丢失,此时客户端已经处于established状态了,因为它通过两次握手已经验证了自己的发送和接收能力嘛。但是此时第三次握手丢失,服务器迟迟得不到ACK报文,但是ACK报文丢失,ACK 报文是不会有重传的,当 ACK 丢失了,就由对方重传对应的报文。所以当到达服务器的超时重传时间后,服务器会超时重传第二次报文,当达到最大超时重传次数还没得到ACK报文,服务器就会断开连接。
一个小知识点,每次超时重传的时间是上一次的两倍哦