电脑之家 - 专业计算机基础知识与电脑技术学习网站
分类导航

路由器|交换机|网络协议|网络知识|

服务器之家 - 电脑之家 - 网络技术 - 网络协议 - 面试官竟然把TCP三次握手和四次挥手问的这么详细?

面试官竟然把TCP三次握手和四次挥手问的这么详细?

2022-08-29 20:56网络工程师阿龙 网络协议

本文会围绕,从三次握手和四次挥手相关的一系列核心问题,分享如何更准确回答和应对常见的面试问题,以后面对再刁钻的面试官,你都可以随意地跟他扯皮了。

面试官竟然把TCP三次握手和四次挥手问的这么详细?

TCP的定义

 

TCP全称为Transmission Control Protocol(传输控制协议),是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。

 

TCP的三次握手和四次挥手,可以说是老生常谈的经典问题了,通常也作为各大公司常见的面试考题,具有一定的水平区分度。看似简单的面试问题。如果你的回答不符合面试官期待的水准,有可能就直接凉凉了。

本文会围绕,从三次握手和四次挥手相关的一系列核心问题,分享如何更准确回答和应对常见的面试问题,以后面对再刁钻的面试官,你都可以随意地跟他扯皮了

优雅回答三次握手

三次握手: 服务端新建套接字,绑定地址信息后开始监听,进入LISTEN状态。客户端新建套接字绑定地址信息后调用connect,发送连接请求SYN,并进入SYN_SENT状态,等待服务器的确认。服务端一旦监听到连接请求,就会将连接放入内核等待队列中,并向客户端发送SYN和确认报文段ACK,进入SYN_RECD状态。客户端收到SYN+ACK报文后向服务端发送确认报文段ACK,并进入ESTABLISHED状态,开始读写数据。服务端一旦收到客户端的确认报文,就进入ESTABLISHED状态,就可以进行读写数据了

面试官竟然把TCP三次握手和四次挥手问的这么详细?

1. 为什么握手是三次,而不是两次或者四次?

答:两次不安全,四次没必要。tcp通信需要确保双方都具有数据收发的能力,得到ACK响应则认为对方具有数据收发的能力,因此双方都要发送SYN确保对方具有通信的能力。

  • 第一次握手是客户端发送SYN,服务端接收,服务端得出客户端的发送能力和服务端的接收能力都正常;
  • 第二次握手是服务端发送SYN+ACK,客户端接收,客户端得出客户端发送接收能力正常,服务端发送接收能力也都正常,但是此时服务器并不能确认客户端的接收能力是否正常;
  • 第三次握手客户端发送ACK,服务器接收,服务端才能得出客户端发送接收能力正常,服务端自己发送接收能力也都正常。

2. 三次握手可以携带数据吗?

答:第一次、第二次握手不可以携带数据,而第三次握手是可以携带数据的。假设第一次可以携带数据,如果有人恶意攻击服务器,每次都在第一次握手中的SYN报文放入大量数据,重复发送大量SYN报文,此时服务器会花费大量内存空间来缓冲这些报文,服务器就更容易被攻击了。

3. TCP三次握手失败,服务端会如何处理?

答:握手失败的原因有两种,第一种是服务端没有收到SYN,则什么都不做;第二种是服务端回复了SYN+ACK后,长时间没有收到ACK响应,则超时后就会发送RST重置连接报文,释放资源

4. ISN代表什么?意义何在?ISN是固定不变的吗?ISN为何要动态随机

答:ISN全称是Initial Sequence Number,是TCP发送方的字节数据编号的原点,告诉对方我要开始发送数据的初始化序列号。

ISN如果是固定的,攻击者很容易猜出后序的确认号,为了安全起见,避免被第三方猜到从而发送伪造的RST报文,因此ISN是动态生成的。

5. 什么是半连接队列

答:服务器第一次收到客户端的SYN之后,就会处于SYN_RECD状态,此时双方还没有完全建立连接。服务器会把这种状态下的请求连接放在一个队列里,我们把这种队列称之为半连接队列。当然还有一个全连接队列,就是已经完成三次握手,建立起来连接的就会放在全连接队列中,如果队列满了就有可能出现丢包现象。

优雅回答四次挥手

四次挥手:

  • 客户端主动调用close时,向服务端发送结束报文段FIN报,同时进入FIN_WAIT1状态;
  • 服务器会收到结束报文段FIN报,服务器返回确认报文段ACK并进入CLOSE_WAIT状态,此时如果服务端有数据要发送的话,客户端依然需要接收。客户端收到服务器对结束报文段的确认,就会进入到FIN_WAIT2状态,开始等待服务器的结束报文段;
  • 服务器端数据发送完毕后,当服务器真正调用close关闭连接时,会向客户端发送结束报文段FIN包,此时服务器进入LAST_ACK状态,等待最后一个ACK的带来;
  • 客户端收到服务器发来的结束报文段, 进入TIME_WAIT, 并发出送确认报文段ACK;服务器收到了对结束报文段确认的ACK,进入CLOSED状态,断开连接。而客户端要等待2MSL的时间,才会进入到CLOSED状态。

面试官竟然把TCP三次握手和四次挥手问的这么详细?

6. 为什么握手是三次,而挥手时需要四次呢?

答:其实在TCP握手的时候,接收端将SYN包和ACK确认包合并到一个包中发送的,所以减少了一次包的发送。对于四次挥手,由于TCP是全双工通信,主动关闭方发送FIN请求不代表完全断开连接,只能表示主动关闭方不再发送数据了。

而接收方可能还要发送数据,就不能立即关闭服务器端到客户端的数据通道,所以就不能将服务端的FIN包和对客户端的ACK包合并发送,只能先确认ACK,等服务器无需发送数据时在发送FIN包,所以四次挥手时需要四次数据包的交互

7. TIME_WAIT状态有什么作用,为什么主动关闭方没有直接进入CLOSED状态释放资源?

答:如果主动关闭方进入CLOSED状态后,被动关闭方发送FIN包后没有得到ACK确认,超时后就会重传一个FIN包。如果客户端没有TIME_WAIT状态而直接进入CLOSED状态释放资源,下次启动新的客户端就可能使用了与之前客户端相同的地址信息,有两个危害:

  • 第一种是这个刚启动的新的客户端绑定地址成功时,就会收到了一个重传的FIN包,对新连接就会造成影响。
  • 第二种是如果该新客户端向相同的服务端发送SYN连接请求,但是此时服务端处于LAST_ACK状态,要求收到的是ACK而不是SYN,因此就会发送RST重新建立请求。

8. 为什么TIME_WAIT状态需要经过2MSL才能进入CLOASE状态?

答:MSL指的是报文在网络中最大生存时间。在客户端发送对服务端的FIN确认包ACK后,这个ACK包有可能到达不了,服务器端如果接收不到ACK包就会重新发送FIN包。

所以客户端发送ACK后需要留出2MSL时间(ACK到达服务器器+服务器发送FIN重传包,一来一回)等待确认服务器端缺失收到了ACK包。也就是说客户端如果等待2MSL时间也没收到服务器端重传的FIN包,则就可以确认服务器已经收到客户端发送的ACK包。

9. 一台主机上出现大量的TIME_WAIT是什么原因?应该如何处理?

答:TIME_WAIT是主动关闭方出现的,一台主机出现大量的TIME_WAIT证明这台主机上发起大量的主动关闭连接。常见于一些爬虫服务器。这时候我们应该调整TIME_WAIT的等待时间,或者开启套接字地址重用选项

10. 一台主机上出现大量的CLOSE_WAIT是什么原因?应该如何处理?

答:CLOSE_WAIT是被动关闭方收到FIN请求进行回复之后的状态,等待上层程序进一步处理,若出现大量CLOSE_WAIT,有可能是被动关闭方主机程序中忘了最后一步断开连接后调用close释放资源。这是一个 BUG.,只需要加上对应的 close 即可解决问题

11. TCP连接管理中的保活机制

答:TCP通信中,若两端长时间没有数据往来,则这时候每隔一段时间,服务端会向客户端发送一个保活探测数据报,要求客户端进行回复。若连续多次没有收到响应,就认为连接已经断开。长时间默认为7200s,每隔一段时间默认为75s,连续多次无响应默认为9次。这些数据都可以在套接字中修改,接口:Setsockopt。

原文地址:https://mp.weixin.qq.com/s?__biz=MjM5ODY3MTgxNw==&mid=2653968036&idx=1&sn=eb6a9fa3bb21772204c71166c66bc52b&chksm=bd03d2028a745b141465daa1dd7d591ebafeb869c55d165a946f153a9e55372214225e8ad95d

延伸 · 阅读

精彩推荐
  • 网络协议从0学ARM-uboot中的网络协议栈

    从0学ARM-uboot中的网络协议栈

    网卡的驱动,对于上层协议来说,已经封装好了发送和接收数据的接口,那么上层协议栈只需要按照顺序调用对应的网卡驱动函数就可以进行网络数据的收...

    一口Linux9152021-05-26
  • 网络协议HTTP缓存协议实战

    HTTP缓存协议实战

    缓存,又称作Cache,我们把临时存储数据的地方叫做缓存池,缓存池里面放的数据就叫做缓存,本文就以实战的形式为大家介绍HTTP缓存协议。...

    vivo互联网技术6642022-03-10
  • 网络协议UDP连接对象原理解析及使用实例

    UDP连接对象原理解析及使用实例

    这篇文章主要介绍了UDP连接对象原理解析及使用实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以...

    cuisuqiang8892021-07-19
  • 网络协议5分钟看懂互联网安全协议IPSec

    5分钟看懂互联网安全协议IPSec

    通信双方需要一个真正在IP层提供安全性的方法,保证发送和接收的数据是安全的,IPSec(Internet Protocol Security,互联网安全协议)做到了。...

    中兴文档8082021-11-01
  • 网络协议通俗易懂的阐述 HTTPS 协议,解决面试难题

    通俗易懂的阐述 HTTPS 协议,解决面试难题

    本文为系列的第一篇,带着一些问题逐步了解对称加密、非对称加密、数字证书、密钥协商等这些概念分别是什么、能做什么,一层一层揭开其神秘面纱。...

    编程界10622021-12-26
  • 网络协议为什么叫 HTTP/2 ,而不是 HTTP/2.0 ?

    为什么叫 HTTP/2 ,而不是 HTTP/2.0 ?

    互联网时代,足不出户,点点鼠标就可以轻松了解外面的世界变化,这一切得益于网络传输数据。我们都知道网络有7层模型,从底层到上层依次是:物理层...

    微观技术4522021-11-01
  • 网络协议什么是ICMP协议?ICMP有什么重要性?

    什么是ICMP协议?ICMP有什么重要性?

    对TCP/IP协议你一定非常熟悉,但是对ICMP协议你可能就一无所知了。ICMP协议是一个非常重要的协议,它对于网络安全具有极其重要的意义。下面我们就来谈...

    电脑技术网8692021-08-02
  • 网络协议TCP性能调优实现原理及过程解析

    TCP性能调优实现原理及过程解析

    这篇文章主要介绍了TCP性能调优实现原理及过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以...

    -零5692021-07-19