【网络知识面试】初识协议栈和套接字及连接阶段的三次握手

news2024/9/29 1:30:29

 接上一篇:【网络面试必问】浏览器如何委托协议栈完成消息的收发

1. 协议栈

 一直对操作系统系统的内核协议栈理解的模模糊糊,借着这一篇博客做一下简单梳理。 我觉得最直白的理解,内核协议栈就是操作系统中的一个网络控制软件,就是一段程序代码,它负责和网卡驱动程序交互,实现消息的发送和接收。在探究协议栈内部原理之前,先从整体上看下TCP/IP软件采用的分层结构。

在这里插入图片描述
 在这张图中,可以看到从上往下的层级结构中,上面的部分会向下面的委派工作,下面的部分实际来执行。其中,操作系统这一层,协议栈包含了两部分,第一部分是负责TCP协议和UDP协议的数据收发部分,他们直接对接的是应用程序的委托,第二部分是IP协议控制的网络包收发操作部分,比如TCP协议就会将数据包交由IP协议来做包切分,然后发送给通讯对象。
 当然IP协议也不能直接发送网络包,IP下面的网卡驱动程序负责控制网卡硬件,最下面的网卡实现最终的收发操作,也就是对网线中的信号进行发送和接收。

2. 套接字

 套接字也是个让人迷惑不解的网络词汇,英文是socket,大概是迷人的英译汉困惑了很多人,看一下它的英文释义:
在这里插入图片描述
 所以吧,完全可以把客户端和服务端的套接字想象成两个插座,然后中间用双插头的电线连接起来,各种数据就从这根电线里面流动。
 其实,套接字socket就是位于协议栈内部的一块内存空间,记录了用于通讯操作的控制信息,比如通讯对象的IP地址、端口号以及通讯操作的进行状态等等,这个内存空间在编码层面被命名为socket的对象实体。这里面提到了通讯操作的控制信息,比如,在发送数据时,数据会被差分成很多网络包,发送方要知道接收方是否收到了某个网络包,接收方可能返回了收到网络包的确认信息,也可能包丢失,所以发送方的套接字中就会记录某个包对方已收到的消息或者某个包已发送了的多场时间,以便确定是否重新发送。
 当然,套接字中记录的可远不止这些控制信息,上面的只是其中一个例子。套接字中记录了各种用于控制通讯操作的控制信息,协议栈通过这些信息决定下一步的动作,这就是套接字的作用。
 在计算机中,我们可以通过 netstat命令查看真正的套接字,如下:

在这里插入图片描述

3. 创建套接字

 前面,我们提到浏览器通过调用Socket库的socket()程序组件来创建套接字,现在我们深入到协议栈内部,看一下实现原理。

  • 申请内存: 首先,协议栈会开辟一块存放套接字的内存空间,相当于存放控制通讯操作的控制信息的容器,但是这个容器是空的。
  • 返回描述符: 其次,协议栈会将代表这个套接字的描述符返回给应用程序,用于后续区分多个套接字。
  • 存放描述符: 应用程序如浏览器会将此描述符存放于自己的内存空间中,后续收发消息等操作时就可以把数据和描述符告知协议栈,以进行后续操作。

 但是直到现在,这块内存还是空的,没有存放任何控制信息。

4. 连接服务器

 连接实际上是通讯的双方交换控制信息,并且在自己的套接字中记录这些信息,比如对方的IP和端口号就是最典型的例子。前面我们提到,套接字刚创建之初是没有存放任何数据的,也不知道通讯对象是谁。

 另外,连接阶段,还会分配一块临时存放数据的内存空间,即缓冲区,用于存放接下来数据收发阶段的信息。
 前面,我们提到,浏览器会通过调用Socket库中的connect()程序组件完成连接的过程:

     connect(<套接字描述符>, <服务器IP地址>, <服务器端口号>, ...);

 通过connect()函数,浏览器告诉协议栈,找到描述符对应的套接字,并提供了连接对象的IP地址和端口号,下面连接的动作就开始了,在协议栈中,TCP模块会与此IP对应的服务器的TCP模块交换控制信息。

 这里会经过三次握手的过程,在熟悉这个过程之前,我们需要了解网络包的结构,正常情况每次数据请求都会被拆分成很多个网络包,这些网络包会包含很多头部信息,如TCP头部控制信息、IP头部控制信息等,通过这些头部信息最终找到目标服务器。但是在连接阶段,因为还没有数据产生,所以数据块部分是空的,只有各种头部控制信息。

在这里插入图片描述
 下面我们看一下简略版的三次握手阶段:

  • 第一次握手: 首先,客户端创建一个不包含数据的网络包,只有表示连接控制信息的头部,头部中包含IP、端口号等信息。同时将头部中的控制位SYN比特标记为1,表示连接。接下里,TCP模块会将此网络包传递给IP模块并委托它发送给服务器。根据TCP头部中的端口号,可以顺利找到服务器中对应的套接字。
  • 第二次握手: 服务器端的套接字,会写入相应信息,这里主要包含客户端的IP地址,端口号等,并将状态改为正在连接。同时服务端的TCP模块会将响应的网络包头部设置发送方和接收方的端口号,同时将SYN比特标记为1,ACK控制位标记为1,ACK=1表示收到了第一次握手的报文。网络中经常会发生错误导致网络包丢失,因此双方在通讯时必须相互确认对方已收到网络包,设置ACK标记位就是来进行这一步确认的。以上步骤完成后,服务器TCP模块也会委托IP模块进行网络包的发送。
  • 第三次握手: 服务器返回的网络包到达客户端后,客户端会通过TCP头部的SYN=1确认操作是否成功,如成功,会在客户端套接字中写入服务器的IP地址、端口号,同时将状态改为连接完成。接下来,客户端也要将ACK比特位设置为1并发送给服务器,告诉服务器刚才的网络包已收到,服务器接收到这个包之后,连接操作才算全部完成。
  •  通过上面三次握手的步骤,可以看到服务器和客户端的套接字写入信息分别是在第二步和第三步完成的。接下来,套接字就可以进入收发数据的状态了,可以想象成有根管子将这两个套接字连在了一起,这就是连接。至此,协议栈的操作就结束了。

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

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

相关文章

【git】git常用指令(项目一般使用流程示例)

文章目录 创建开发环境clone到本地查看分支创建自己的开发分支切换到开发分支 开发完成上传到仓库判断目前本地仓库的状态新内容提交到暂存区新内容更新到本地仓库新内容推到远端仓库dev1.0并入主分支1.切换到主分支2.合并3.推主分支上远端仓库 回退版本主分支更新了&#xff0…

软件产品登记测试为何如此重要?

软件产品登记测试为何如此重要&#xff1f; 软件产品登记测试报告&#xff0c;是对客户的软件产品进行功能性的检测和验证&#xff0c;确保这些功能都得以实现并能正常运行&#xff0c;可作为国家高新、增值税退税、双软评估、首套台软件的检测证明材料。 软件登记测试是“双软…

three.js中聚光灯及其属性介绍

一、聚光灯及其属性介绍 Three.js中的聚光灯&#xff08;SpotLight&#xff09;是一种用于在场景中创建聚焦光照的光源类型。它有以下属性&#xff1a; color&#xff1a;聚光灯的颜色。 intensity&#xff1a;聚光灯的强度。 distance&#xff1a;聚光灯的有效距离。 angl…

知识管理工具:在信息时代下的组织智慧管理

随着信息时代的到来&#xff0c;企业面临着前所未有的信息爆炸和快速变化的挑战。如何高效地管理和利用这些信息已经成为了企业生存和发展的关键。在这种背景下&#xff0c;知识管理工具应运而生&#xff0c;为企业提供了优秀的解决方案。 知识管理工具的定义与特点 知识管理的…

DAMA数据治理CDGA/CDGP认证考试备考经验分享

一&#xff0c;关于DAMA中国和CDGA/CDGP考试 国际数据管理协会&#xff08;DAMA国际&#xff09;是一个全球性的专业组织&#xff0c;由数据管理和相关的专业人士组成&#xff0c;非营利性机构&#xff0c;厂商中立。协会自1980年成立以来&#xff0c;一直致力于数据管理和数字…

gralylog介绍与安装

介绍 Graylog是一个开源的日志管理和分析平台&#xff0c;用于收集、存储、分析和可视化大量日志数据。它提供了一个集中化的解决方案&#xff0c;可以帮助组织有效地处理分散在各种系统和应用程序中的日志信息。 以下是Graylog的主要特点和功能&#xff1a; 日志收集&#x…

【AI工具】-MockingBird-语音合成语音克隆

简介 MockingBird&#xff1a; 英文翻译&#xff1a;反舌鸟&#xff0c;也可能来自《杀死一只知更鸟》&#xff08;英语&#xff1a;To Kill a Mockingbird&#xff09;&#xff0c;台译“梅冈城故事”&#xff0c;中国大陆译“杀死一只知更鸟”&#xff0c;直译应为“杀死一…

【Python】python进阶篇之数据库操作

数据库操作 pip3安装mysql依赖 pip3 list|grep mysqlpip3 install mysql-connector-python #指定版本 pip3 install mysql-connector-python版本号 #升降版本 pip3 install --upgrade mysql-connector-python版本号原生SQL操作 操作mysql可以使用pymsql或mysql-connector-py…

基于html+css的图展示138

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

第三章 决策树

文章目录 第三章 决策树3.1基本流程3.2划分选择3.2.1信息增益3.2.2增益率3.2.3基尼指数 3.3剪枝处理3.3.1预剪枝3.3.2后剪枝 3.4连续与缺失值3.4.1连续值处理3.4.2缺失值处理 3.5多变量决策树3.7实验 第三章 决策树 3.1基本流程 决策过程&#xff1a; 基本算法&#xff1a; …

灵雀云获Gartner® 首份《DevOps平台魔力象限报告》“荣誉提及”

随着平台工程理念的崛起&#xff0c;企业使用的独立的DevOps工具链逐渐向更先进、更便捷的DevOps平台演进。Gartner发布了首份DevOps平台魔力象限报告&#xff08;Gartner Magic Quadrant for DevOps Platforms&#xff09;。在这个备受关注的报告中&#xff0c;中国云原生厂商…

大势智慧软硬件技术答疑第五期

1.控制点误差表达到多少就可以&#xff1f; 答&#xff1a;水平和高程误差在0.01左右就可以&#xff0c;图示精度是满足的。 2.三维影像有颜色&#xff0c;为什么生成的是二维影像是黑色的&#xff1f; 答&#xff1a;使用dasviewer的工具-输出正射图再试试。 3.最新模方对ps版…

JMeter中常见的四种参数化实现方式是什么?

1 参数化释义 什么是参数化&#xff1f;从字面上去理解的话&#xff0c;就是事先准备好数据&#xff08;广义上来说&#xff0c;可以是具体的数据值&#xff0c;也可以是数据生成规则&#xff09;&#xff0c;而非在脚本中写死&#xff0c;脚本执行时从准备好的数据中取值。 参…

浅析移动警务App中的技术痛点与挑战

移动警务是指警务机关利用移动通信技术和移动设备&#xff0c;实现警务信息化、智能化和移动化的一种工作模式。通过移动警务&#xff0c;警务人员可以随时随地进行警务工作&#xff0c;提高警务反应速度和效率。 移动警务通常包括以下方面的内容&#xff1a; 移动巡逻&#x…

【ArcGIS Pro二次开发】(43):线闭合

当我们需要将多段线【polyline】转为面【polygon】的时候&#xff0c;必须保证线是闭合的&#xff0c;不然是无法生成面的&#xff0c;如下图&#xff1a; 如果cad线段&#xff0c;可以在属性里将闭合选项设置为是&#xff0c;实现线的闭合&#xff1a; 但如果是在ArcGIS Pro里…

【inpho精品教程】07 动连点自动提取和区域网平差

【inpho精品教程】07 动连点自动提取和区域网平差 文章目录 【inpho精品教程】07 动连点自动提取和区域网平差一、数据及参数检查二、参数设置三、运行四、 连接点提取失败的原因五、 连接点较差的原因一、数据及参数检查 在动连点自动提取和区域网平差之前,首先要检查工程中…

Miniconda安装使用教程

下载 官网地址&#xff1a;https://docs.conda.io/en/latest/miniconda.html 支持的系统&#xff1a; Windows 10 or newer, 64-bit macOS 10.13, or Linux, including Ubuntu, RedHat, CentOS 7, and others. 支持的系统架构&#xff1a; Windows- 64-bit x86, 32-bit x86; m…

Json 数据通用提取工具,使用 HTML JavaScript [单文件离线版]

Gitee 地址链接 Json2Csv js html 实现的一款通用型JSON数据提取工具&#xff0c;支持自动识别JSON数据节点并有序提取为CSV文件。 Convenient JSON data extraction tool. 使用简介 数据路径&#xff1a;设置Json中数据所处路径&#xff0c;如’root.topics.data’ ‘data.…

JavaWeb小记——请求对象request

目录 request对象 获取请求行 获取请求方式 获取项目的上下文路径 获取URI 获取URL 获取IP地址 获取协议版本 获取请求参数 获取请求头 获取日期头 获取数字头 获取请求体 获取请求参数 通用方式获取请求参数 单个获取 针对复选框 获取所有参数&#xff08;map&…

Matlab基础知识汇总(小白速成)

1.矩阵 1.矩阵运算符 运算符号说明具体表现实现转置A.矩阵转置共轭转置A复矩阵共轭转置&#xff0c;当A为实数矩阵时等价于A.加减AB、A-B矩阵元素之间相互进行加减数与矩阵加减KA、K-A数与矩阵的加减操作数乘以矩阵k*A数对矩阵中的每个元素进行相乘矩阵相乘A * B A.*B乘法运算…