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