为什么TCP需要三次握手?一次不行吗?

embedded/2025/3/23 18:35:17/

文章目录


1. 三次握手的过程

三次握手是建立 TCP 连接的过程,目的是确保通信双方能够可靠地建立连接。它的基本过程如下:

  • 第一次握手:客户端发送一个 SYN 报文给服务器,表示请求建立连接。
  • 第二次握手:服务器收到 SYN 后,发送 SYN+ACK 报文给客户端,表示确认收到请求,并同意建立连接。
  • 三次握手:客户端收到 SYN+ACK 后,发送 ACK 报文给服务器,确认连接建立。

当这三步完成后,TCP 连接正式建立,双方可以开始通信。

在这里插入图片描述

2. 为什么需要三次握手

三次握手的主要目的是防止已失效的连接请求报文被误接收,从而引发错误。

例如:如果没有三次握手,假设客户端第一次发送的 SYN 报文因网络延迟滞留很久,服务器收到后误以为是新的连接请求,发送 SYN+ACK,而客户端实际上已经关闭或不需要连接了。这样,服务器就会白白等待,浪费资源。

三次握手通过让客户端确认服务器的响应,确保双方都明确知道对方的通信能力,从而建立可靠的连接。

3. 握手过程中每一步的具体作用

第一次握手(SYN):

  • 客户端主动发送一个 SYN 报文,标志着它想要建立连接,同时携带一个序列号(Sequence Number,简写为 Seq)。
  • 作用:客户端告诉服务器,“我想和你建立连接,同时我的序列号是 X。”

第二次握手(SYN+ACK):

  • 服务器收到 SYN 报文后,会回复一个 SYN+ACK 报文,表示同意连接,并告知客户端它的初始序列号。
  • 作用:服务器告诉客户端,“我同意你的请求,我的序列号是 Y,同时我收到你的序列号 X。”

三次握手(ACK):

  • 客户端收到 SYN+ACK后,再发送一个 ACK 报文,确认连接已建立。
  • 作用:客户端告诉服务器,“我确认收到你的序列号 Y,同时你也收到了我的序列号 X,我们可以正式通信了。”

4. 简单比喻

假设一个日常场景:你和朋友约好电话联系。

第一次握手: 你拨通朋友的号码,电话响了(客户端发送SYN)。

  • 作用:表示你希望和朋友建立通话。

第二次握手: 朋友接起电话并回应:“喂,你好”(服务器发送 SYN+ACK)。

  • 作用:朋友同意与你通话,并向你确认他可以正常接收你的声音。

三次握手 你说:“你好,我能听到你,我们可以聊天了。”(客户端发送ACK)。

  • 作用:确认双方的通信能力正常,通话开始。

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

两次握手的问题:

  • 如果仅用两次握手,服务器在收到客户端的第一次 SYN 后就认为连接已经建立,这可能导致服务器被无效连接请求拖累。三次握手让客户端确认了服务器的响应,避免了这种情况。

为什么不需要四次握手?

  • 四次握手会浪费一次额外的交互,在双方都已确认的情况下没有必要。三次握手已经足够确保双方的通信能力和连接的可靠性。

6. 三次握手中的序列号有什么作用?

序列号用于保证数据传输的有序性和可靠性。在握手中,双方交换初始序列号,后续传输中,数据会按照序列号排列并校验,以避免丢包、乱序等问题。

比如,客户端的初始序列号是 100,服务器的初始序列号是 200,那么双方的后续数据传输会以这两个值为起点,确保数据能被正确接收。

7. 总结

三次握手的精妙之处在于:既确保了双方的通信能力,又避免了不必要的资源浪费,同时为后续可靠通信奠定了基础。


http://www.ppmy.cn/embedded/174586.html

相关文章

微信小程序:用户拒绝小程序获取当前位置后的处理办法

【1】问题描述: 小程序在调用 wx.getLocation() 获取用地理位置时,如果用户选择拒绝授权,代码会直接抛出错误。如果再次调用 wx.getLocation() 时,就不会在弹窗询问用户是否允许授权。导致用户想要重新允许获取地理位置时&#x…

WPF 中的 GridSplitter 详解

1. 什么是 GridSplitter? GridSplitter 是 WPF 提供的一个控件,用于调整 Grid 布局的行或列的大小。它可以让用户在运行时拖动分隔线,以改变相邻的行或列的大小,而不需要修改 XAML 代码。 2. GridSplitter 的基本用法 &#xff…

maven使用install将jar包编译到本地仓库管理

要install的jar包 mvn install:install-file -DgroupIdcn.qiufeng -DartifactIdDJGenHsmAPI -Dversion3.1.0d -Dpackagingjar -DfileDJGenHsmAPI-3.1.0d.jar 重点是版本号必须使用编译后的版本号 发布成功后

gitlab将本地项目提交到远程dev分支

获取Git路径 首先从远程获取到git路径,将给的git地址进行克隆到本地文件; git clone http:************.git 按照git地址的文件路径将本地项目,拷贝到目标文件中 在该路径中,初始化命令; # 初始化项目 git init #…

MySQL:8.0- timestamp默认值允许‘0000-00-00 00:00:00‘

MySql 8.0中输入代码: alter table kingbal_com add column create_date timestamp not null default 0000-00-00 00:00:00; 报错,提示默认时期格式0000-00-00 00:00:00有误。 解决办法: 1) select sql_mode; -- 查看全局sql…

Android第四次面试(Java基础篇)

一、Java 中的 DCL 单例模式 单例模式是设计模式中最常用的模式之一,其核心目标是确保一个类在程序中仅有一个实例,并提供全局访问点。在 Java 中,实现单例模式需要兼顾线程安全和性能优化。DCL(Double-Checked Locking&#xff0…

2025年智能系统、自动化与控制国际学术会议(ISAC 2025)

重要信息 2025 International Conference on Intelligent Systems, Automation and Control 2025年3月28-30日 | 中国西安理工大学 | 会议官网: www.icisac.org 简介 在国家大力推动高质量发展与创新驱动战略的背景下,智能制造与自动化控制行业正迎…

Microchip AN1477中关于LLC数字补偿器的疑问

最近在学习Microchip的AN1477关于LLC的功率级传递函数推导及数字补偿器设计,对其中的2P2Z数字补偿器的系数有一些困惑。我在MATLAB中运行了源程序提供的VMC_LLC.m文件,发现有些地方和AN1477中的结果不一致。现在把相关有疑问的地方列举出来,也…