【网络面试(4)】协议栈和套接字及连接阶段的三次握手原理

news2025/1/22 17:56:22

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/1347510.html

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

相关文章

【nodejs】前后端身份认证

前后端身份认证 一、web开发模式 服务器渲染&#xff0c;前后端分离。 不同开发模式下的身份认证&#xff1a; 服务端渲染推荐使用Session认证机制前后端分离推荐使用JWT认证机制 二、session认证机制 1.HTTP协议的无状态性 了解HTTP协议的无状态性是进一步学习Session认…

appium入门基础

介绍 appium支持在不同平台的UI自动化&#xff0c;如web,移动端,桌面端等。还支持使用java&#xff0c;python&#xff0c;js等语言编写自动化代码。主要用于自动化测试脚本&#xff0c;省去重复的手动操作。 Appium官网 安装 首先必须环境有Node.js用于安装Appium。 总体来…

接入Cloudflare后Nginx和Django获取用户真实IP的办法

可以用Nginx的real_ip的相关命令来实现这个需求。 01-real_ip命令集详解 real_ip命令的使用分为两个步骤: 01-1-设置从哪些代理IP获取真实IP 第1个步骤&#xff1a;通过set_real_ip_from命令设置从哪些代理IP请求获取真实的IP,比如下面的命令&#xff1a; set_real_ip_from…

2022年全球软件质量效能大会(QECon北京站2022)-核心PPT资料下载

一、峰会简介 当前&#xff0c;新一轮科技革命和产业变革正在重塑全球经济格局&#xff0c;以云计算为代表的新一代信息技术创新活跃&#xff0c;与实体经济深度融合&#xff0c;推动泛在连接、数据驱动、智能引领的数字经济新形式孕育而生。 新兴技术的出现给测试乃至整个软…

探索 Vue 异步组件的世界:解锁高效开发的秘密(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

JavaScript 基础通关

快速熟悉 JavaScript 的基础语法&#xff0c;比较高级的比如事件放在后面的笔记中。 JavaScript 1. JavaScript 介绍 1.1 JavaScript 基本介绍 JavaScript 是一门运行在客户端&#xff08;浏览器&#xff09;的编程语言&#xff0c;实现人机交互的效果。实现网页特效、表单验…

SpringBoot学习(一)

注&#xff1a;此为笔者学习狂神说SpringBoot的笔记&#xff0c;其中包含个人的笔记和理解&#xff0c;仅做学习笔记之用&#xff0c;更多详细资讯请出门左拐B站&#xff1a;狂神说!!! Spring Boot 是一种基于 Spring 框架的开发模式&#xff0c;旨在简化 Spring 应用程序的创…

学生管理系统(vue + springboot)

学生管理系统&#xff08;vuespringboot&#xff09;资源-CSDN文库 项目介绍 这是一个采用前后端分离开发的项目&#xff0c;前端采用 Vue 开发、后端采用 Spring boot Mybatis 开发。 项目部署 ⭐️如果你有 docker 的话&#xff0c;直接 docker compose up 即可启动&#…

NullByte

信息收集 # nmap -sn 192.168.1.0/24 -oN live.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2023-12-29 09:23 CST Nmap scan report for 192.168.1.1 Host is up (0.00038s latency). MAC Address: 00:50:56:C0:00:08 (VMware) Nmap scan report for …

使用软件解决T490笔记本57摄氏度温度墙的问题

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 客户使用LenovoT490跑GQRX SDR&#xff0c;接入SDR在5MHz采样率下&#xff0c;机器卡顿。这对于10代i7CPU显然是不正常的。后续发现上网页也卡&#xff0c;卸载杀毒、重装系统、BIOS电源设置、系统最…

uniapp的css样式图片大小截图展示

目录 截取图片前截取图片后第一种方式&#xff1a;代码第二种方式&#xff1a;代码最后 截取图片前 截取图片后 第一种方式&#xff1a;代码 <view class"swiper-box-img"><image class"swiper-box-img-img" :src"item.file_path" mod…

10TB海量JSON数据从OSS迁移至MaxCompute

前提条件 开通MaxCompute。 在DataWorks上完成创建业务流程&#xff0c;本例使用DataWorks简单模式。详情请参见创建业务流程。 将JSON文件重命名为后缀为.txt的文件&#xff0c;并上传至OSS。本文中OSS Bucket地域为华东2&#xff08;上海&#xff09;。示例文件如下。 {&qu…

【后端】Docker学习笔记

文章目录 Docker一、Docker安装&#xff08;Linux&#xff09;二、Docker概念三、Docker常用命令四、数据卷五、自定义镜像六、网络七、DockerCompose Docker Docker是一个开源平台&#xff0c;主要基于Go语言构建&#xff0c;它使开发者能够将应用程序及其依赖项打包到一个轻…

Linux:apache优化(1)—— 长链接/保持连接

系统:CentOS 7.9 apache版本为&#xff1a;2.4.25 需要使用源码包进行安装才能够使用这些扩展模块 在使用这些扩展模块前要先下载zlib-devel 安装--enable-deflate选项需要的网页压缩传输的软件包 yum -y install zlib-devel 在配置编译安装时需要使用扩展配置 ./config…

【瞎折腾/3D】无父物体下物体的旋转与移动

目录 说在前面移动World SpaceLocal Space 旋转World SpaceLocal Space 代码 说在前面 测试环境&#xff1a;Microsoft Edge 120.0.2210.91three.js版本&#xff1a;0.160.0其他&#xff1a;本篇文章中只探讨了无父对象下的移动与旋转&#xff0c;有父对象的情况将在下篇文章中…

2024-01-01 事业-代号s-科特勒《营销管理》-分析

摘要: 2024-01-01 事业-代号s-科特勒《营销管理》-分析 科特勒《营销管理》-分析 营销管理 - 思维导图 01 理解营销管理 这本书不仅从概念出发介绍了营销管理的定义、职能和计划&#xff0c;还拆解了每一个管理环节策划的具体实施方法。通过下面这张思维导图&#xff0c;我们…

分布式数据库事务故障恢复的原理与实践

关系数据库中的事务故障恢复并不是一个新问题&#xff0c;自70年代关系数据库诞生之后就一直伴随着数据库技术的发展&#xff0c;并且在分布式数据库的场景下又遇到了一些新的问题。本文将会就事务故障恢复这个问题&#xff0c;分别讲述单机数据库、分布式数据库中遇到的问题和…

深度学习 | 编码器-解码器网络、seq2seq模型、束搜索算法

我们知道传统RNN输入和输出数据是等长的&#xff0c;这显然极大限制了他的应用范围。 前面几节我们讲到的循环神经网络的各种变体基本上都在解决一个序列的问题。还有一大类问题涉及到的是两个序列间转换。它是自然语言处理中的一个重要领域&#xff0c;包括机器翻译、语音识别…

go slice源码探索(切片、copy、扩容)和go编译源码分析

文章目录 概要一、数据结构二、初始化2.1、字面量2.2、下标截取2.2.1、截取原理 2.3、make关键字2.3.1、编译时 三、复制3.1、copy源码 四、扩容4.1、append源码 五&#xff1a;切片使用注意事项六&#xff1a;参考 概要 Go语言的切片&#xff08;slice&#xff09;是对数组的…

FA对接FC流程

2、FA进行对接 &#xff08;1&#xff09;首先安装好AD域控服务器DHCPDNS&#xff08;注意&#xff0c;不要忘记了做DNS正反向解析&#xff0c;就是把已经安装了ITA的主机做解析&#xff09;&#xff0c;在里面创建域用户 &#xff08;2&#xff09;安装ITA和VAG/VLB&#xf…