一文彻底搞懂TCP三次握手和四次挥手,及常见的面试题带答案

TCP(传输控制协议)是一种可靠的、面向连接的协议。在TCP/IP协议栈中,它负责在两个网络应用程序之间建立可靠的会话连接。TCP通过“三次握手”建立连接,通过“四次挥手”断开连接。本文将详细介绍这两个过程,并给出一些面试题及答案。

一:TCP三次握手 (Three-Way Handshake)

过程

SYN:客户端发送一个SYN(同步序列编号)报文到服务器,并进入SYN_SENT状态,等待服务器确认。

SYN-ACK:服务器收到SYN报文后,发送一个SYN+ACK(确认)报文给客户端,并进入SYN_RCVD状态。

ACK:客户端收到服务器的SYN+ACK报文后,会发送一个ACK报文给服务器,然后双方进入ESTABLISHED(已建立连接)状态,完成三次握手,开始数据传输。
在这里插入图片描述

目的

TCP三次握手的主要目的是建立一个可靠的会话连接,确保双方通信端口的正确性,以及同步双方的序列号和确认号,为数据传输做好准备。

二:TCP四次挥手 (Four-Way Handshake)

过程

FIN:当通信的一方完成所有数据传输后,会发送一个FIN(结束)报文来关闭连接。

ACK:另一方收到FIN报文后,会发送一个ACK报文作为应答,并将接收到的序列号加1。

FIN:在发送了ACK报文后,该方也可以发送一个FIN报文请求关闭连接。

ACK:最初发送FIN报文的一方收到对方的FIN报文后,发送一个ACK报文作为回应,然后等待足够时间以确保对方收到这个ACK报文。
TCP四次挥手

目的

四次挥手的目的是允许双方均能清楚地关闭已建立的TCP连接。由于TCP是全双工的,因此每个方向必须单独进行关闭。

在这里插入图片描述

三:面试题及答案

TCP三次握手面试题:

问题1:请简要描述TCP三次握手的过程。

答:第一次握手,客户端发送SYN包到服务器;第二次握手,服务器收到SYN包,回复一个SYN+ACK包;第三次握手,客户端收到服务器的SYN+ACK包后,回复一个ACK包,完成三次握手。

问题2:为什么TCP连接需要三次握手?两次不行吗?

答:三次握手可以确保双方都能够发送和接收数据,防止因网络延迟导致的问题。两次握手可能会导致服务器资源被浪费。

问题3:在TCP三次握手中,客户端和服务器分别扮演什么角色?

答:客户端发送连接请求,服务器接收并回复确认。

问题4:如果在TCP连接过程中,客户端发送的SYN包丢失了,会发生什么情况?

答:服务器会超时等待,然后重新发送SYN+ACK包,进行连接。

TCP四次挥手面试题:

问题5: 请简要描述TCP四次挥手的过程。

答:第一次挥手,客户端发送FIN包到服务器;第二次挥手,服务器收到FIN包,回复一个ACK包;第三次挥手,服务器发送FIN包到客户端;第四次挥手,客户端收到FIN包,回复一个ACK包,完成四次挥手。

问题6:为什么TCP连接需要四次挥手?不能三次挥手吗?

答:四次挥手是为了确保双方都能够完全关闭连接,防止因网络延迟导致的数据丢失或重发问题。

问题7:在TCP四次挥手中,客户端和服务器分别扮演什么角色?

答:客户端发送关闭请求,服务器确认并发送关闭请求,客户端再确认关闭。

问题8: 如果在TCP连接过程中,服务器收到客户端的FIN包后立即回复ACK包,会发生什么情况?

答:客户端可能还有数据需要发送,服务器需要等待客户端发送完数据后再发送FIN包,进行关闭连接

下载链接博主已将以下这些面试题整理成了一个面试手册,是PDF版的

在这里插入图片描述
在这里插入图片描述

  • 35
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
TCP的三次和四次挥手中,seq和ack是用来进行序列号和确认号的传递和确认的。在三次中,客户端发送SYN报段给服务端,其中的seq字段表示客户端的初始序列号。服务端收到后,会回复一个SYN+ACK报段,其中的ack字段表示服务端确认客户端的序列号,并且在自己的seq字段中设置自己的初始序列号。最后,客户端再回复一个ACK报段,其中的ack字段表示客户端确认服务端的序列号。这样,三次完成了连接的建立。\[1\] 在四次挥手中,当客户端想要关闭连接时,会发送一个FIN报段给服务端,其中的seq字段表示客户端的序列号。服务端收到后,会回复一个ACK报段,其中的ack字段表示服务端确认客户端的序列号。然后,服务端也会发送一个FIN报段给客户端,其中的seq字段表示服务端的序列号。最后,客户端再回复一个ACK报段,其中的ack字段表示客户端确认服务端的序列号。这样,四次挥手完成了连接的关闭。\[2\] 总结起来,seq字段用于传递发送方的序列号,ack字段用于确认接收方已经收到的序列号。通过这样的序列号和确认号的交互,TCP可以保证可靠的数据传输和连接的建立与关闭。 #### 引用[.reference_title] - *1* *3* [两张动图-彻底明白TCP的三次与四次挥手](https://blog.csdn.net/qzcsu/article/details/72861891)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [一TCP的三次和四次挥手](https://blog.csdn.net/m0_38106923/article/details/108292454)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农code之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值