目录
1、介绍TCP连接的三次握手?追问:为什么TCP握手需要三次?
2、介绍TCP断开的四次挥手,追问:为什么TCP的挥手需要四次?
1、介绍TCP连接的三次握手?追问:为什么TCP握手需要三次?
第一次握手:客户端向服务端发送一个SYN同步标志位置1的数据包来,表明希望建立TCP连接;初始序列号为X,保存在包头的序列号字段里。
第二次握手:服务端收到数据包后,通过SYN的置位得知,这是一个建立TCP的请求;服务端会返回确认包(ACK),再次基础上,并将SYN同步标志位和ACK标志位均置1;确认序列号为X+1,表示收到了客户端的请求;而这个包的序列号为Y。
第三次握手:客户端收到服务端的回包,会再返回一个确认包,SYN标志位置0,ACK标志位置1,确认序列号为Y+1,表示已经收到服务器的回包。
原因:
从信息对等角度来看:通信双方只有确认4类信息才能建立连接,即我方的收和发能力与对端的收和发能力均正常。如果只有两次握手,站在客户端角度没有什么,但是服务端无法确定,自己的发送能力和对端的接收能力是否正常。因此需要第三次的确认。
从防止超时角度来看:如果只有两次握手,服务端发出的应答包,客户端到底收到没有,如果收到服务端也无从得知,如果没收到,服务端就需要重发,这就需要这个第三次握手来解决这个问题。
2、介绍TCP断开的四次挥手,追问:为什么TCP的挥手需要四次?
第一次断开:作为主动关闭连接的一方,客户端会发送一个FIN置位的数据包(其中头部的FIN位置为1,序列号为U)。
第二次断开:服务端收到客户端的断开请求,会回复一个ACK包,序列号为V,ACK确认号为U+1,其中ACK位置为1。
第三次断开:当服务端准备好断开后,会再次向客户端发送一个FIN置位的数据包,其中FIN位置为1,序列号为W。
第四次断开:客户端收到服务端的FIN置位的数据包后,会回复一个确认包(ACK包),其中确认号为W+1,序列号为U+1。
经过2MSL时间后关闭连接;被动关闭方收到主动关闭方的ACK后,关闭连接。
原因:
有了三次握手的基础,我们对四次挥手就不难理解,因为TCP要实现可靠的连接关闭,这里客户和服务器分别向对方发送了一个FIN包用来断链,但是为了告知对方本端顺利的收到了FIN包,会分别对这个FIN报文进行ACK的确认,这就需要四次断开来实现,少一次都不行。
3、TCP的SYN攻击的过程?追问:怎么防御?
利用TCP协议缺陷,攻击者向被攻击者的主机大量伪造的TCP请求连接,从而使被攻击者的服务器资源耗尽的攻击方式。也就是我们所熟知的DOS攻击。
防御:
网络终端对策:
1、增加TCP backlog队列
2、减少SYN-RECEIVED的时间
3、SYN 缓存
4、SYN cookie机制
基于网络的对策:
1、防火墙与代理
一个有防火墙或者代理的设备在网络中就能够通过两种方法缓冲SYN洪泛攻击,一种是对连接发起人伪装SYN-ACK包,另一种是对服务器伪装ACK包
如果连接发起人是合法的,防火墙/代理就会收到ACK,然后在它自己和服务器之间建立连接并伪装连接发起人的地址。防火墙/代理将连接双方分割开。这种分割能够抵御SYN洪泛攻击,因为服务器方根本没接受收过攻击者的SYN。只要防火墙/代理实现了一些基于TCP的防御策略,比如SYN cookies或SYN 缓存,他就能够保护所有在其后面的服务器免于SYN洪泛攻击。
另一种是响应SYN-ACK的伪装ACK包通过防火墙/代理到达服务器。这种伪装防止服务器的TCB一直停留在SYN-RECEIVED状态,因此保证了backlog队列中的空余空间。防火墙/代理将会停留等待一段时间,如果连接发起人正确的ACK没有被检测到,它将会通过伪装的TCP RET报文使服务器释放TCB。对合法的连接,数据包流能够在没有防火墙/代理的影响下继续进行。这种方法相比于上面伪装SYN-ACK的方法更具吸引力,因为当合法连接建立以后防火墙/代理不需要直接参与到连接中去。