1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-16 18:10:13 +08:00

Merge pull request #1233 from Holdonbei/master

更新三次握手的原因以及SYNDDoS攻击的原理
This commit is contained in:
Guide哥 2021-06-10 22:02:36 +08:00 committed by GitHub
commit dcf75dd39e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -93,7 +93,62 @@
> SYN 同步序列编号(Synchronize Sequence Numbers) 是 TCP/IP 建立连接时使用的握手信号。在客户机和服务器之间建立正常的 TCP 网络连接时,客户机首先发出一个 SYN 消息,服务器使用 SYN-ACK 应答表示接收到了这个消息,最后客户机再以 ACK(Acknowledgement消息响应。这样在客户机和服务器之间才能建立起可靠的 TCP 连接,数据才可以在客户机和服务器之间传递。
### 2.5 为什么要四次挥手
#### 2.3.1 三次握手的原因?
一般来说,这种问题我们可以使用反证法来说明 TCP 为什么要进行三次握手。
* 如果只有两次握手,我们来看看会发生什么事情。
正常情况下TCP 连接建立之后,默认保持长连接。如果只有两次握手,情况就是:
第一次握手Client 发送 SYN 请求连接。Client 进入SYN-SENT 状态
第二次握手Server 回发 ACK、SYN 报文。确认连接。**Server 由 LISTEN 状态进入 ESTABLISHED 状态**
到这里我们看到Server 只要接收到 SYN 报文 且回发 ACK、SYN 报文后,就建立了连接。
正常情况下我们这么考虑是没有问题的但网络环境十分复杂Client 第一次发送的连接请求报文段可能会在这次连接已经释放(结束)后才到达 Server。显然这是一个已经失效的连接但由于两次握手机制Server 认可这个连接请求,所以 Server 会再一次建立连接。
连接建立之后,由于 Client 已经结束了之前的连接,因此 Server 后面发过来的连接请求Client是不管的最终 Server 只能白白维持这次连接(多次重传无效后才发送 RST 报文,断开连接),造成资源的浪费。
* 有没有必要四次握手呢?
结论是,没有必要进行四次握手。原因如下:
1. 有过抓包经验的小伙伴应该直到,**TCP 握手的前两次TCP 头部的长度一般都是32字节固定头部20字节选项部分12字节且数据部分的长度都为0**这个阶段。TCP 涉及的拥塞控制、流量控制等需要的信息比如序号Seq、窗口信息等都会在前两次握手中交换。
2. 使用第三次握手的主要原因就是为了避免 Server 一直等待,浪费资源。
综上,我们没有必要再添加多一次握手,增加建立连接的成本。
#### 2.3.2 什么是 SYN 攻击?
我们重新看一下三次握手的过程:
第一次握手: Client 向 Server 发送连接请求。
第二次握手Server 接收到 Client 的连接请求,向 Client 发送 SYN + ACK 报文。同时 Server 进入 SYN_RCVD 状态。
第三次握手Client 返回 ACK 报文以确认收到 Server 的报文,确认通信。
第二次握手与第三次握手之间, Server 此时开启了新的端口等待 Client 的响应,这个 Server 在等待 Client 响应的状态被称为**半开连接状态**。
攻击者可以利用半开连接状态对服务器进行攻击,这种攻击称为 SYN 攻击。
#### 2.3.3 什么是 DDoS 攻击?
首先,**拒绝服务攻击**denial-of-service attackDoS 攻击)也被称为**洪水攻击**,原理就是上面提到的 SYN 攻击。其目的就像它的名字一样,通过 SYN 攻击使目标服务器资源耗尽,让服务器无法正常提供服务,导致用户无法正常访问。
**分布式拒绝服务攻击**distributed denial-of-service attackDDoS 攻击),其概念为攻击者控制两台包括两台以上的电脑向目标发起 DoS攻击。
网上有一个关于 DDoS 的比喻十分生动:
我们可以想象大城市堵车的情景,当公路的交通状况很差时,你需要在路上耗费很长的时间,此时公路的交通情况就妨碍了你到达目的地。
与此相对应,我们把公路看作用户通往服务器的网络通道,公路上的车看作攻击者攻击的服务器的工具,用户此时就是公路上的一辆车。
如果道路很少车网络通畅我们就可以迅速通过这段路网站快速反应如果道路很多车变得很拥挤网络拥塞那么我们需要花费比平常更多得时间通过这段路网站响应时间边长如果有人制造交通事故导致大塞车DDoS攻击那么我们可能无法通过这段路网站几乎瘫痪
### 2.4 为什么要四次挥手
![TCP四次挥手](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019/7/TCP四次挥手.png)