• 第一次:计算机(第一台计算机)发送SYN=1的请求报文,此时第一台计算机进入SYN SENT状态,等待服务器(第二台计算机)确认。
//此时如果报文丢失发送不到对端会如何? 第一台计算机发送报文之后会启动一个定时器,在超时之后未收到服务器端的确认,会再次发送SYN请求, 每次尝试的时间会是第一次的二倍,如果总的总尝试时间为75秒,此次建立链接失败。
• 第二次:服务器端收到计算机发送的SYN报文(建立链接请求)后,S端必须返回确认号并且同时发送一条SYN报文,此时进入SYN RCVD状态。
//为啥要连带发送SYN报文? TCP是全双工通信,协议规定当收到建立链接请求后必须返回序列号,同时建立本端到对端的通信链接。 这也叫做捎带应答机制。 //如果第二次报文丢失怎么办? 在发送完ACK SYN报文后会启动一个定时器,超时没有收到ACK确认,会再次发送,会进行多次重试。 超时时间依旧每次翻倍,重试次数可设置。 修改 /proc/sys/net/ipv4/tcp_synack_retries 的值
• 第三次:C端收到S端发的ACK SYN报文,需要返回一个应答ACK的报文,此时该连接会进入半连接状态的队列,当S端收到ACK后,一条完整的全双工TCP链接建立完成,双方进入ESTABLISHED状态。
这里有个常用攻击手段,攻击者伪造一个SYN请求发送给服务端,服务端响应之后,会收不到C端的ACK确认, 服务端会不断的重试,默认会重试五次。 此时服务端会维持这个链接的所有资源,如果有大量这样的请求,服务端的资源会被耗完。 这就是DOS攻击。 //如果第三次报文丢失怎么办? S端在发出ACK SYN报文后会启动一个定时器,在超时触发还没收到ACK就确认是丢失了,会重试一次发送。