TCP
TCP连接¶
报文格式¶
三次握手¶
服务端的TCP进程先创建传输控制块TCB,准备接受客户端进程的连接请求,然后服务端进程处于LISTEN状态,等待客户端的连接请求,如有,则作出响应
- 客户端的TCP进程也首先创建传输控制模块TCB,然后向服务端发出连接请求报文段,该报文段首部中的SYN=1,ACK=0,同时选择一个初始序号seq=i。 TCP规定,SYN=1的报文段不能携带数据,但要消耗掉一个序号。这时,TCP客户进程进入SYN—SENT(同步已发送)状态,这是TCP连接的第一次握手
- 服务端收到客户端发来的请求报文后,如果同意建立连接,则向客户端发送确认。确认报文中的SYN=1,ACK=1,确认号ack=i+1,同时为自己选择一个初始序号seq=j。同样该报文段也是SYN=1的报文段,不能携带数据,但同样要消耗掉一个序号。这时,TCP服务端进入SYN—RCVD(同步收到)状态,这是TCP连接的第二次握手
- TCP客户端进程收到服务端进程的确认后,还要向服务端给出确认。确认报文段的ACK=1,确认号ack=j+1,而自己的序号为seq=i+1。TCP的标准规定,ACK报文段可以携带数据,但如果不携带数据则不消耗序号,因此,如果不携带数据,则下一个报文段的序号仍为seq=i+1。这时,TCP连接已经建立,客户端进入ESTABLISHED(已建立连接)状态。这是TCP连接的第三次握手,可以看出第三次握手客户端已经可以发送携带数据的报文段了
- 当服务端收到确认后,也进入ESTABLISHED(已建立连接)状态
四次挥手¶
数据传输结束后,通信的双方都可以释放连接,并停止发送数据。假设现在客户端和服务端都处于ESTABLISHED状态
- 客户端A的TCP进程先向服务端发出连接释放报文段,并停止发送数据,主动关闭TCP连接。释放连接报文段中FIN=1,序号为seq=u,该序号等于前面已经传送过去的数据的最后一个字节的序号加1。这时,A进入FIN—WAIT-1(终止等待1)状态,等待B的确认。TCP规定,FIN报文段即使不携带数据,也要消耗掉一个序号。这是TCP连接释放的第一次挥手
- B收到连接释放报文段后即发出确认释放连接的报文段,该报文段中,ACK=1,确认号为ack=u+1,其自己的序号为v,该序号等于B前面已经传送过的数据的最后一个字节的序号加1。然后B进入CLOSE—WAIT(关闭等待)状态,此时TCP服务器进程应该通知上层的应用进程,因而A到B这个方向的连接就释放了,这时TCP处于半关闭状态,即A已经没有数据要发了,但B若发送数据,A仍要接受,也就是说从B到A这个方向的连接并没有关闭,这个状态可能会持续一些时间。这是TCP连接释放的第二次挥手
- A收到B的确认后,就进入了FIN—WAIT(终止等待2)状态,等待B发出连接释放报文段,如果B已经没有要向A发送的数据了,其应用进程就通知TCP释放连接。这时B发出的链接释放报文段中,FIN=1,确认号还必须重复上次已发送过的确认号,即ack=u+1,序号seq=w,因为在半关闭状态B可能又发送了一些数据,因此该序号为半关闭状态发送的数据的最后一个字节的序号加1。这时B进入LAST—ACK(最后确认)状态,等待A的确认,这是TCP连接的第三次挥手
- A收到B的连接释放请求后,必须对此发出确认。确认报文段中,ACK=1,确认号ack=w+1,而自己的序号seq=u+1,而后进入TIME—WAIT(时间等待)状态。这时候,TCP连接还没有释放掉,必须经过时间等待计时器设置的时间2MSL后,A才进入CLOSED状态,时间MSL叫做最长报文寿命,RFC建议设为2分钟,因此从A进入TIME—WAIT状态后,要经过4分钟才能进入到CLOSED状态,而B只要收到了A的确认后,就进入了CLOSED状态。二者都进入CLOSED状态后,连接就完全释放了,这是TCP连接的第四次挥手
DDoS¶
SYN Flood¶
TCP三次握手协议中,服务器收到SYN后会处于SYN_RECV状态,预留资源准备建立连接,而服务器资源有限,可以维护的SYN_RECV状态超过极限后就不再接受新的SYN包。攻击者伪造大量IP地址发送SYN包,使得服务器资源被占满,正常用户无法建立连接
DNS Flood¶
DNS基于不可靠、无连接的UDP服务,使用UDP的应用包括域名系统、视频流、IP语音等
DNS协议构建在UDP协议之上,是一问一答的形式,DNS是一个多级缓存结构
Client向server发起解析www.bac.com的IP地址的请求,server上没有该服务器;向.com的DNS Server服务器查询,该服务器返回www.bai.com的DNS Server的IP;server向该服务器获取到www.abc.com的IP地址,在本地进行缓存
UDP攻击源IP随机伪造难以追查,协议越上层,涉及的服务越多,越难以防御
- 例如攻击者可以伪造域名来引发server的大量查询
- 小带宽反射攻击: 发送大量模拟网吧用户的DNS请求,DNS会回应给被攻击者,由于DNS的回应和请求比例很悬殊,4M的请求可以引发100M的回应
HTTP Flood¶
HTTP 超文本传输协议,是一个基于TCP/IP的应用层协议,默认使用80端口
HTTPS 安全为目标的HTTP通道,在HTTP层下加入SSL层,HTTPS的安全基础是SSL,TLS是SSL新一代协议
客户端发起请求,客户端验证服务器的证书,利用服务器的公钥进行加密传输
CC攻击是HTTP Flood的一种
- CC攻击一,普通的HTTP Flood,利用代理服务器向网站发送大量HTTP Get服务请求,主要请求动态页面,设计到数据库访问等操作,使得服务器无法响应正常请求
- CC攻击二,代理发起的HTTP Flood,攻击者向代理服务器发送请求,使代理服务器向受害者发起请求
- 僵尸网络发起的HTTP Flood,破坏性更大,发出的攻击更加真实和复杂,黑客可自定义的类型更加复杂
CC攻击为什么难防
对于攻击
- CC攻击来的IP都是真实而分散的
- CC攻击的数据包全部是正常数据包
- CC攻击的请求,全部是有效的请求,无法拒绝的请求
对于业务
- 封IP可能影响正常访问用户的IP
- 要么挑战、要么限速
- 客户体验与终端误判,是CC攻击的防御难点
80和443是HTTP和HTTPS的默认端口
传统应用层防护原理
验证码
浏览器向服务端发送请求->服务端不直接返回数据,而是提一个问题给客户端->客户端进行应答->服务端返回重定向,允许客户端访问正常资源
移动APP防护难点
移动APP支持HTTP并不完整,很多请求协议无法做响应