苦练基本功-计算机网络基础-TCP建立连接
刚开始准备秋招的时候,我以为tcp建立连接只需要掌握三次握手就行了,但是在面试的过程中,发现仅仅知道这些是不够的。这里举一个我面拼多多的一个例子:
面试官:三次握手已经考烂了,我想问问如果第一次握手之后,客户端恶意不发送数据,服务端会发生什么?
我:会占用端口,直到连接reset才释放。
面试官:如果有很多个这样的恶意连接呢?
我:服务端大量端口被占用
面试官:这会导致什么问题?
我:其它正常的tcp连接无法建立了。
面试官:服务端拒绝服务了,所以这就是一种Dos攻击手段,那么你觉得该怎么解决这个问题?
我:(开始紧张,想了半天)建立黑名单
面试官:你了解SYN cookie吗?
我:。。。没听说过
…
所以我后面的学习,不仅仅是看三次握手了,因为这个层面不足以拿到好的后端offer,下面我就自己学习的内容进行整理归纳,如果大家还有补充的,可以评论告诉我。
三次握手
为什么三次握手?两次握手不行吗?
这是老生常谈的问题了,防止失效的SYN又到达服务端建立了连接。
三次握手可以发送数据吗?
前两次不可以发送数据,第三次可以发送数据。
这个也很好理解,前两次压根儿就没有建立起连接,发送数据没什么意义。
三次握手还做了什么事?
确定MSS(Maximum Segment Size),MSS受数据链路层的MTU的影响,不同网络是不一样的,所以事先在建立连接的时候进行沟通,告知对方自己的MSS,然后取较小值。
什么是半连接队列,全连接队列
当服务端收到SYN,会把该连接放到一个队列里,并为其分配资源(数据缓冲区),这个队列就叫半连接队列。
当服务端收到客户端的ACK时,而且全队列未满时,会从半连接队列取出对应的连接,放入另一个队列,这个队列是已建立连接的队列。
其中队列的长度是有相应的参数可以设置。
什么是SYN洪泛攻击
上面面试谈到的Dos攻击就是SYN攻击,简单来说就是发送SYN之后,不发送数据,恶意消耗服务端资源,导致服务端无法服务正常的请求。
如何防范SYN攻击
使用SYN cookie。
具体步骤就是,当服务端收到客户端的SYN,不要立马分配资源,先按照源IP+源端口+目的IP+目的端口来生成一个cookie,然后作为序号发给客户端,如果客户端回应了,并且ack减去1,解析出来的ip和端口是对的,那就没有问题了,这时再分配资源。