1. TCP 三次握手过程 ?

(首先,两个概念:SYN:同步标志 ACK:确认标志)

刚开始客户端处于 Closed 的状态,服务端处于 Listen 状态。进行三次握手:

第一次握手,客户端给服务器发送一个SYN报文,并指明客户端的初始化序列号 ISN。此时客户端处于 SYN_SEND 状态

第二次握手,服务器收到 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号序列号 ISN,同时会把客户端的 ISN + 1 作为 ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_REVD 的状态

第三次握手,客户端收到 SYN 报文之后,会回应一个 ACK 报文,也是一样的把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 established 状态

最后服务器收到 ACK 报文之后,也处于 established 状态,此时,双方建立连接

2. 为什么需要三次握手?两次不行吗?

其实这是由 TCP 的自身特点可靠传输决定的。

第一次握手,客户端发送网络包,服务端收到了,这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的

第二次握手,服务端发包,客户端收到了。这样客户端就能得出结论:服务端的发送能力、客户端的接收能力是正常的。

第三次握手,客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送,接收能力也正常。

3. (ISN) 是固定的吗?

三次握手的一个重要功能是客户端和服务端交换 ISN ,以便让对方知道接下来接受数据的时候如何按序列号组装数据

如果 ISN 是固定的,攻击者很容易猜出后续的确认号,因此 ISN 是动态生成的

4. 三次握手过程中可以携带数据吗

第三次握手的时候可以携带数据。因为假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都在第一次握手中的 SYN 报文中放入大量的数据,因为攻击者根本就不理服务器的接收、发送能力是否正常。然后疯狂重复发 SYN 报文的话,这会让服务器花费很多时间、内存空间来接收这些报文。也就是说,第一次握手可以放数据的话,可能会让服务器更加容易受到攻击。

而对于第三次的话,客户端已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的,所以携带数据也没问题

5. 四次挥手?为什么要四次?

刚开始双方都处于 established 状态,假如是客户端先发起关闭请求,则:

刚开始双方都处于established状态,假如是客户端先发起关闭请求

第一次挥手:客户端发送一个FIN报文,报文中会指定一个序列号。此时客户端处于FIN_WAIT1状态

第二次挥手:服务端收到FIN之后,会发送ACK报文,且把客户端的序列号值+1作为ACK报文的序列号值,表明已经收到客户端的报文了,此时服务端处于CLOSE_WAIT状态

第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发送FIN报文,且指定一个序列号。此时服务端处于LAST_ACK的状态

第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 +1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的ACK报文之后才会进入CLOSED状态,服务端收到ACK报文之后,就处于关闭连接了,处于CLOSED状态。

6. SYN 攻击是什么?

服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的,所以服务器容易受到 SYN 洪泛攻击。SYN 攻击就是 Client 在短时间内伪造大量不存在的 IP 地址,并向 Server 不断地发送 SYN 包,Server 则回复确认包,并等待 Client 确认,由于源地址不存在,因此 Server 需要不断重发直至超时,这些伪造的 SYN 包将长时间占用未连接队列,导致正常的 SYN 请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。

检测 SYN 攻击?

检测 SYN 攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源 IP 地址是随机的,基本上可以断定这是一次 SYN 攻击。

常见的防御 SYN 攻击的方法?

缩短超时时间

增加最大半连接数

过滤网关防护

SYN cookies技术

7. 什么是半连接队列?

服务器第一次收到客户端的 SYN 之后,就会处于 SYN_REVD 状态,此时双方还没有完全建立起连接,服务器会把此种状态下请求连接放在一个队列里,这种队列称之为半连接队列。