第一次握手丢失
当客户端想和服务端建立TCP连接后,首先第一个发的就是SYN报文,然后进入到SYN_SENT状态。
在这之后如果客户端迟迟没有收到服务端的SYN-ACK报文(第二次握手),就会触发[超时重传]机制,重传SYN报文,而且重传的SYN报文的序列号都是一样的。
不同版本的操作系统可能超时时间不同,有的1秒,有的3秒,这个超时时间是写死在内核里的,如果想要修改则需要重新编译内核,比较麻烦。
当客户端在1秒后没收到服务端的SYN-ACK报文后,客户端就会重发SYN报文,那么重发几次呢?
在Linux系统里,客户端的SYN报文最大重传次数由tcp_syn_retries内核参数控制,这个参数是可以自定义的,默认值一般是5.
# cat /proc/sys/net/ipv4/tcp_syn_retries
5
通常,第一次超时重传是在1秒后,第二次超时重传是在2秒后,第三次超时重传是在4秒后...每一次超时重传的时间都是上一次的2倍
总耗时 = 1+2+4+8+16+32 = 63秒