【网络】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

相关文章

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

SpringBoot连接Redis集群教程

《SpringBoot连接Redis集群教程》:本文主要介绍SpringBoot连接Redis集群教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 依赖2. 修改配置文件3. 创建RedisClusterConfig4. 测试总结1. 依赖 <de

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

java连接opcua的常见问题及解决方法

《java连接opcua的常见问题及解决方法》本文将使用EclipseMilo作为示例库,演示如何在Java中使用匿名、用户名密码以及证书加密三种方式连接到OPCUA服务器,若需要使用其他SDK,原理... 目录一、前言二、准备工作三、匿名方式连接3.1 匿名方式简介3.2 示例代码四、用户名密码方式连接4

MySQL 表的内外连接案例详解

《MySQL表的内外连接案例详解》本文给大家介绍MySQL表的内外连接,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录表的内外连接(重点)内连接外连接表的内外连接(重点)内连接内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

电脑蓝牙连不上怎么办? 5 招教你轻松修复Mac蓝牙连接问题的技巧

《电脑蓝牙连不上怎么办?5招教你轻松修复Mac蓝牙连接问题的技巧》蓝牙连接问题是一些Mac用户经常遇到的常见问题之一,在本文章中,我们将提供一些有用的提示和技巧,帮助您解决可能出现的蓝牙连接问... 蓝牙作为一种流行的无线技术,已经成为我们连接各种设备的重要工具。在 MAC 上,你可以根据自己的需求,轻松地

Linux网络配置之网桥和虚拟网络的配置指南

《Linux网络配置之网桥和虚拟网络的配置指南》这篇文章主要为大家详细介绍了Linux中配置网桥和虚拟网络的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、网桥的配置在linux系统中配置一个新的网桥主要涉及以下几个步骤:1.为yum仓库做准备,安装组件epel-re