跳转至

TCP

TCP连接

报文格式

三次握手

服务端的TCP进程先创建传输控制块TCB,准备接受客户端进程的连接请求,然后服务端进程处于LISTEN状态,等待客户端的连接请求,如有,则作出响应

  1. 客户端的TCP进程也首先创建传输控制模块TCB,然后向服务端发出连接请求报文段,该报文段首部中的SYN=1,ACK=0,同时选择一个初始序号seq=i。 TCP规定,SYN=1的报文段不能携带数据,但要消耗掉一个序号。这时,TCP客户进程进入SYN—SENT(同步已发送)状态,这是TCP连接的第一次握手
  2. 服务端收到客户端发来的请求报文后,如果同意建立连接,则向客户端发送确认。确认报文中的SYN=1,ACK=1,确认号ack=i+1,同时为自己选择一个初始序号seq=j。同样该报文段也是SYN=1的报文段,不能携带数据,但同样要消耗掉一个序号。这时,TCP服务端进入SYN—RCVD(同步收到)状态,这是TCP连接的第二次握手
  3. TCP客户端进程收到服务端进程的确认后,还要向服务端给出确认。确认报文段的ACK=1,确认号ack=j+1,而自己的序号为seq=i+1。TCP的标准规定,ACK报文段可以携带数据,但如果不携带数据则不消耗序号,因此,如果不携带数据,则下一个报文段的序号仍为seq=i+1。这时,TCP连接已经建立,客户端进入ESTABLISHED(已建立连接)状态。这是TCP连接的第三次握手,可以看出第三次握手客户端已经可以发送携带数据的报文段了
  4. 当服务端收到确认后,也进入ESTABLISHED(已建立连接)状态

四次挥手

数据传输结束后,通信的双方都可以释放连接,并停止发送数据。假设现在客户端和服务端都处于ESTABLISHED状态

  1. 客户端A的TCP进程先向服务端发出连接释放报文段,并停止发送数据,主动关闭TCP连接。释放连接报文段中FIN=1,序号为seq=u,该序号等于前面已经传送过去的数据的最后一个字节的序号加1。这时,A进入FIN—WAIT-1(终止等待1)状态,等待B的确认。TCP规定,FIN报文段即使不携带数据,也要消耗掉一个序号。这是TCP连接释放的第一次挥手
  2. B收到连接释放报文段后即发出确认释放连接的报文段,该报文段中,ACK=1,确认号为ack=u+1,其自己的序号为v,该序号等于B前面已经传送过的数据的最后一个字节的序号加1。然后B进入CLOSE—WAIT(关闭等待)状态,此时TCP服务器进程应该通知上层的应用进程,因而A到B这个方向的连接就释放了,这时TCP处于半关闭状态,即A已经没有数据要发了,但B若发送数据,A仍要接受,也就是说从B到A这个方向的连接并没有关闭,这个状态可能会持续一些时间。这是TCP连接释放的第二次挥手
  3. A收到B的确认后,就进入了FIN—WAIT(终止等待2)状态,等待B发出连接释放报文段,如果B已经没有要向A发送的数据了,其应用进程就通知TCP释放连接。这时B发出的链接释放报文段中,FIN=1,确认号还必须重复上次已发送过的确认号,即ack=u+1,序号seq=w,因为在半关闭状态B可能又发送了一些数据,因此该序号为半关闭状态发送的数据的最后一个字节的序号加1。这时B进入LAST—ACK(最后确认)状态,等待A的确认,这是TCP连接的第三次挥手
  4. 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连接的第四次挥手

TIME_WAIT深入介绍


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的一种

  1. CC攻击一,普通的HTTP Flood,利用代理服务器向网站发送大量HTTP Get服务请求,主要请求动态页面,设计到数据库访问等操作,使得服务器无法响应正常请求
  2. CC攻击二,代理发起的HTTP Flood,攻击者向代理服务器发送请求,使代理服务器向受害者发起请求
  3. 僵尸网络发起的HTTP Flood,破坏性更大,发出的攻击更加真实和复杂,黑客可自定义的类型更加复杂

CC攻击为什么难防

对于攻击

  1. CC攻击来的IP都是真实而分散的
  2. CC攻击的数据包全部是正常数据包
  3. CC攻击的请求,全部是有效的请求,无法拒绝的请求

对于业务

  1. 封IP可能影响正常访问用户的IP
  2. 要么挑战、要么限速
  3. 客户体验与终端误判,是CC攻击的防御难点

80和443是HTTP和HTTPS的默认端口

传统应用层防护原理

验证码

浏览器向服务端发送请求->服务端不直接返回数据,而是提一个问题给客户端->客户端进行应答->服务端返回重定向,允许客户端访问正常资源

移动APP防护难点

移动APP支持HTTP并不完整,很多请求协议无法做响应