首先,让我们来讨论一下TCP标志位。在介绍TCP三次握手和四次挥手之前,了解TCP标志位的含义对于后续的理解很重要。TCP标志位共有6种,分别是SYN(同步标志),ACK(确认标志),PSH(推送标志),FIN(结束标志),RST(重置标志)和URG(紧急标志)。这些标志位的值代表了当前请求的目的。其中,SYN用于建立连接,ACK用于确认收到请求,PSH用于推送数据,FIN用于结束会话,RST用于重置连接,URG用于保证连接不被中断。此外,还有两个序号,分别是顺序号和确认号,用于标识数据包的顺序和确认。
接下来,让我们来详细了解TCP三次握手。三次握手是在建立TCP连接时,客户端和服务器之间共发送3个包的过程。其目的是连接服务器指定端口,建立TCP连接,并同步连接双方的顺序号和确认号,以交换TCP信息。下图是TCP三次握手的图示。
针对TCP连接的安全问题,有一种常见的攻击称为SYN攻击。为了防护这种攻击,可以在过滤网关上进行设置,如设置SYN网关和SYN代理,以及调整网关超时时间。此外,还可以加固TCP/IP协议栈,采用SynAttackProtect机制和SYN cookies技术,增加最大半连接数并缩短超时时间。
接下来,让我们来了解TCP四次挥手的过程。在关闭连接时,客户端会发送连接释放报文,并停止发送数据。服务器收到连接释放报文后,会发送确认报文,并进入CLOSE-WAIT状态。此时,客户端进入FIN-WAIT-2状态,等待服务器发送连接释放报文。服务器发送完最后的数据后,会向客户端发送连接释放报文,客户端收到后发送确认,最后经过一段时间的等待,TCP连接才会完全关闭。
最后,让我们回答一些常见的面试题。为什么连接时是三次握手,而关闭时是四次握手呢?这是因为当客户端发起关闭连接的请求时,仅代表客户端没有需要发送给服务器端的数据了。而服务器端如果仍有数据需要发送给客户端,就不能同时发送ACK和FIN报文。因此,服务器会先发送一个响应报文,表示接收到了客户端的FIN请求,然后在数据传输完毕后再发送FIN请求,表示服务器准备断开连接。所以关闭连接时需要四次握手。
为什么TIME_WAIT状态需要经过2MSL才能返回到CLOSE状态呢?这是因为在四次挥手过程中,如果最后一条报文丢失,服务器会重复发送FIN报文。如果没有设置时间段,客户端无法响应服务器的请求,导致服务器进入死循环。因此,需要设置一个时间段,如果在这个时间段内接收到服务器的再次请求,代表ACK报文没有接收成功。经过2MSL的时间后,客户端撤销相应的TCB,进入CLOSED状态。
为什么不能用两次握手进行连接呢?这是因为三次握手有两个重要的功能。一是双方做好发送数据的准备工作,并确保双方都知道彼此已准备好。二是允许双方协商初始顺序号。如果改为两次握手,可能会发生死锁。服务器在接收到客户端的连接请求后,向客户端发送ACK确定报文。如果客户端没有接收到ACK报文,会认为连接未成功建立,忽略服务器发送的任何数据。这样客户端会一直等待服务器的ACK报文,而服务器会不断重复发送数据,导致死锁的发生。
如果已经建立了连接,但是客户端突然出现故障,服务器会怎么处理呢?TCP设有一个保活计时器,服务器每收到一次客户端的请求后都会重新复位这个计时器。如果两小时内没有收到客户端的任何数据,服务器会发送探测报文段,每隔75秒发送一次。如果连续发送10个探测报文后仍然没有响应,服务器会认为客户端出现故障,关闭连接。
以上是对TCP标志位、三次握手、四次挥手以及一些常见面试题的解释和讨论。如果您对前端开发和相关主题感兴趣,欢迎关注我的公众号:爱生活的前端狗。我会持续发布优质文章,帮助前端工程师提升技术水平和生活品质。让我们一起向前走吧!