一、TCP三次握手建立过程图

TCP三次握手

二、结合Wireshark说明

当X和Y的值太大,Wireshark提供了一个功能——把Seq和Ack的初始值都置为0。启用方式:单击【Edit】-【Preferences】-【TCP】-【Relative Sequence Numbers】。

三、TCP三次握手失败原因

握手失败一般分为两种:被拒绝或丢包。一般通过两道过滤表达式就可以定位出大多数失败的握手。

3.1 表达式1-(tcp.flags.reset ==1)&&(tcp.seq ==1)

表面意思是:过滤出Seq号为1,且含有Reset的标志的包。在启用Relative Sequence Numbers的情况下,这往往表示握手请求被对方拒绝了。接下来,右键选中过滤的包,再点击【Follow TCP Stream】就可以把失败的全过程显示出来。

3.2 表达式2-(tcp.flags.syn ==1)&&(tcp.analysis.retransmission)

表面意思是:过滤出重传的握手请求,之所以重传,是因为对方没收到,或者对方回复的确认包丢失了。接下来,右键选中过滤的包,再点击【Follow TCP Stream】就可以把失败的全过程显示出来。

3.3 其他

最快排查出根本原因的技巧:一般在客户端和服务器端同时抓包,这样做的目的是防止客户端和服务器端同时发生丢包情况。

四、拓展

DDos的形式有很多,其中最流行就是SYN flood。

4.1 SYN flood

4.1.1 原理

从大量主机发送SYN请求给服务器,假装要建立TCP连接。这些SYN请求可能含有假的源地址,所以服务器响应后永远收不到ACK,就会留下half-open状态的TCP连接。由于每个TCP连接会消耗一定的系统资源,如果攻击足够猛烈,此类连接越建越多,服务器的资源就会被耗光,真正的用户访问也会被拒绝。

4.1.2 Wireshark相关操作

如果SYN干扰包太多,点击【Analyze】-【Expert Information】看到SYN的总数量统计。

4.1.3 防护措施

1、cookie源认证:原理是syn报文首先由DDOS防护系统来响应syn_ack。带上特定的sequence number (记为cookie)。真实的客户端会返回一个ack 并且Acknowledgment number 为cookie+1。 而伪造的客户端,将不会作出响应。这样我们就可以知道那些IP对应的客户端是真实的,将真实客户端IP加入白名单。下次访问直接通过,而其他伪造的syn报文就被拦截。 2、reset认证:Reset认证利用的是TCP协议的可靠性,也是首先由DDOS防护系统来响应syn。防护设备收到syn后响应syn_ack,将Acknowledgement number (确认号)设为特定值(记为cookie)。当真实客户端收到这个报文时,发现确认号不正确,将发送reset报文,并且sequence number 为cookie + 1。而伪造的源,将不会有任何回应。这样我们就可以将真实的客户端IP加入白名单。