tcp握手和挥手面试题

文章介绍了计算机网络中的TCP/IP协议,重点讲解了TCP的三次握手和四次挥手过程,解释了为何需要三次握手和四次挥手,并提到了TCP与UDP的区别。此外,还讨论了TCP关闭连接时的2MSL等待时间,确保可靠关闭。

在看tcp/ip协议之前,我们先对计算机网络进行一个大致的复习

计算机网络概述

对应不同的计算机网络模型来说,计算机网络的模型都是不一样的,如下图有三种模型,我们学习的基本的其中的第三种模型:5层体系架构

img

这5层的功能如下

  • 应用层:应用软件的网络协议,如:http
  • 传输层:用特定的协议将数据传送到目标地址,如:tcp
  • 网络层:用特定的协议将数据发送到目标地址上,如:ip
  • 数据链路层:交换机
  • 物理层:光纤

而 tcp/ip协议的说法有几个:

  1. 与互联网相关联的协议集合起来总称为 TCP/IP
  2. TCP 和 IP 这两种协议
  3. 在 IP 协议的通信过程中,使用到的协议族的统称。

而对应面试来说,tcp/ip中考察最多的就是tcp了。

tcp的三次握手和四次挥手

在csnd上面有两幅图片行生动

握手:

三次握手

四次挥手:

image-20200409184934239

因为tcp的可靠的传输协议,所以当女朋友发送了一条消息,男朋友就要相应一条回复。

所以握手的时候前面两部相当于确认和回复,在第三条消息代表是对男方的回复。通常第三次握手会携带则数据的信息一起发送。

挥手的时候,1、2 是女方告诉南方我的消息发送完成了,且男方接收到了消息,3、4代表的是男方同意了女方的关闭聊天请求,因为已经无话可说了

具体的tcp之间的交流图如下:

握手:

在这里插入图片描述

挥手:

在这里插入图片描述

参考:

csdn:详解TCP的握手与分手

csdn:TCP/IP 的三次握手和四次分手过程详解【图解】

面试题:

简述TCP的三次握手和四次挥手

参考上图

为什么是三次握手而不是两次握手?

避免产生多个连接。

如表示为上图的男女盆友,即如图所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c9VJrahY-1675852442390)(C:/Users/煋/AppData/Roaming/Typora/typora-user-images/image-20230207193623454.png)]

参考:

csdn:TCP/IP协议常见面试题

为什么连接的时候是三次握手,关闭的时候却是四次握手?

因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

男女盆友的关系就是:必须两方无话可说了,才可以关闭聊天窗口,否则会造成关系破裂

为什么需要经过2MSL(报文段在网络中最大生存时间)才能返回到CLOSE状态?

是为了给最后一次发送的ACK报文成功到达服务端预留时间,因为如果因为网络阻塞最后一次ACK未能及时到达服务端,服务端会以为客户端为收到上一次发送的FIN报文,则服务端会重新发送FIN报文,而这是客户端已经断开连接了,这时就是产生错乱的问题。

通俗来说就是: 男盆友给女友发了一句:我也无话可说了,但是在2MSL(一次是1MSL,一个来回就是2MSL)内它没有收到回复,但是女友在1MSL的时候就收到了消息,但是有用网络原因在1MSL内没有被达男友,,所以又发送了一句,而这一句又被女方收到了,所以女友再次响应。知道再过2MSL没收到消息为止

在tcp关闭的时候,没有任何的绝对可靠的关闭消息,只有尽可能的保证双方都知道关闭消息的事情,所以2MSL就是尽可能的保证

TCP与UDP的区别

tcp:可靠传输、传输效率低,每一个数据包都必须到达,如:下载的txt文件

UDP:不可靠传输、传输效率高,有效数据包可能会丢失,但是对应整体来说无影响,如:视频电话

推荐阅读

计算机网络:自定向下方法(原书第7版)第八版也发布了,但是视频教程是第七版的

B站:中科大-郑烇老师:一个将计算机网络讲的很好的老师

### 关于TCP三次握手四次挥手面试题目及答案 #### 一、TCP三次握手机制的作用是什么? TCP是一个面向连接的协议,在使用前必须先建立连接,此过程通过三次握手来完成。这不仅让双方做好了发送数据的准备——即确认彼此都已准备好;还允许双方便携地协商初始序列号,这些都在握手的过程中被发送并得到确认[^2]。 #### 二、为何不是两次而是至少需要三次握手才能建立起可靠的TCP连接? 如果采用两次握手的方式,则可能会遇到死锁的情况。比如当客户端向服务端发起连接请求之后,即使服务端回应了确认消息,但如果该确认消息在网络中丢失,那么客户端将无法得知服务端的状态以及所使用的序列号,从而认为连接未成功建立,并会忽视来自服务端的数据包,造成循环等待的局面。因此,为了防止这种情况的发生,确保通信双方都能正确理解对方的状态,才有了第三次握手的设计[^3]。 #### 三、具体描述一下TCP三次握手的过程 第一次握手:客户端主动打开一个到服务器的新连接,此时它会随机生成一段起始序号ISN_Client,并将其放入SYN报文中发送出去; 第二次握手:服务器接收到上述SYN后,同样会产生自己的起始序号ISN_Server,并连同对客户端SYN的ACK一同返回给客户端; 第三次握手:最后由客户端再次回传一个带有ACK标志位设置为1的数据段至服务器,表示已经接受到了之前所有的信息,至此整个连接正式确立[^4]。 #### 四、解释下何谓“四次挥手”,其目的是什么? 所谓“四次挥手”指的是终止一条现有的TCP连接所需经历的一系列操作步骤。因为每台设备都需要独立通知另一方自己不再有新的数据要传送,并且还要等待对方做出相应的响应,所以理论上讲确实需要四个单独的动作来结束一次完整的对话流程。这样做是为了保证所有已发送的数据都能够被接收者完全处理完毕后再切断链路,避免因突然断开而导致部分重要资料遗失的风险[^1]。 ```python def tcp_handshake(): """ 模拟TCP三次握手过程 :return: None """ client_isn = generate_random_number() # 客户端生成初始序列号 server_isn = receive_syn(client_isn) # 接收到来自客户端的SYN, 并生成自身的初始序列号 send_ack_to_client(server_isn, client_isn + 1) # 发送包含server ISN 对client SYN 的 ACK 至客户端 confirm_connection Establishment() # 收到客户端最终确认,连接建立 def four_way_wave_goodbye(): """ 模拟TCP四次挥手指令集 :return: None """ initiate_close_request_from_one_side() acknowledge_the_other_party's_closing_intention() complete_local_resource_release_after_both_sides_have_no_more_data_to_send() finally_terminate_all_connections_between_two_machines() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值