【网络】TCP/IP连接为什么是三次握手?

2024-08-26 21:08
文章标签 ip 连接 网络 tcp 握手 三次

本文主要是介绍【网络】TCP/IP连接为什么是三次握手?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      前几天被一个好友问到了这个问题,让我的思绪回到了当年的“计算机网络与原理”那门课程……,是啊,为什么握手是三次,而不是两次,或者四次呢?

      先来一张搞笑图哦~

         

       如图所示,是美国三位总统的三次握手,哈哈,为什么不是两次,为什么不是四次,这个问题又在我脑子里回荡了……


       首先,我看了下网上资料,引用了了两本书中的定义:

       1.解决“网络中存在延迟的重复分组”问题。
       2.“为了防止已失效的链接请求报文段突然又传送到了服务端,产生错误”。
       3.保证链接的是双工的,可靠更多的是通过重传机制保证。


       除了第3点,其他的看着比较懵逼,究竟是啥意思哩???

       之后带着上述3点定义,我又去网上找答案,之后思路渐渐清晰起来了,看图:

      

       首先,这里有两个端的概念,1.Client端,2.Server端,连接建立就是C端和S端。

       握手的过程:

       1. C端发送syn包(syn = j)到服务器,进入SYN_SEND状态,等待S端确认。
       2. S端收到syn包,确认C端的syn(ack=j+1),向C端发送一个syn包(SYN+ACK),进入SYN_RECV状态。
       3. C端收到SYN+ACK包,向服务器发送确认包ACK(ack=k+1),之后C和S进入ESTABLISHED状态,完成三次握手。


      下面解释一下,为什么是三次握手?

       1.从性能和安全角度

       client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。


       2.从信道可靠性角度

       这个问题的本质是, 信道不可靠, 但是通信双发需要就某个问题达成一致. 而要解决这个问题, 无论你在消息中包含什么信息, 三次通信是理论上的最小值. 所以三次握手不是TCP本身的要求, 而是为了满足"在不可靠信道上可靠地传输信息"这一需求所导致的. 请注意这里的本质需求,信道不可靠, 数据传输要可靠. 三次达到了, 那后面你想接着握手也好, 发数据也好, 跟进行可靠信息传输的需求就没关系了. 因此,如果信道是可靠的, 即无论什么时候发出消息, 对方一定能收到, 或者你不关心是否要保证对方收到你的消息, 那就能像UDP那样直接发送消息就可以了.”。这可视为对“三次握手”目的的另一种解答思路。


      对比三次握手和两次、四次区别

      1.四次握手过程:

      1)C发送同步信号SYN + C‘s initial sequence number

      2)S确认收到C的同步信号,并记录C‘s ISN到本地,命名S‘s ACK sequence number

      3)S发送同步信号SYN + S's initial sequence number

      4)C确认收到S的同步信号,并记录S‘s ISN到本地,命名C‘s ACK sequence number

      显然,2和3两步可以合并,只需要3次握手,可以提交效率和速度。


      2.两次握手过程:

      1)A发送同步信号SYN + A‘s initial sequence number

      2)B发送同步信号SYN + B's initial sequence number + B's ACK sequence number

      问题,A与B就A的初始化序列号达成一致,但是B无法知道A是否已经收到自己的同步信号,如果同步信号丢失,AB就B的初始化序列号将无法达成一致。

 

      That's all.





这篇关于【网络】TCP/IP连接为什么是三次握手?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109685

相关文章

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Linux查询服务器 IP 地址的命令详解

《Linux查询服务器IP地址的命令详解》在服务器管理和网络运维中,快速准确地获取服务器的IP地址是一项基本但至关重要的技能,下面我们来看看Linux中查询服务器IP的相关命令使用吧... 目录一、hostname 命令:简单高效的 IP 查询工具命令详解实际应用技巧注意事项二、ip 命令:新一代网络配置全

python连接sqlite3简单用法完整例子

《python连接sqlite3简单用法完整例子》SQLite3是一个内置的Python模块,可以通过Python的标准库轻松地使用,无需进行额外安装和配置,:本文主要介绍python连接sqli... 目录1. 连接到数据库2. 创建游标对象3. 创建表4. 插入数据5. 查询数据6. 更新数据7. 删除

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

在 Spring Boot 中连接 MySQL 数据库的详细步骤

《在SpringBoot中连接MySQL数据库的详细步骤》本文介绍了SpringBoot连接MySQL数据库的流程,添加依赖、配置连接信息、创建实体类与仓库接口,通过自动配置实现数据库操作,... 目录一、添加依赖二、配置数据库连接三、创建实体类四、创建仓库接口五、创建服务类六、创建控制器七、运行应用程序八

Linux之UDP和TCP报头管理方式

《Linux之UDP和TCP报头管理方式》文章系统讲解了传输层协议UDP与TCP的核心区别:UDP无连接、不可靠,适合实时传输(如视频),通过端口号标识应用;TCP有连接、可靠,通过确认应答、序号、窗... 目录一、关于端口号1.1 端口号的理解1.2 端口号范围的划分1.3 认识知名端口号1.4 一个进程