引言
- TCP 创建链接与断开链接的过程
- TCP 泛洪攻击(TCP 创建链接过程当中的攻击手段)与防御
TCP 创建链接与断开链接的过程
TCP 三次握手(链接过程)
第一次握手前端
客户端向服务端发送链接请求报文段。该报文段中包含自身的数据通信初始序号。请求发送后,客户端便进入 SYN-SENT 状态。git
第二次握手github
服务端收到链接请求报文段后,若是赞成链接,则会发送一个应答,该应答中也会包含自身的数据通信初始序号,发送完成后便进入 SYN-RECEIVED 状态。面试
第三次握手算法
当客户端收到链接赞成的应答后,还要向服务端发送一个确认报文。客户端发完这个报文段后便进入 ESTABLISHED 状态,服务端收到这个应答后也进入 ESTABLISHED 状态,此时链接创建成功。服务器
为何须要三次握手,2次不行吗?cookie
喂喂喂,我是A,你听的到吗? B:在在在,我能听到,我是B,你能听到我吗? A:(听到了,老子不想理你) B:喂喂喂?听不听到?我X,对面死了,我挂了。。网络
若是只有 2 次的话,B 并不清楚 A 是否收到他发过去的信息。url
TCP 四次挥手(断开连接)
第一次挥手操作系统
若客户端 A 认为数据发送完成,则它须要向服务端 B 发送链接释放请求。
第二次挥手
B 收到链接释放请求后,会告诉应用层要释放 TCP 连接。而后会发送 ACK 包,并进入 CLOSE_WAIT 状态,此时代表 A 到 B 的链接已经释放,再也不接收 A 发的数据了。可是由于 TCP 链接是双向的,因此 B 仍旧能够发送数据给 A。
第三次挥手
B 若是此时还有没发完的数据会继续发送,完毕后会向 A 发送链接释放请求,而后 B 便进入 LAST-ACK 状态。
PS:经过延迟确认的技术(一般有时间限制,不然对方会误认为须要重传),能够将第二次和第三次握手合并,延迟 ACK 包的发送。
第四次挥手
A 收到释放请求后,向 B 发送确认应答,此时 A 进入 TIME-WAIT 状态。该状态会持续 2MSL(最长报文段寿命,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有 B 的重发请求的话,就进入 CLOSED 状态。当 B 收到确认应答后,也便进入 CLOSED 状态。
SYN 泛洪攻击
咱们已经知道,TCP 只有通过三次握手才能链接,而 SYN 泛洪攻击就是针对 TCP 握手过程进行攻击:
-
攻击者发送大量的 SYN 包给服务器(第一次握手成功)
-
服务器回应(SYN + ACK)包(第二次握手成功)
-
可是攻击者不回应 ACK 包(第三次握手不进行)
致使服务器存在大量的半开链接,这些半链接能够耗尽服务器资源,使被攻击服务器没法再响应正常 TCP 链接,从而达到攻击的目的
幸运的是,一种称为 SYN cookie 的有效防护如今已部署在大多数主要的操做系统中:
- 在客户端发送 SYN 报文给服务器(第一次握手),服务端收到链接请求报文段后,服务器不会为此SYN建立半开链接,而是生成一个序列号(所谓的 cookie)一块儿发送给客户端(第二次握手),在这个阶段,服务器不会为该链接分配任何资源
- 客户端返回 ACK 报文给服务器(第三次握手),服务器会验证这个 cookie 值,只有验证成功才建立 TCP 链接,分配资源
- 若是客户端没有返回 ACK 报文给服务器,也不会对服务器形成任何的伤害,由于服务器没有分配任何资源给它