面试官:请说说为什么TCP不用两次握手?

前言

在计算机网络中,TCP(传输控制协议)是一种重要的通信协议,用于在网络中的两台计算机之间建立可靠的连接并交换数据。TCP协议通过"三次握手"和"四次挥手"的过程来建立和终止连接,确保数据的准确传输。

一、三次握手(Three-Way Handshake)

三次握手是指建立一个TCP连接时,需要客户端和服务器总共发送3个包以确认连接的建立。这个过程主要是为了同步双方的序列号和确认号,并交换TCP窗口大小信息。

第一次握手:

  • 客户端发送一个TCP的SYN(synchronize)报文段到服务器,其中SYN标志位被设置为1,选择一个初始的序列号x。这表明客户端希望建立连接,并且客户端准备发送数据。

第二次握手:

  • 服务器收到SYN报文段后,如果同意建立连接,则会发送一个SYN+ACK(acknowledge)报文段作为响应。该报文段中SYN标志位被设置为1,ACK标志位也被设置为1,确认号为x+1,同时选择自己的初始序列号y。

第三次握手:

  • 客户端收到服务器的SYN+ACK报文段后,向服务器发送一个ACK报文段,其中ACK标志位被设置为1,序列号为x+1,确认号为y+1。这表明客户端收到了服务器的确认,且客户端准备好了发送数据。

至此,三次握手完成,客户端与服务器之间建立了连接,可以开始数据传输。

如图:

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

1. 防止旧连接请求的干扰

  • 在网络通信中,由于网络延迟或其他因素,一个旧的连接请求可能会在网络中滞留,并在不适当的时间到达服务器。如果只用两次握手建立连接,服务器收到一个客户端的连接请求(SYN)后,直接回复确认(ACK)并建立连接,那么即使这个请求是一个过时的请求,连接也会被建立。

2. 确认双方的接收与发送能力

  • 如果使用两次握手,服务器在收到过时的连接请求后就立即分配资源建立连接,这将导致服务器资源的浪费,因为客户端实际上并不期望建立这个过时的连接。三次握手通过确保双方都明确表示了建立当前连接的意图,避免了因误建立过时连接而浪费服务器资源。

三次握手通过一个额外的回合来确保双方都准备好进行数据传输。在第三次握手中,客户端发送ACK确认后,这个确认也告诉服务器,客户端确实准备好了接收服务器的数据。如果没有这个额外的确认,就没有办法保证客户端真的准备好了接收数据。

二、四次挥手(Four-Way Handshake

在TCP(传输控制协议)中,当数据传输完成后,连接的终止过程需要通过一个称为"四次挥手"(Four-way Handshake)的过程来实现。这个过程确保了双方数据传输的完整性和连接的可靠终止。

第一次挥手:

  • 客户端发送关闭连接请求报文(FIN)给服务器。
  • 客户端进入FIN_WAIT_1状态,等待服务器的确认。

第二次挥手:

  • 服务器收到关闭连接请求后,发送确认报文(ACK)给客户端。
  • 服务器进入CLOSE_WAIT状态,等待自己的发送通道关闭。

第三次挥手:

  • 服务器发送关闭连接请求报文(FIN)给客户端。
  • 服务器进入LAST_ACK状态,等待客户端的确认。

第四次挥手:

  • 客户端收到关闭连接请求后,发送确认报文(ACK)给服务器。
  • 客户端进入TIME_WAIT状态,等待一段时间后连接彻底关闭。
  • 服务器收到客户端的确认后,关闭连接。

如果上面大家没有看明白的话,我们可以通过一个日常生活中的比喻来重新梳理和理解这一过程。

假设两位好朋友A和B在一天的结束时准备告别:

A是客户端,而B是服务器。他们的告别过程可以分为以下四个步骤:

第一次挥手:A表达离开意愿

  • 场景比喻:A对B说:"我得走了。"
  • 技术解释:A(客户端)向B(服务器)发送一个FIN报文,表示自己没有数据要发送了,并希望开始关闭连接。

第二次挥手:B确认收到

  • 场景比喻:B回应:"好的,我知道了。但让我再检查一下是否还有最后的话要说。"
  • 技术解释:B收到FIN报文后,发送一个ACK报文作为响应,确认已经知道A想要结束会面。这时,B可能还有数据需要发送给A,所以并不立即发送FIN报文。

第三次挥手:B也表达离开意愿

  • 场景比喻:B说完所有话后,对A说:"我也得走了。"
  • 技术解释:B发送一个FIN报文给A,表示服务器端没有数据要发送了,并希望关闭连接。

第四次挥手:A确认并准备离开

  • 场景比喻:A回应:"好的,那再见。"然后A等待片刻,确保B听到了自己的回应,防止B没听清楚而继续等待。
  • 技术解释:A收到B的FIN报文后,发送一个ACK报文作为回应,并进入TIME_WAIT状态。A等待足够的时间以确保B收到了确认的消息,然后才真正结束连接。

通过这个过程,A和B确保了彼此都已经完成了数据的发送和接收,且双方都同意关闭连接。这个细致的过程体现了TCP协议的设计原则,旨在保障数据传输的完整性和连接的可靠终止。

小结

三次握手和四次挥手是TCP协议中非常重要的过程,它们确保了网络通信的可靠性和顺畅性。通过这两个过程,TCP协议能够在不可靠的互联网环境中提供可靠的端到端通信。

相关推荐
百万蹄蹄向前冲1 小时前
Trae分析Phaser.js游戏《洋葱头捡星星》
前端·游戏开发·trae
朝阳5812 小时前
在浏览器端使用 xml2js 遇到的报错及解决方法
前端
GIS之路2 小时前
GeoTools 读取影像元数据
前端
ssshooter3 小时前
VSCode 自带的 TS 版本可能跟项目TS 版本不一样
前端·面试·typescript
Jerry3 小时前
Jetpack Compose 中的状态
前端
王燕龙(大卫)4 小时前
tcp会无限次重传吗
网络·tcp/ip
dae bal4 小时前
关于RSA和AES加密
前端·vue.js
柳杉4 小时前
使用three.js搭建3d隧道监测-2
前端·javascript·数据可视化
lynn8570_blog4 小时前
低端设备加载webp ANR
前端·算法
LKAI.5 小时前
传统方式部署(RuoYi-Cloud)微服务
java·linux·前端·后端·微服务·node.js·ruoyi