计算机网络 —— 运输层(TCP三次握手)

news2025/1/10 3:10:22

计算机网络 —— 运输层(TCP三次握手)

  • 三次握手
  • 第一次握手
  • 第二次握手
  • 第三次握手
  • 两次握手行不行?

我们今天来学习TCP的三次握手:

三次握手

TCP三次握手是TCP协议中建立连接的过程,旨在确保双方准备好进行可靠的通信。这个过程包括三个步骤,每个步骤涉及一个数据包(也称作报文段)的交换。下面是三次握手的详细步骤:

  1. 第一次握手(SYN)
  • 客户端发送一个TCP报文段到服务器,标志位中的SYN(同步)置为1,表示希望建立连接。同时还包含一个初始序号(Initial Sequence Number, ISN)Client_ISN。这个报文不携带数据,但是会消耗一个序号。
  1. 第二次握手(SYN-ACK)
  • 服务器收到客户端的SYN报文后,如果同意建立连接,则发送一个报文段作为应答。这个报文段中SYN置为1,表示服务器也在进行连接请求;ACK(确认)置为1,表示确认收到了客户端的SYN报文。同时,服务器也会为自己选择一个初始序号Server_ISN,并将确认号(Acknowledgment Number, ACK)设置为Client_ISN + 1,以表明期望从客户端收到的下一个数据包的序号。这个报文同样不携带数据。
  1. 第三次握手(ACK)
  • 客户端收到服务器的SYN-ACK报文后,会再发送一个确认报文给服务器。这个报文的ACK置为1,确认号设置为Server_ISN + 1,表示确认收到了服务器的SYN报文。此时,客户端已经知道服务器准备好了,自己的序号则变为Client_ISN + 1。这个报文可以携带数据,也可以不携带。

完成这三次握手之后,客户端和服务器都进入了ESTABLISHED状态,表示连接已经建立,双方可以开始互相发送数据。

三次握手的目的是为了同步序列号、确认双方的接收能力、防止旧的重复连接请求干扰新的连接建立,并且能够初始化滑动窗口等连接参数,为后续的数据传输做准备。

有点懵是不是,我们一步一步来:

第一次握手

第一次握手(SYN)客户端发送一个TCP报文段到服务器,标志位中的SYN(同步)置为1,表示希望建立连接:

一开始,服务器端先建立传输控制块
在这里插入图片描述然后进入监听状态:

在这里插入图片描述
然后,客户端做同样的事:
在这里插入图片描述之后,TCP就会发送TCP连接请求报文段(第一次握手)
在这里插入图片描述同步位SNY设置为1,表明这是一个TCP请求报文段,seq是一开始初始化序号。

注意SYN设置为1时不能携带数据,但会消耗一个序号

第二次握手

这个时候,如果服务器同意连接,服务器会发送一个TCP连接请求确认,然后进入等待状态
在这里插入图片描述
同步位中的ACK和SYN都被设置为了1,序号字段seq被设置成立一个初始值y,确认端字号ack被设置为x+1,这是对TCP客户端所选的seq的确认。
在这里插入图片描述注意SYN设置为1时不能携带数据

第三次握手

收到服务器的确认之后,客户端会再发一个对服务器端的确认的确认
在这里插入图片描述
这次确认,确认位ACK设置为1,seq设置为x+1:
在这里插入图片描述这里注意TCP普通的确认报文段可以携带数据,如果不携带数据,则不会消耗序号。确认字段被设置为y+1,这是对服务器的确认中的seq的确认。
在这里插入图片描述
这个时候如果服务器接收到了TCP的连接确认的确认,便会建立连接状态开始链接。
在这里插入图片描述这就是三次握手,我们打个简单的比方:

想象一下两个人隔着一条河想要用一根绳子拉起一座桥来进行稳定的沟通和物资交换,这就是TCP建立连接的“三次握手”过程的形象比喻:

  1. 第一次握手: 假设甲方站在河的一边,手里拿着绳子的一端。他先向河对岸的乙方喊了一声:“我要搭桥了!”并轻轻抛出绳子的另一端到河面上,但没有完全扔过去。这里的“喊一声”就像是发送SYN包,告诉对方有建立连接的意图
  2. 第二次握手: 乙方听到后,回应道:“好的,我准备好了,接住绳子!”同时,他伸出自己的手准备抓住绳子,并紧握着自己这边的绳子一端。这一行为就像服务器回复的SYN-ACK包,不仅确认收到了甲方的意图,还表达了自己也有建立连接的意愿,并且做好了准备。
  3. 第三次握手: 甲方听到乙方的回应,并看到乙方已经准备好,于是用力把绳子完全甩到了乙方手中,并紧紧握住自己的那一端。这时,他说:“绳子已经交给你了,我们可以开始过桥了!”这个动作如同客户端发送的ACK包,确认连接已经成功建立,双方可以开始稳定地传递信息和物资了。

通过这样的三次互动,双方不仅确认了对方的存在和沟通的意愿,还确保了连接的稳定性和安全性,从而开始了可靠的“桥梁”交流。

两次握手行不行?

如果TCP连接建立的过程简化为两次握手,理论上似乎可以更快地建立起连接,但实际上会引入一些问题,影响网络通信的可靠性和安全性:

  1. 无法确认客户端的接收能力:在标准的三次握手过程中,第二次握手包含了服务器的SYN和ACK,这既是对客户端SYN的确认,也是服务器发出的连接请求。如果省略掉客户端对这个SYN的确认(即第三次握手),服务器无法确定客户端是否成功接收到了其发送的SYN+ACK报文。这样,服务器可能会误以为连接已建立,但实际上客户端可能并未准备好,或者根本没有收到服务器的响应。
  1. 老的连接请求问题:网络中可能存在延迟的分组(即“幽灵”分组),如果仅进行两次握手,当客户端发送了一个连接请求后因某种原因未收到服务器的响应,然后又发送了第二个连接请求并成功建立了连接。这时,如果第一个请求的响应延迟到达,根据两次握手的规则,服务器可能会错误地认为这是客户端的一个新连接请求,从而导致资源的无效占用或混乱。
  1. 安全性降低:缺少了第三次握手的确认步骤,可能会让恶意用户更容易发起伪造的连接请求(例如SYN泛洪攻击),因为建立连接所需的交互减少,使得恶意攻击的成本降低,防护起来更加困难。

假设我们是两次握手,有这么一个场景我发送了SYN包,但是因为网络的原因,我一直没收到服务器的确认连接,然后我重新发了一次,第二次的SYN包成功到达
在这里插入图片描述连接完毕之后,之前哪个延误的SYN到了,服务器以为又要连接,所以发送确认给客户端,但是客户端早就关闭连接,不会接收,这会导致服务器资源浪费
在这里插入图片描述打个比方:

想象你是一位住在山脚下的农夫(客户端),想要和山顶的朋友(服务器)建立固定的货物交换通道。这个过程如果简化为两次握手,情况会是这样的:

  1. 第一次尝试:你站在山脚下大喊:“嘿,山顶的朋友,我想明天开始每天给你送新鲜蔬菜,你准备好接收了吗?”(发送SYN请求)
  2. 山顶的回应:山顶的朋友听到了你的喊声,高兴地回应:“太好了,我已经准备了一个仓库,明天开始接收你的蔬菜!”同时,他开始清理通往山脚的路径,确保你能顺利上山。(发送SYN-ACK,既确认了你的请求,也表明自己已做好准备)
    按照两次握手的逻辑,到此你们的“协议”似乎达成了。但这里的问题是:
  • 不确定性:你虽然听到了山顶朋友的答应,但你并没有再次确认说:“好的,我知道你准备好了,明天见!”如果这时你的喊话因风声干扰没被听见,山顶的朋友可能会疑惑你是否真的听到了他的回应,或者是否准备好按计划行事。
  • 潜在的误解:如果在第一次尝试后不久,山里起了大雾,你的声音再次传来:“我明天开始送蔬菜…”,但这次是个回音(类似于网络中的延迟数据包)。山顶的朋友可能会误以为这是你新的询问,于是又做了一遍准备,造成了不必要的劳动。
    因此,缺少了第三次握手的明确确认,就如同农夫和山顶朋友之间少了最终的“成交确认”,可能导致误解、资源浪费,甚至整个交换计划的失败。三次握手就像是在说:“我准备好了,你呢?”,“我也准备好了,我们现在可以开始了!”这样确保了双方都明确了意图,准备工作到位,可以放心开始合作。

因此,三次握手虽然牺牲了一定的连接建立速度,但它确保了连接的可靠性和安全性,是目前TCP协议中不可或缺的一部分。

我们来看一道题:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1820566.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一个电话客服系统

简介 这是一个客服系统,使用的是USB电话盒。电话盒接入电话线 ,然后再插在在计算机上。当有电话拨入时,可以在电脑中自动弹出拨入电话号码的相关客户资料,并能够自动录音。 安装 一、运行setup.exe 二、按照提示安装好程序后&am…

Android Jetpack Compose入门教程(二)

一、列表和动画 列表和动画在应用内随处可见。在本课中,您将学习如何利用 Compose 轻松创建列表并添加有趣的动画效果。 1、创建消息列表 只包含一条消息的聊天略显孤单,因此我们将更改对话,使其包含多条消息。您需要创建一个可显示多条消…

openh264 帧内预测编码过程源码分析

函数关系 说明: 可以看到完成帧内预测编码的核心函数就是 WelsMdI16x16、WelsMdI4x4、WelsMdI4x4Fast 、WelsMdIntraChroma 四个函数。 原理 WelsMdI16x16函数 功能:针对16x16像素块的帧内模式决策过程: 局部变量申明;根据宏块…

python如何终止程序运行

方法1:采用sys.exit(0),正常终止程序,从图中可以看到,程序终止后shell运行不受影响。 方法2:采用os._exit(0)关闭整个shell,从图中看到,调用sys._exit(0)后整个shell都重启了(RESTAR…

卡塔尔.巴林:海外媒体投放-宣发.发稿效果显著提高

引言 卡塔尔和巴林两国积极采取措施,通过海外媒体投放和宣发,将本国的商业新闻和相关信息传达给更广泛的受众。在这一过程中,卡塔尔新闻网、巴林商业新闻和摩纳哥新闻网等媒体起到了关键作用。通过投放新闻稿,这些国际化的媒体平…

UITableView之显示单组数据Demo

需求 UITableView实现显示单组数据。尝试设置不同行高度不同。 效果: 数据展示 实现 与之前分组显示数据的区别在于懒加载的数据模型不同。 (1)声明数据模型类 类的属性一定要和plist中数据的字段保持一致 interface CZhero : NSObject /…

idea在空工程中添加新模块并测试的步骤

ServicesTest是空的工程,没有pom文件。现在需要在ServicesTest目录下添加新模块作为新的工程,目的是写一下别的技术功能。 原先目录结构,ServicesTest是空的工程,没有pom文件。下面的几个模块是新的工程,相互独立。 1.…

数栈xAI:轻量化、专业化、模块化,四大功能革新 SQL 开发体验

在这个数据如潮的时代,SQL 已远远超越了简单的查询语言范畴,它已成为数据分析和决策制定的基石,成为撬动企业智慧决策的关键杠杆。SQL 的编写和执行效率直接关系到数据处理的速度和分析结果的深度,对企业洞察市场动态、优化业务流…

谁说Python GUI难?用pywebview打造现代化GUI界面

在Python的世界里,我们经常需要为程序添加一个图形用户界面(GUI)。传统上,Tkinter、PyQt或Kivy等库是常用的选择。但是,今天我们要介绍的是一个更简单、更现代的方法——pywebview。它让你可以使用HTML、CSS和JavaScri…

OpenCV查找图像中的轮廓并且展示

1、查找轮廓随机用不同的颜色画出 import cv2 import numpy as npdef get_contour_colors(num_contours):# 定义颜色表 (BGR 格式)colors [(255, 0, 0),(255, 50, 0),(255, 100, 0),(255, 150, 0),(255, 200, 0),(255, 255, 0),(200, 255, 0),(150, 255, 0),(100, 255, 0),(5…

2.6数据报与虚电路

数据报 当作为通信子网用户的端系统要发送一个报文时,在端系统中实现的高层协议先把报文拆成若干个带有序号的数据单元,并在网络层加上地址等控制信息后形成数据报分组(即网络层PDU)中间结点存储分组一段很短的时间,找到最佳的路由后&#x…

【StructueEngineering】Wind Load Combination Patterns风荷载组合模式

文章目录 Combination PatternsBasic Rules of Combinations组合的基本规律Specific Combination Patterns1. First 8 Combinations (1 to 8)2. Middle 8 Combinations (9 to 16)3. Last 8 Combinations (17 to 24) Summary of CombinationsKey Variables and Parameters with …

Base64编码方式的介绍及其编码解码

一、Base64是什么 Base64是一种用于将二进制数据编码为ASCII字符的编码方式,主要目的是为了能够在文本环境中传输和存储二进制数据。这种编码方式广泛应用于电子邮件、HTTP协议和其他需要传输或存储二进制数据的地方。 二、发明Base64编码的原因 Base64编码的发明解…

《转载》前苏联的三进制计算机Setun

1、苏联的三进制计算机概述 早在 1956 年,就需要创建一种可在大学和实验室中使用的实用数字计算机模型。为此,需要一种易于学习、可靠、廉价但同时高效、专为大规模使用而设计的小型计算机。 对这种机器的要求:运行速度必须等于每秒数百次操作…

破解发展难题 台山这家合作社以农业社会化服务助推乡村振兴

风吹稻田千层浪,眼下,台山四九镇的早稻长势喜人,沉甸甸的稻穗迎风而动,已进入破口抽穗的关键期,即将在6月底陆续迎来丰收。在台山市明华汇种养专业合作社管理的稻田里,合作社负责人梁明喜正仔细观察着稻苗的…

(代数:解一元二次方程)可以使用下面的公式求一元二次方程 ax2+bx+c0 的两个根:

(代数:解一元二次方程)可以使用下面的公式求一元二次方程 ax2bxc0 的两个根: b2-4ac 称作一元二次方程的判别式。如果它是正值,那么一元二次方程就有两个实数根。 如果它为 0,方程式就只有一个根。如果它是负值,方程式无实根。 编写程序,提示…

单点登录分析介绍

文章目录 1、单点登录解决方案1.1、后端保存登录状态1.2、token模式 2、user服务-登录接口2.1、UserController2.2、UserInfoServiceImpl2.3、载荷2.4、响应2.5、Redis Desktop Manager 1、单点登录解决方案 多个系统只有一个登录服务 1.1、后端保存登录状态 1.2、token模式 …

WordPress、Typecho 站点如何让 CloudFlare 缓存加速

众所周知 WordPress、Typecho 都是著名动态博客站点(一个最简单的判断依据就是都要依赖结合数据库),这类站点在 CDN 缓存上都有一个致命的缓存弊端就是动静态请求的区分,理论上要让 CDN 绕过所有的动态请求,缓存所有的静态请求,否则就会造成前端登录和非登录状态的混乱,…

聊聊分布式集群的基本概念

在当前主流的分布式架构中,各种各样的集群技术几乎成了任何想要提升系统稳定性和处理能力的团队的必备技能。虽然各种中间件和系统都有让人看似眼花缭乱的集群实现方案,但其背后仍然逃不过一些核心的技术概念,我会结合几个我比较熟悉的中间件…

java.nio.charset.UnmappableCharacterException

问题 java.lang.IllegalArgumentException: java.nio.charset.UnmappableCharacterException: Input length 1 解释为编码转换有问题 问题错在位置 非汉字存在 打包的时候就会报异常