别的,在 Linux 中,传输控制块(Transmission Control Block,TCB)和线程控制块(Thread Control Block,TCB)或者历程控制块(Process Control Block,PCB)之间的关系是不同的,它们分别属于不同的条理(前者是传输层,后两者是内核),它们之间的接洽是:
如果只用 1 次,那么客户端发送一个 SYN 后就认为连接创建成功,但是如果这个 SYN 丢失了或者被延迟了,那么服务器端就无法知道客户端的哀求,也无法给客户端发送数据。除此之外,每次连接都会占用服务端肯定的 CPU 和内存资源,只用 1 次握手就认为创建连接成功,那么当服务端在短时间内接收到大量 SYN 连接哀求,会造成服务端非常,即 SYN 洪水攻击。
为什么不用2次呢?
那么如果是两次握手就创建连接的情况下,当服务器将第二次的握手的信息发出去之后,默认连接已经创建,而且开辟空间资源等候接收数据。但如果第二次握手的信息丢包了呢,服务端认为二次握手已经完成,创建了连接,而客户端呢,由于什么也没有收到,以是会进行超时重传,当服务器又收到连接哀求,认为有新的客户端发起连接,于是同意连接哀求,并开辟空间资源等候接收数据,如果出现大量上述情况,便会造成服务端的崩溃。这种情况下,如果客户端重复地向服务端发送 SYN 哀求,也会造成服务端的 SYN 洪水。
这样 SYN 洪水攻击也就失效了,因为三次握手会让发出 SYN 的一方(即服务端)接收等量的 ACK 相应,而大部分情况下服务器的设置要比client高许多,以是如果双方在不停的以相同本钱进行消耗,那也肯定是client先扛不住,而不是server,以是单主机的情况下,client想要SYN洪水攻击服务器,这是不实际的!这样服务端就能负担最小程度的连接失败本钱。