TCP和UDP的区别
- TCP 是面向连接的、可靠的字节流协议,通过TCP机制保证连接和数据传输是可靠的。
- UDP 相对于TCP是不具有可靠性的数据报协议,它虽然保证数据在发送时的顺序,但不保证数据的到达。
三次握手和四次分手
- 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
- 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
- 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
半连接
- 在三次握手过程中,服务器发送SYN-ACK之后,收到客户端的ACK之前的TCP连接称为半连接(half-open connect).此时服务器处于Syn_RECV状态.当收到ACK后,服务器转入ESTABLISHED状态.
半连接队列
- 在三次握手协议中,服务器维护一个半连接队列,存放半连接。该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的ACK确认包。这些条目所标识的连接在服务器处于Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。
Backlog参数
- 表示半连接队列的最大容纳数目。
SYN-ACK 重传次数
- 服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。
为什么需要TIME_WAIT?
- 为了确保服务端的数据完全传输给了客户端
- 为了确保两端能完全关闭连接。
- 为了确保后续的连接不会收到“脏数据”
TIME_WAIT 会导致什么问题
新建连接失败
- TIME_WAIT到CLOSED,需要2MSL=60s的时间。这个时间非常长。每个连接在业务结束之后,需要60s的时间才能完全释放。如果业务上采用的是短连接的方式,会导致非常多的TIME_WAIT状态的连接,会占用一些资源,主要是本地端口资源。
TIME_WAIT条目超出限制
- 这个限制,是由一个内核参数控制的:
sysctl net.ipv4.tcp_max_tw_buckets
net.ipv4.tcp_max_tw_buckets = 5000
超出了这个限制会报一条INFO级别的内核日志,然后继续关闭掉连接。并没有什么特别大的影响,只是增加了刚才提到的收到脏数据的风险而已。
- 这个限制,是由一个内核参数控制的:
SYN攻击
- SYN攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。
- SYN攻击利用TCP协议三次握手的原理,大量发送伪造源IP的SYN包也就是伪造第一次握手数据包,服务器每接收到一个SYN包就会为这个连接信息分配核心内存并放入半连接队列,如果短时间内接收到的SYN太多,半连接队列就会溢出,操作系统会把这个连接信息丢弃造成不能连接,当攻击的SYN包超过半连接队列的最大值时,正常的客户发送SYN数据包请求连接就会被服务器丢弃。目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。每种操作系统半连接队列大小不一样所以抵御SYN攻击的能力也不一样。
- Syn攻击是一个典型的DOS攻击。检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击.在Linux下可以如下命令检测是否被Syn攻击
- netstat -n -p TCP | grep SYN_RECV
解决方法
- 封IP
- 缩短超时时间
- syn cookies
TCP全连接攻击
- 这种攻击是为了绕过常规防火墙的检查而设计的,一般情况下,常规防火墙大多具备syn cookies或者syn proxy能力,能够有效应对伪造的IP攻击,但对于正常的TCP连接是放过的。但殊不知很多网络服务程序能接受的TCP连接数是有限的,一旦有大量的TCP连接,即便是正常的,也会导致网站访问非常缓慢甚至无法访问,正所谓“多情总被无情伤”。TCP全连接攻击就是通过许多僵尸主机不断地与受害服务器建立大量的TCP连接,直到服务器的内存等资源被耗尽而被拖跨,从而造成拒绝服务,这种攻击的特点是可绕过一般防火墙的防护而达到攻击目的。
TCP混乱数据包攻击
- TCP混乱数据包攻击与Syn Flood攻击类似,发送伪造源IP的TCP数据包,只不过TCP头的TCP Flags部分是混乱的,可能是syn,ack,syn+ack,syn+rst等等,会造成一些防护设备处理错误锁死,消耗服务器CPU内存的同时还会堵塞带宽,在迷惑对手的时候施展最后的致命一击。
UDP Flood攻击
- UDP Flood是日渐猖獗的流量型DOS攻击,原理也很简单。常见的情况是利用大量UDP小包冲击DNS服务器或Radius认证服务器、流媒体视频服务器。100k PPS的UDP Flood经常将线路上的骨干设备例如防火墙打瘫,造成整个网段的瘫痪。由于UDP协议是一种无连接的服务,在UDP FLOOD攻击中,攻击者可发送大量伪造源IP地址的小UDP包。但是,由于UDP协议是无连接性的,所以只要开了一个UDP的端口提供相关服务的话,那么就可针对相关的服务进行攻击。
DNS Flood攻击
- UDP DNS Query Flood攻击实质上是UDP Flood的一种,但是由于DNS服务器的不可替代的关键作用,一旦服务器瘫痪,影响一般都很大。UDP DNS Query Flood攻击采用的方法是向被攻击的服务器发送大量的域名解析请求,通常请求解析的域名是随机生成或者是网络世界上根本不存在的域名,被攻击的DNS服务器在接收到域名解析请求的时候首先会在服务器上查找是否有对应的缓存,如果查找不到并且该域名无法直接由服务器解析的时候,DNS服务器会向其上层DNS服务器递归查询域名信息。根据微软的统计数据,一台DNS服务器所能承受的动态域名查询的上限是每秒钟9000个请求。而我们知道,在一台PC机上可以轻易地构造出每秒钟几万个域名解析请求,足以使一台硬件配置极高的DNS服务器瘫痪,由此可见DNS服务器的脆弱性。
CC攻击
- CC攻击(Challenge Collapsar)是DDOS攻击的一种,是利用不断对网站发送连接请求致使形成拒绝服务的攻击。相比其它的DDOS攻击,CC攻击是应用层的,主要针对网站。CC主要是用来攻击页面的,CC就是模拟多个用户(少线程就是多少用户)不停地进行访问那些需要大量数据操作(就是需要大量CPU时间)的页面,造成服务器资源的浪费,CPU长时间处于100%,永远都有处理不完的连接直至就网络拥塞,正常的访问被中止。
- 这种攻击主要是针对存在ASP、JSP、PHP、CGI等脚本程序,并调用MSSQL Server、MySQLServer、Oracle等数据库的网站系统而设计的,特征是和服务器建立正常的TCP连接,并不断的向脚本程序提交查询、列表等大量耗费数据库资源的调用,典型的以小博大的攻击方法。这种攻击的特点是可以完全绕过普通的防火墙防护,轻松找一些Proxy代理就可实施攻击,缺点是对付只有静态页面的网站效果会大打折扣,并且有些Proxy会暴露攻击者的IP地址。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。