mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-06-16 18:10:13 +08:00
commit
dcf75dd39e
@ -93,7 +93,62 @@
|
|||||||
|
|
||||||
> SYN 同步序列编号(Synchronize Sequence Numbers) 是 TCP/IP 建立连接时使用的握手信号。在客户机和服务器之间建立正常的 TCP 网络连接时,客户机首先发出一个 SYN 消息,服务器使用 SYN-ACK 应答表示接收到了这个消息,最后客户机再以 ACK(Acknowledgement)消息响应。这样在客户机和服务器之间才能建立起可靠的 TCP 连接,数据才可以在客户机和服务器之间传递。
|
> 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 attack,DoS 攻击)也被称为**洪水攻击**,原理就是上面提到的 SYN 攻击。其目的就像它的名字一样,通过 SYN 攻击使目标服务器资源耗尽,让服务器无法正常提供服务,导致用户无法正常访问。
|
||||||
|
|
||||||
|
**分布式拒绝服务攻击**(distributed denial-of-service attack,DDoS 攻击),其概念为攻击者控制两台包括两台以上的电脑向目标发起 DoS攻击。
|
||||||
|
|
||||||
|
网上有一个关于 DDoS 的比喻十分生动:
|
||||||
|
|
||||||
|
我们可以想象大城市堵车的情景,当公路的交通状况很差时,你需要在路上耗费很长的时间,此时公路的交通情况就妨碍了你到达目的地。
|
||||||
|
|
||||||
|
与此相对应,我们把公路看作用户通往服务器的网络通道,公路上的车看作攻击者攻击的服务器的工具,用户此时就是公路上的一辆车。
|
||||||
|
|
||||||
|
如果道路很少车(网络通畅),我们就可以迅速通过这段路(网站快速反应);如果道路很多车,变得很拥挤(网络拥塞),那么我们需要花费比平常更多得时间通过这段路(网站响应时间边长);如果有人制造交通事故导致大塞车(DDoS攻击),那么我们可能无法通过这段路(网站几乎瘫痪)。
|
||||||
|
|
||||||
|
### 2.4 为什么要四次挥手
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user