三次握手和四次挥手

1:三次握手

      首先三次握手的目的是确认服务端和客户端都能确定对方的的接包和收包能力正常,然后服务器分配对应的链接资源。

      第一次客户端发包,服务器收包。客户端知道(客户端发包能力正常)服务端(客户端发包正常,服务端收包正常)。(一般不会附带数据,不分配资源)

      第二次服务器发包,客户端收包。客户端知道(服务端发包正常,客户端收包正常),服务端(服务端发包正常)。(一般不会附带数据,不分配资源)

      第三次客户端发包,服务端收包。 服务端知道(客户端收包正常)。 如果服务器开启半连接队列,此次失败会将链接放入半连接队列,直到重传机制失败将此次链接丢弃。(可以附带数据,分配服务器资源。这里可以成为SYN攻击点)

   SYN 攻击是一种典型的 DoS/DDoS 攻击。检测 SYN 攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击。在 Linux/Unix 上可以使用系统自带的 netstat 命令来检测 SYN 攻击。netstat -n -p TCP | grep SYN_RECV

常见的防御 SYN 攻击的方法有如下几种:

  • 缩短超时(SYN Timeout)时间
  • 增加最大半连接数
  • 过滤网关防护
  • SYN cookies技术

2:四次挥手

      建立一个连接需要三次握手,而终止一个连接要经过四次挥手(也有将四次挥手叫做四次握手的)。这是由于TCP的半关闭(half-close)造成的。所谓的半关闭,其实就是TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力。

     当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四次挥手。

  第一次 客户端发包,服务端接包。

  第二次 服务端发包,客户端接包。(此时客户端进入关闭等待,服务器进入关闭等待)

  第三次 服务端发包,客户端接包。(服务器关闭链接)

  第四次 客户端发包,服务器接包。(经过2最大报文时长,客户端关闭链接)

  报文在超过2最大报文时长就会丢弃,故第四次挥手完成后客户端会等待2最大报文时长后再关闭。

posted @ 2023-02-27 16:28  给香菜送点香菜  阅读(30)  评论(0)    收藏  举报