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 地址。