此为面经第六谈!可以关注我,每日带你深入浅出一个新面经。
我们要了解面经要如何“说”!
很重要!很重要!很重要!
我们通常采取总-分-总方式来阐述!(有些知识点,你可以去了解,但是面经并不是需要全部了解的)
码农不易,各位学者学到东西请点赞支持支持!
开始部分(半打开状态):
总:半打开状态是处于TCP三次握手过程中发生的,服务端准备好接收数据,但连接尚未完全建立。
分:
结合三次握手流程图更好理解:
它是通过半连接队列(SYN队列)用来存储半打开状态的连接(SYN队列又是通过hash表来实现的)。
当服务端收到客户端第三次握手的ACK包后,连接建立成功:该连接会在SYN队列中移除、并把该连接加入到全连接队列(accept队列)中。
如果客户端收到SYN+ACK包(第二次握手),但不回复ACK包:这种情况就会引起SYN泛洪,也出称SYN攻击,DDos攻击。
那我们要如何防御SYN泛洪呢?
我们需要了解一个机制:syncookies。它的原理很简单,直接绕过SYN队列的情况下进行建立连接。当客户端接收到SYN包后,返回SYN cookies给客户端,然后客户端会发送ACK包和cookies,与服务器进行匹配,成功后就加入全连接队列当中。
那么我要有三种方式来防御SYN泛洪:
1.直接增大半连接队列。
2.减少SYN+ACK包的重传次数,这样占用SYN队列的资源的时间就不会太久了。
3.开启syncookies机制。
总:半打开状态主要目的就是牵扯到SYN泛洪,我们要学会如何防御这种情况。
开始部分(半关闭状态):
总:半关闭状态处于四次挥手的过程中,连接的一方已经关闭了自己到另一方的数据传输方向,但另一方仍然可以继续发送数据。
分:
结合四次挥手流程图更好理解:
当服务端收到FIN包,进入CLOSE_WAIT状态,但依然可以向客户端发送数据,这就将FIN包的控制权交给应用层处理。
而服务端FIN包发送的方式有两种:close:服务端关闭读写端口,服务端在CLOSE_WAIT状态下发送数据,客户端(发现服务端的读写端口已关闭无法回复ACK包)将回复RST包,异常结束连接(快速终止连接状态);
shutdown:服务端只关闭写通道,服务端在CLOSE_WAIT状态下发送数据,客户端将回复ACK包。
总:主要是了解服务端的FIN包发送的两种方法。