本文会围绕,从三次握手和四次挥手相关的一系列核心问题,分享如何更准确回答和应对常见的面试问题,以后面对再刁钻的面试官,你都可以随意地跟他扯皮了。
tcp全称为transmission control protocol(传输控制协议),是一种面向连接的、可靠的、基于字节流的传输层通信协议。tcp是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。
tcp的三次握手和四次挥手,可以说是老生常谈的经典问题了,通常也作为各大公司常见的面试考题,具有一定的水平区分度。看似简单的面试问题。如果你的回答不符合面试官期待的水准,有可能就直接凉凉了。
本文会围绕,从三次握手和四次挥手相关的一系列核心问题,分享如何更准确回答和应对常见的面试问题,以后面对再刁钻的面试官,你都可以随意地跟他扯皮了
三次握手: 服务端新建套接字,绑定地址信息后开始监听,进入listen状态。客户端新建套接字绑定地址信息后调用connect,发送连接请求syn,并进入syn_sent状态,等待服务器的确认。服务端一旦监听到连接请求,就会将连接放入内核等待队列中,并向客户端发送syn和确认报文段ack,进入syn_recd状态。客户端收到syn+ack报文后向服务端发送确认报文段ack,并进入established状态,开始读写数据。服务端一旦收到客户端的确认报文,就进入established状态,就可以进行读写数据了
答:两次不安全,四次没必要。tcp通信需要确保双方都具有数据收发的能力,得到ack响应则认为对方具有数据收发的能力,因此双方都要发送syn确保对方具有通信的能力。
答:第一次、第二次握手不可以携带数据,而第三次握手是可以携带数据的。假设第一次可以携带数据,如果有人恶意攻击服务器,每次都在第一次握手中的syn报文放入大量数据,重复发送大量syn报文,此时服务器会花费大量内存空间来缓冲这些报文,服务器就更容易被攻击了。
答:握手失败的原因有两种,第一种是服务端没有收到syn,则什么都不做;第二种是服务端回复了syn+ack后,长时间没有收到ack响应,则超时后就会发送rst重置连接报文,释放资源
答:isn全称是initial sequence number,是tcp发送方的字节数据编号的原点,告诉对方我要开始发送数据的初始化序列号。
isn如果是固定的,攻击者很容易猜出后序的确认号,为了安全起见,避免被第三方猜到从而发送伪造的rst报文,因此isn是动态生成的。
答:服务器第一次收到客户端的syn之后,就会处于syn_recd状态,此时双方还没有完全建立连接。服务器会把这种状态下的请求连接放在一个队列里,我们把这种队列称之为半连接队列。当然还有一个全连接队列,就是已经完成三次握手,建立起来连接的就会放在全连接队列中,如果队列满了就有可能出现丢包现象。
四次挥手:
答:其实在tcp握手的时候,接收端将syn包和ack确认包合并到一个包中发送的,所以减少了一次包的发送。对于四次挥手,由于tcp是全双工通信,主动关闭方发送fin请求不代表完全断开连接,只能表示主动关闭方不再发送数据了。
而接收方可能还要发送数据,就不能立即关闭服务器端到客户端的数据通道,所以就不能将服务端的fin包和对客户端的ack包合并发送,只能先确认ack,等服务器无需发送数据时在发送fin包,所以四次挥手时需要四次数据包的交互
答:如果主动关闭方进入closed状态后,被动关闭方发送fin包后没有得到ack确认,超时后就会重传一个fin包。如果客户端没有time_wait状态而直接进入closed状态释放资源,下次启动新的客户端就可能使用了与之前客户端相同的地址信息,有两个危害:
答:msl指的是报文在网络中最大生存时间。在客户端发送对服务端的fin确认包ack后,这个ack包有可能到达不了,服务器端如果接收不到ack包就会重新发送fin包。
所以客户端发送ack后需要留出2msl时间(ack到达服务器器+服务器发送fin重传包,一来一回)等待确认服务器端缺失收到了ack包。也就是说客户端如果等待2msl时间也没收到服务器端重传的fin包,则就可以确认服务器已经收到客户端发送的ack包。
答:time_wait是主动关闭方出现的,一台主机出现大量的time_wait证明这台主机上发起大量的主动关闭连接。常见于一些爬虫服务器。这时候我们应该调整time_wait的等待时间,或者开启套接字地址重用选项
答:close_wait是被动关闭方收到fin请求进行回复之后的状态,等待上层程序进一步处理,若出现大量close_wait,有可能是被动关闭方主机程序中忘了最后一步断开连接后调用close释放资源。这是一个 bug.,只需要加上对应的 close 即可解决问题
答:tcp通信中,若两端长时间没有数据往来,则这时候每隔一段时间,服务端会向客户端发送一个保活探测数据报,要求客户端进行回复。若连续多次没有收到响应,就认为连接已经断开。长时间默认为7200s,每隔一段时间默认为75s,连续多次无响应默认为9次。这些数据都可以在套接字中修改,接口:setsockopt。
友情链接