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

宝塔安装的MySQL无法连接的情况及解决方案

《宝塔安装的MySQL无法连接的情况及解决方案》宝塔面板是一款流行的服务器管理工具,其中集成的MySQL数据库有时会出现连接问题,本文详细介绍两种最常见的MySQL连接错误:“1130-Hostisn... 目录一、错误 1130:Host ‘xxx.xxx.xxx.xxx’ is not allowed

python如何下载网络文件到本地指定文件夹

《python如何下载网络文件到本地指定文件夹》这篇文章主要为大家详细介绍了python如何实现下载网络文件到本地指定文件夹,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...  在python中下载文件到本地指定文件夹可以通过以下步骤实现,使用requests库处理HTTP请求,并结合o

SpringBoot快速搭建TCP服务端和客户端全过程

《SpringBoot快速搭建TCP服务端和客户端全过程》:本文主要介绍SpringBoot快速搭建TCP服务端和客户端全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录TCPServerTCPClient总结由于工作需要,研究了SpringBoot搭建TCP通信的过程

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与

Java根据IP地址实现归属地获取

《Java根据IP地址实现归属地获取》Ip2region是一个离线IP地址定位库和IP定位数据管理框架,这篇文章主要为大家详细介绍了Java如何使用Ip2region实现根据IP地址获取归属地,感兴趣... 目录一、使用Ip2region离线获取1、Ip2region简介2、导包3、下编程载xdb文件4、J