当前位置: 首页 > news >正文

网络原理TCP之“三次握手“

TCP内核中的建立连接

众所周知,TCP是有连接的.

当我们在客户端敲出socket =new  Socket(serverIp,severPort)时,就在系统内核就在建立连接

真正建立连接是在系统内核中建立的,我们程序员只是调用相关的api.

在此处,我们把TCP的建立连接称为三次握手.

系统在内核建立连接时如上图所示,总共有四次交互,但是在实际过程中,其中的两次交互能够合二为一,所以我们称作"三次握手"

这个所谓的建立连接的过程,本质上就是通信双方各自给对方发起一个syn,各自给对方回应一个ack.

(这里客户端的信息告知服务器 这个操作确实在第一次握手的时候就完成了,但是最终确立这个连接要建立,确立出,后续要进行通信,得把所有的流程都走完)

虽然第一次"握手",客户端已经把自己的信息告诉服务器了,但是服务器具体是否要确定存储这个信息,还得再看看.

等到所有的"握手"环节都完成后,服务器才会最终保存客户端的相关信息.

首先,我们客户端作为发起通信的一方,应该首先发起syn(同步报文段),

此处的syn是一个特殊的TCP数据报.

1.没有载荷.不会携带应用层数据.

2.六个标志位中的第五位,为1.

虽然syn不会带有应用层载荷,但是也会带有IP报头/以太网数据帧帧头...更会有TCP报头

TCP包头就包含了客户端自己的端口.IP报头中就包含了客户端自己的IP.(这个过程,也是客户端在告诉服务器,我是谁)

这里当客户端第一次给服务器发起syn(同步报文)时,有两种可能性

1.服务器同意了,服务器表示我也愿意和你建立连接

2.服务器没同意.(一般来说这种情况比较少见,就是服务器负载极高的情况下,服务器完全无法响应,客户端太多了,直接就没下文了)

服务器收到syn之后,会返回ack(确认应答),意思就是收到了

接下来服务器还会再返回syn,代表我接收你的连接(我也愿意和你建立连接)

这里的syn指的是synchronized,同步,就是使其进入连接状态.客户端服务器就得相互配合好一系列工作.

syn这样的数据包,不携带载荷,没有应用层数据,也就不代表任何应用程序的业务逻辑,syn起到的作用就只是"打招呼",因此我们就把这个动作称为"握手".

简略版的三次握手

详细版三次"握手"

三次"握手的意义"

1.三次握手,可以针对通信路径,进行投石问路,初步的确认一下通信链路是否畅通.(可靠性的前提条件)(关注点在中间过程)

2.三次握手,也是在验证通信双方,发送能力和接收能力是否正常.(关注点在两端)

(1)客户端首先发送一个syn报文,服务器就会知道客户端的数据发送能力和服务器的数据接收能力是正常的,但是此时客户端并不知道.

(2)服务器给客户端返回syn+ack报文,客户端就会知道自己的数据接收和服务器的数据发送功能是正常的,也包括客户端的数据发送和服务器的数据接收功能,但是服务器此时并不知道

(3)客户端给服务器返回ack报文,此时,服务器就知道了自己的数据发送和客户端的数据接收功能是正常的,当然也包括客户端的数据发送和服务器的数据接收功能是正常的.

3.三次握手的过程中也会协商一些必要的參数

 通信是客户端服务器两方的事情.要配合.其中的有些内容要保持一致.

TCP中也是有很多參数要进行协商的.往往是以"选项"部分来体现的.

最少0字节

最多40字节

其中有一个关键的信息,TCP通信的序号,起始值.

TCP一次通信过程中,序号不是从0或者从1开始计算的.

而是选择一个比较大的数字,以这个数字开头来计算的

即使是同一个客户端和服务器,每次连接,开始的序号都会不同,(这样设计主要是为了避免"前朝的剑,斩本朝的官").

第一次连接的过程中,传输的有一个数据包,还没有发送成功,还在数字链路里面进行等待,迟迟没有到达对端.等待终于到了对端的实收,已经是另外一个客户端,另外一次连接了,之前的连接早没了,现在是新的连接了!!

此时,这份数据应该被丢弃!!数据报按照ip+端口进行识别.第一个连接,是用客户端A来连的.第二个连接是用客户端B来连的.(恰好是同一个端口的话,客户端概率是比较低的,服务器概率很大)

 此时数据到达这一边,早已不是之前的客户端了,再把这个数据进行发送,就不合适了,

此时,应该丢弃这个数据包

在这种情况下,如何识别出数据是之前的数据包??

就是通过序号识别出来的!!

(序号是不同的,也不是随机的,背后还有一系列分配策略)

正常数据包的序号都是从开始序号往后依次排的.就算偶尔丢包,偶尔数据部连续,差异也不会很大.

"前朝"的数据包的序号和本朝的数据包的序号差异是非常大的,很容易一眼识别出来

断开连接(四次挥手)

连接,本质上就是让通信双方保存对方的信息!!

每个客户端/服务器,都要保存很多的对端信息.

一旦多了,就要使用"数据结构".

断开连接的本质目的,就是为了把对端的信息,从数据结构中删除掉/释放掉.

有了"逻辑删除之后",此时就相当于断开连接了.

相关文章:

网络原理TCP之“三次握手“

TCP内核中的建立连接 众所周知,TCP是有连接的. 当我们在客户端敲出socket new Socket(serverIp,severPort)时,就在系统内核就在建立连接 真正建立连接是在系统内核中建立的,我们程序员只是调用相关的api. 在此处,我们把TCP的建立连接称为三次握手. 系统在内核建立连接时如上…...

990-03产品经理与程序员:什么是 IT 与业务协调以及为什么它很重要?

What is IT-business alignment and why is it important? 什么是IT-业务一致性?为什么它很重要? It’s more important than ever that IT and the business operate from the same playbook(剧本). So why do so many organizations struggle to ach…...

Java Web(七)__Tomcat(二)

Tomcat工作模式 Tomcat作为Servlet容器,有以下三种工作模式。 1)独立的Servlet容器,由Java虚拟机进程来运行 Tomcat作为独立的Web服务器来单独运行,Servlet容器组件作为Web服务器中的一部分而存在。这是Tomcat的默认工作模式。…...

【项目实战】帮美女老师做一个点名小程序(Python tkinter)

前言 博主有一个非常漂亮的老师朋友😍。最近,她急需一个能够实现随机点名的小程序,而博主正好擅长这方面的技术🤏。所以,今天博主决定为她制作一个专门用于点名的小程序💪。 博主在美女老师面前吹完牛皮之…...

Elasticsearch 去重后求和

标题的要求可以用如下 SQL 表示 select sum(column2) from (select distinct(column1),column2 from table)t 要如何用 DSL 实现呢,先准备下索引和数据 PUT test_index {"mappings": {"properties": {"column1": {"type"…...

考研数学——高数:函数与极限(3)

函数的连续性与间断点 函数的连续性 左连续 右连续 区间上的连续性 在xo处连续 函数的间断点 第一类间断点(左右极限都存在) 可去间断点: f(xo-0)= f(xo+0) 跳跃间断点: f(xo-0)≠ f(xo+0) 第二类间断点(震荡间断点、无穷间断点)...

LeetCode49 字母异位词分组

LeetCode49 字母异位词分组 在这篇博客中,我们将探讨 LeetCode 上的一道经典算法问题:字母异位词分组。这个问题要求将给定的字符串数组中的字母异位词组合在一起,并以任意顺序返回结果列表。 问题描述 给定一个字符串数组 strs&#xff0…...

【Python】Windows本地映射远程Linux服务器上的端口(解决jupyter notebook无法启动问题)

创作日志: 学习深度学习不想在本地破电脑上再安装各种软件,我就用实验室的服务器配置环境,启动jupyter notebook时脑子又瓦特了,在自己Windows电脑上打开服务器提供的网址,那肯定打不开啊,以前在其它电脑上…...

C++面试:用户态和内核态的基本概念、区别

目录 一、基本概念 概念: 区别: 二、Windows示例 基础介绍 用户态到内核态的切换过程: 程序实例 三、Linux示例 特权级别: 用户态到内核态的切换过程: 调度和中断处理: 程序实例 总结 在操作系…...

Vue计算属性computed()

1. 计算属性定义 获取计算属性值 <div>{{ 计算属性名称}}</div>创建计算属性 let 定义的属性ref/reactive....let 计算属性名称 computed(() > {//这里写函数式,函数式里面包含定义属性//只有这个包含的定义属性被修改时才出发此函数式//通过计算属性名称co…...

JWT学习笔记

了解 JWT Token 释义及使用 | Authing 文档 JSON Web Token Introduction - jwt.io JSON Web Token (JWT&#xff0c;RFC 7519 (opens new window))&#xff0c;是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准&#xff08;(RFC 7519)。该 token 被设计为紧凑…...

WSL里的Ubuntu 登录密码忘了怎么更改

环境&#xff1a; Win10 专业版 WSL2 如何 Ubuntu22.04 问题描述&#xff1a; WSL里的Ubuntu 登录密码忘了怎么更改 解决方案&#xff1a; 在WSL中的Ubuntu系统中&#xff0c;忘记了密码&#xff0c;可以通过以下步骤重置密码&#xff1a; 1.打开命令提示符或PowerShel…...

【软件测试面试】要你介绍项目-如何说?完美面试攻略...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、测试面试时&am…...

【Crypto | CTF】RSA打法 集合

天命&#xff1a;我发现题题不一样&#xff0c;已知跟求知的需求都不一样 题目一&#xff1a;已知 p q E &#xff0c;计算T&#xff0c;最后求D 已知两个质数p q 和 公钥E &#xff0c;通过p和q计算出欧拉函数T&#xff0c;最后求私钥D 【密码学 | CTF】BUUCTF RSA-CSDN…...

在springboot中调用openai Api并实现流式响应

之前在《在springboot项目中调用openai API及我遇到的问题》这篇博客中&#xff0c;我实现了在springboot中调用openai接口&#xff0c;但是在这里的返回的信息是一次性全部返回的&#xff0c;如果返回的文字比较多&#xff0c;我们可能需要等很久。 所以需要考虑将请求接口响应…...

C++构造函数重难点解析

一、C构造函数是什么 C的构造函数是一种特殊的成员函数&#xff0c;用于初始化类的对象。它具有与类相同的名称&#xff0c;并且没有返回类型。构造函数在创建对象时自动调用&#xff0c;并且可以执行必要的初始化操作。 二、C构造函数特点 类的构造函数不能被继承&#xff0c…...

QT day3 作业2.22

思维导图&#xff1a; 作业&#xff1a; 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到…...

AR汽车行业解决方案系列之2-远程汽修

在汽车行业中&#xff0c;AR技术的应用正悄然改变着整个产业链的运作方式&#xff0c;应用涵盖培训、汽修、汽车售后、PDI交付、质检以及汽车装配等&#xff0c;AR技术为多个环节都带来了前所未有的便利与效率提升。 安宝特AR将以系列推文的形式为读者逐一介绍在汽车行业中安宝…...

每日五道java面试题之spring篇(五)

目录&#xff1a; 第一题. 使用 Spring 有哪些方式&#xff1f;第二题. 什么是Spring IOC 容器&#xff1f;第三题. 控制反转(IoC)有什么作用?第四题. IOC的优点是什么&#xff1f;第五题. BeanFactory 和 ApplicationContext有什么区别&#xff1f; 第一题. 使用 Spring 有哪…...

挑战杯 基于YOLO实现的口罩佩戴检测 - python opemcv 深度学习

文章目录 0 前言1 课题介绍2 算法原理2.1 算法简介2.2 网络架构 3 关键代码4 数据集4.1 安装4.2 打开4.3 选择yolo标注格式4.4 打标签4.5 保存 5 训练6 实现效果6.1 pyqt实现简单GUI6.3 视频识别效果6.4 摄像头实时识别 7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xf…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...