#加粗样式 三次握手协议中的面试题
三次握手是指客户端和服务器端之间建立一个TCP连接时,需要客户端和服务器总共发送三个包。
进行三次握手的主要作用就是为了确认通信双方的接收能力和发送能力是否正常,指定自己的初始化序列号,为后面的可靠性传送做准备。
实质上就是连接服务器的指定端口,建立TCP连接,并同步连接双方的序列号的确认号,交换TCP窗口大小信息。
三次握手过程:
第一次握手:客户端给服务端发送一个SYN报文,并指明客户端的初始化序列号ISN。此时客户端处于SYN_SENT状态
首部的同步位SYN=1,初始序列号seq = x, SYN = 1 的报文段不能懈怠数据,但要消耗掉一个程序号
第二次握手:服务器端接收到客户端的SYN报文之后,会以自己的SYN报文作为应答,并且也是指定了自己的初始化序列号ISN(s)。同时会把客户端的ISN+1作为ACK的值,表示自己已经收到了客户端的SYN,此时度武器处于SYN_RCVD的状态。
在确认报文段中SYN = 1,ACK = 1, 确认号ack = x+1, 初始序号seq = y。
第三次握手:客户端收到SYN报文之后,会发送一个ACK报文,当然,也是一样把服务器的ISN+1作为ACK的值,表示已经收到了服务器端的SYN报文,此时客户端处于ESTABLISHED状态,服务器端收到ACK报文之后,也处于ESTABLISHED状态,此时双方已经建立起了连接。
确认报文段ACK =1 , 确认号ack= y+1, 序号seq = x+1(初始为seq = x,第二个报文段所以要+1),ACK报文段可以携带数据,不携带数据则不消耗序号
答:在建立客户端与服务端之间的TCP连接时,双方互相发送网络包来确认双方都具有良好的接收能力和发送能力,之所以需要三次,是因为
第一次握手时,客户端向服务端发送网络包,服务端收到后,
得出结论:客户端发送功能、服务端接收功能是正常的
第二次握手时,服务端向客户端发送网络报确认收到报文,客户端接收。
得出结论:服务端发送功能、接收功能正常、客户端接收功能、发送功能正常。
但此时,服务端是不知道客户端的接收功能是否是正常的,因为没有返回信息来告诉它。
第三次握手时,客户端发包,服务端接收。
此时服务端得出结论,客户端的接收、发送功能正常,服务器自己的发送、接收功能正常。
最终经过三次握手协议,客户端与服务端才正式建立连接,双方都可以正常发送、接收信息。
服务器端第一次接收到客户端的SYN之后,就会处于SYN_RCVD状态(接收状态),此时双方还没有建立连接,服务器会把此种状态下的请求连接放在一个队列里,我们把这种队列称之为半连接队列(建立了一半连接)。
完成了三次握手的连接称之为全连接队列,建立起的连接就会放在全连接队列里面,如果满了的话,还会出现丢包现象。
补充:SYN-ACK重传次数的问题:
服务器发送完SYN-ACK包,如果未收到客户的确认包,服务器会进行首次重传,等待一段时间仍未收到确认包,进行第二次重传,如果重传次数超过系统设定的最大重传次数,系统会将该连接信息从半连接队列中删除。
一般每次重传等待的时间不一定相同,一般会呈指数增长,例如时间间隔为1s,2s,4s,8s…
首先ISN是不固定的,当一端为建立连接而发送它的SYN时,它为连接选择一个初始序号。ISN随时间而变化,因此每个连接都将具有不同的ISN。
ISN可以看做是一个32比特的计数器,每4ms加1,这样选择序号的目的在于防止在网络中被延迟的分组在以后又被传送,而导致某个连接的一方对它做错误的解释。
三次握手的其中一个重要功能是客户端和服务端交换ISN,以便让对方知道接下来接收数据的时候如何按序列号组装数据。如果ISN是固定的,攻击者很容易才出后续的确认号,因此ISN是动态生成的。
三次握手中是可以携带数据的,但是不能再第一次和第二次握手中携带,第三次握手中可以携带数据,
首先,如果第一次握手可以携带数据,要是有人恶意攻击服务器,他每次都在第一次握手中的SYN报文中放入大量的数据,因为攻击者根本就不理服务器的接收发送功能是否正常,然后疯狂重复发送SYN报文的话,服务器就会花费很长时间、内存空间来接收这些报文。
所以第一次是不可以放数据的,说简单点就是第一次握手会让服务器更容易受到攻击。而第三次的话,此时的客户端已经处于ECTABLISHED状态,对于客户端来说,他已经建立起了连接,并且也已经知道服务器的接收、发送功能是正常的了,所以ACK包就能携带数据也是可行的。
服务器端的资源分配是在二次握手时分配的,而客户端的资源时在完成三次握手时分配的,所以服务器容易受到SYN洪泛攻击。SYN攻击就是客户端在段时间诶大量伪造不存在的IP地址,并向服务器端不断发送SYN包,服务器端则一一回复确认包,并等待客户端确认,由于原地址并不存在,所以服务器端得不到回应就会不断重新发送直至超时,这些伪造的SYN包将长时间占用半连接队列,导致正常的SYN请求一位队列爆满而被丢弃,从而引发网络拥塞升职系统瘫痪。SYN攻击是一种典型的Dos/DDoS攻击。
常见的防御SYN攻击的方法有:
1、缩短超时事件
2、增大最大半连接数
3、过滤网关防护
4、SYN cookie技术