网络原理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来连的.(恰好是同一个端口的话,客户端概率是比较低的,服务器概率很大)

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

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

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

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

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

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

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

断开连接(四次挥手)

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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux进程】进程状态---进程僵尸与孤儿

📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 目录 1.进程排队2.进程状态…

OSCP靶场--Nickel

OSCP靶场–Nickel 考点(1.POST方法请求信息 2.ftp,ssh密码复用 3.pdf文件密码爆破) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.237.99 -sV -sC -p- --min-rate 5000 Starting Nmap 7.92 ( https://nmap.org ) at 2024-02-22 04:06 EST Nm…

机器学习基础(五)监督与非监督学习的结合

导语:上一节我们详细探索非监督学习的进阶应用,详情可见: 机器学习基础(四)非监督学习的进阶探索-CSDN博客文章浏览阅读613次,点赞15次,收藏13次。非监督学习像一位探险家,挖掘未标…

前后端分离Vue+ElementUI+nodejs蛋糕甜品商城购物网站95m4l

本文主要介绍了一种基于windows平台实现的蛋糕购物商城网站。该系统为用户找到蛋糕购物商城网站提供了更安全、更高效、更便捷的途径。本系统有二个角色:管理员和用户,要求具备以下功能: (1)用户可以修改个人信息&…

ARMv8-AArch64 的异常处理模型详解之异常向量表vector tables

目录 一,AArch64 异常向量表 二,栈指针以及SP寄存器的选择 三,从异常返回 一,AArch64 异常向量表 异常向量表(vector tables)是一组存放于普通内存(normal memory)空间的&#xf…

视频号视频下载(如何把视频号中的视频下载下来)

在如今的信息时代,热点创作者和科技创作者们的素材库越来越丰富,视频号作为一种新兴的媒体形式,其中蕴含的优质内容更是不可或缺。但是,如何将心仪的视频号视频下载下来,进行二次创作并在其他平台发布呢?今…

Vue+SpringBoot打造开放实验室管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实验管理模块2.4 实验设备模块2.5 实验订单模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示五、样例代码5.1 查询实验室设备5.2 实验放号5.3 实验预定 六、免责说明 一、摘…

Kafka集群详解

Kafka集群的目标 1、高并发 2、高可用(防数据丢失) 3、动态伸缩 Kafka集群规模如何预估 吞吐量: 集群可以提高处理请求的能力。单个Broker的性能不足,可以通过扩展broker来解决。 磁盘空间: 比如,如…

Ansible user 模块 该模块主要是用来管理用户账号

目录 参数语法验证创建用户删除用户验证 删除用户 参数 comment  # 用户的描述信息 createhome  # 是否创建家目录 force  # 在使用stateabsent时, 行为与userdel –force一致. group  # 指定基本组 groups  # 指定附加组,如果指定为(groups)表示删除所有…

Nest.js权限管理系统开发(二)连接MySQL、Redis

安装MySQL及相关依赖 下载dmg文件安装 前往MySQL :: Download MySQL Community Server下载最新版本的MySQL。 打开系统设置,拉到最下方可以看到MySQL,打开看到两个绿点表示安装成功,也可以在这里修改MySQL密码。 配置环境变量 打开终端配…

Windows中的Git Bash运行conda命令:未找到命令的错误(已解决)

在windows中的Gitbash中 打开激活conda环境,并运行(前提是你先安装好git(自己去官网下载))。 要能够在Gitbash上运行Conda, 临时配置 如果你只是临时用一下,就是临时爽一把,那就按…

独立站建站全攻略:从0到1打造专属在线商业平台

独立站建站全攻略:从0到1打造专属在线商业平台 随着互联网的普及和发展,越来越多的企业和个人开始认识到拥有一个独立站的重要性。独立站不仅可以提升品牌形象,还能为企业带来更多的流量和潜在客户。本文将为大家详细介绍独立站建站的全过程…

代码随想录day32--动态规划理论基础

什么是动态规划 动态规划简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点一定要和贪心区别出来,贪心没有状态推导,而是直接从局部直接…

【深度学习】主要提出者【Hinton】中国大会最新演讲【通往智能的两种道路】

「但我已经老了,我所希望的是像你们这样的年轻有为的研究人员,去想出我们如何能够拥有这些超级智能,使我们的生活变得更好,而不是被它们控制。」 6 月 10 日,在 2023 北京智源大会的闭幕式演讲中,在谈到如…

opengles 顶点坐标变换常用的矩阵(九)

文章目录 前言一、opengles 常用的模型矩阵1. 单位矩阵2. 缩放矩阵3. 位移矩阵4. 旋转矩阵二、第三方矩阵数学库1. glm1.1 ubuntu 上安装 glm 库1.2 glm 使用实例1.2.1 生成一个沿Y轴旋转45度的4x4旋转矩阵, 代码实例如下1.2.2 生成一个将物体移到到Z轴正方向坐标为5处的4x4 vi…

K线实战分析系列之七:行情顶部的看跌信号——黄昏星形态

K线实战分析系列之七:行情顶部的看跌信号——黄昏星形态 一、黄昏星形态二、黄昏线总结 一、黄昏星形态 二、黄昏线总结 黄昏星的高点形成阻力位,启明星的低点形成支撑位中间的星线实体与第一根K线的实体跳空区域比较宽,第三根K线覆盖了第一…

SSM项目集成Spring Security 4.X版本 之 加入DWZ,J-UI框架实现登录和主页菜单显示

目录 前言 一、加入DWZ J-UI框架 二、实现登录页面 三、实现主页面菜单显示 前言 大家好!写文章之前先列出几篇相关文章。本文内容也在其项目中接续实现。 一. SSM项目集成Spring Security 4.X版本(使用spring-security.xml 配置文件方式&#xff…

旅游组团自驾游拼团系统 微信小程序python+java+node.js+php

随着社会的发展,旅游业已成为全球经济中发展势头最强劲和规模最大的产业之一。为方便驴友出行,寻找旅游伙伴,更好的规划旅游计划,开发一款自驾游拼团小程序,通过微信小程序发起自驾游拼团,吸收有车或无车驴…

CentOS安装Redis教程

CentOS安装Redis教程 一、Redis安装包压缩文件下载二、把下载好的Redis安装包压缩文件上传到服务器三、Redis安装四、Redis相关配置五、运行redis并指定配置文件 一、Redis安装包压缩文件下载 下载地址:Redis官网 省事链接奉上:Redis 6.2.14网盘下载链接…

在Linux服务器上部署一个单机项目

目录 一、jdk安装 二、tomcat安装 三、MySQL安装 四、部署项目 一、jdk安装 1. 上传jdk安装包 jdk-8u151-linux-x64.tar.gz 进入opt目录,将安装包拖进去 2. 解压安装包 这里需要解压到usr/local目录下,在这里我新建一个文件夹保存解压后的文件 [r…