web前端http面试题小结

问题1:为什么建立连接是3次握手,而不是2次或4次?

  3次握手完成两个重要的功能,既要双方都知道彼此已做好准备可以进行数据发送,也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。三次握手的最主要目的是保证连接是双工的,可靠更多的是通过重传机制来保证的。

第一次握手:
 Client什么都不能确认
 Server确认了自己接收正常,对方发送正常
第二次握手:
 Client确认自己发送/接收正常,对方发送/接收正常
第三次握手:
 Server确认自己发送/接收正常,对方发送/接收正常

前两次握手(第1、2次):确保服务器端能接收到客户端的信息并做出正确的应答。
后两次握手(第3、4次):确保客户端能接收到服务器端的信息并做出正确的应答。

所以通过三次握手就可以确认双方收发功能都正常。
假如没有第三次握手,则Server在第二次握手之后就认为双方已建立连接可以正常发送数据了。可是如果第二次握手的数据包丢失了,则Client收不到回应,其会认为连接尚未建立,将忽略服务器端发来的任何数据,只是等待着服务器的确认应答包。Server会对已建立的连接保存必要的资源,这样会造成服务器端的开销浪费。

可以说第三次握手是为保证数据传输的双向性。若3次握手成功则双方可以发送数据,否则不行。

为什么不是4次握手? 因为无论多少次握手都不能保证传输的绝对可靠(因为无论几次握手都不能保证对方收到确认应答包)。而三次握手后,Client和Server至少可以确认之前的通信情况(双方可以正常通信),但无法确认之后的情况。在这个道理上说,无论是四次还是五次或是更多次握手都是徒劳的。

问题3:为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

  TCP建立连接时之所以只需要"三次握手",是因为在第二次"握手"过程中,服务器端发送给客户端的TCP报文是以SYN与ACK作为标志位的。SYN是请求连接标志,表示服务器端同意建立连接;ACK是确认报文,表示告诉客户端,服务器端收到了它的请求报文。即SYN建立连接报文与ACK确认接收报文是在同一次"握手"当中传输的,所以"三次握手"不多也不少,正好让双方明确彼此信息互通。
  TCP释放连接时之所以需要“四次挥手”,是因为FIN释放连接报文与ACK确认接收报文是分别由第二次和第三次"握手"传输的。为何建立连接时一起传输,释放连接时却要分开传输?
  收到连接请求时,被动方服务器端结束CLOSED阶段进入“握手”阶段并不需要任何准备,可以直接返回SYN和ACK报文进行第二次握手。断开连接时,被动方服务器,突然收到主动方客户端断开连接的请求时并不能立即断开连接,其需要把剩余的数据发送完毕,所以服务器先返回ACK确认报文表示收到断开请求,经过CLOSE-WAIT阶段准备好断开连接之后,才能返回FIN断开连接报文。

问题4:为什么客户端在TIME-WAIT阶段要等2MSL?

  虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的。在Client发送出最后的ACK回复后,该ACK是可能丢失的,所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。Server如果没有收到最后的ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。这也是为什么客户端比服务器端晚进入CLOSED阶段的原因

问题5:如果已经建立了连接,但是客户端突然出现故障了怎么办?

TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值