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

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.rhkb.cn/news/228573.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开关电源反馈环路重要参数设计,PC817和TL431实例计算和取值详解

author&#xff1a;小高霸气 data:2021.04.16 下面介绍开关电源重要的反馈电路PC817和TL431设计和应用。 在开关电源当中&#xff0c;对稳压反馈电路的设计通常会使用TL431和PC817来配合使用。在TOP 及3842等单端反激电路中的反馈电路很多都采用TL431和PC817作为参考、隔离、取…

Android 跨进程之间通信(IPC)方式之BroadcastReceiver

Android 跨进程之间通信 Android 跨进程之间通信(IPC)方式之BroadcastReceiverAndroid 跨进程之间通信(IPC)方式之ContentProvider 文章目录 Android 跨进程之间通信前言一、关于系统广播二、如何利用BroadcastReceiver跨进程通信1.创建广播接收器2.清单文件中声明注册3.发送广…

Windows 10启用Hyper-V

Windows 10启用Hyper-V 官网教程PowerShell 启用 Hyper-V启用 Hyper-V 角色 我们知道VMware是创建虚拟机的好工具&#xff0c;那Windows平台上有没有虚拟工具呢&#xff1f; 今天我们要讲解的就是Windows才入局的虚拟工具&#xff1a;Hyper-V 官网教程 https://learn.microsof…

强烈推荐 25个 前端开源中后台管理系统

作为程序员&#xff0c;构建一套个人专属的后台管理系统非常重要。这不仅是为了打造自己独有的开发生态&#xff0c;更是因为我们正处于个人开发和AI模型泛滥的时代。利用AI增强自己的系统变得尤为关键。然而&#xff0c;在UI界面设计方面&#xff0c;我们可能需要参考开源项目…

论数据资源持有权(下)

四、数据资源持有权&#xff1a;数据流通体系与秩序运行的支柱 现代数字经济背景下的数据要素市场&#xff0c;主要是在动态的流通中实现数据财产价值&#xff0c;在明确数据资源持有权作为构建数据流通中的新型数据财产产权的基石后&#xff0c;就应该充分围绕数据资源持有权…

保护Word或Excel的几种方法,总有一种满足你的需求

你已经在Microsoft Word或Excel中创建了一个重要或机密文件,你希望将其保密或至少保持安全。也许你想确保只有你和某些人可以阅读或编辑它。也许你想限制某人可以对文件进行的修改类型。你甚至可以向读者保证这是最终版本。如果你知道在Word和Excel中使用哪些工具以及它们是如…

vue-springboot基于JavaWeb的汽配汽车配件销售采购管理系统

过对知识内容的学习研究&#xff0c;进而设计并实现一个基于JavaWeb的汽配销售管理系统。系统能实现的主要功能应包括&#xff1b;汽车配件、销售订单、采购订单、采购入库等的一些操作&#xff0c;ide工具&#xff1a;IDEA 或者eclipse 编程语言: java 数据库: mysql5.7 框架&…

普通人变现天花板,月入10w是什么体验?

我是顺哥&#xff08;shundazy1&#xff09;&#xff0c;一个三观超正的6年互联网创业者&#xff0c;信因果、利他思维一直伴随着我的商业生涯。 经历过无数风风雨雨&#xff0c;实现过年入几百万&#xff0c;也曾在一年内亏了100多万。 我们项目的网站 首先介绍我们项目干啥…

【数据结构——图】图的遍历(头歌习题)【合集】

目录 第1关&#xff1a;邻接矩阵存储图的深度优先遍历任务描述相关知识邻接矩阵存储图图的遍历DFS伪代码——邻接矩阵存储实现 完整代码 第2关&#xff1a;邻接表存储图的广度优先遍历任务描述相关知识邻接表存储图图的遍历广度优先遍历过程&#xff1a;BFS伪代码——邻接表实现…

分布式IO在工业自动化中的应用

传统的自动化产线及物流系统主要是利用PLC来处理数据&#xff0c;并将这些数据保存在PC当中。但是随着互联网技术的迅速发展&#xff0c;越来越多的系统集成商利用分布式IO模块&#xff0c;实现从控制器到自动化最底层之间的IO通信。 分布式IO在工业自动化中的应用 分布式IO是用…

基于简化版python+VGG+MiniGoogLeNet的智能43类交通标志识别—深度学习算法应用(含全部python工程源码)+数据集+模型(二)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 模型构建1&#xff09;VGG模型简化版2&#xff09;GoogLeNet简化版——MiniGoogLeNet 3. 模型训练及保存 相关其它博客工程源代码下载其它资料下载 前言 本项目专注于解决出国自驾游特定场景下的交…

(1)(1.13) SiK无线电高级配置(一)

文章目录 前言 1 监控链接质量 2 诊断范围问题 前言 本文提供 SiK 遥测无线电(SiK Telemetry Radio)的高级配置信息。它面向"高级用户"和希望更好地了解无线电如何运行的用户。 &#xff01;Tip 大多数用户只需要 SiK Radio v2 中提供的基本指南和功能概述。 1 …

【重磅新品】小眼睛科技推出紫光同创盘古系列FPGA开发板套件,盘古200K开发板,紫光同创PG2L200H,Logos2系列

FPGA&#xff0c;即现场可编程门阵列&#xff0c;作为可重构电路芯片&#xff0c;已经成为行业“万能芯片”&#xff0c;在通信系统、数字信息处理、视频图像处理、高速接口设计等方面都有不俗的表现。近几年&#xff0c;随着国家战略支持和产业发展&#xff0c;国产FPGA迎来迅…

常用设计模式全面总结版(JavaKotlin)

这篇文章主要是针对之前博客的下列文章的总结版本: 《设计模式系列学习笔记》《Kotlin核心编程》笔记:设计模式【Android知识笔记】FrameWork中的设计模式主要为了在学习了 Kotlin 之后,将 Java 的设计模式实现与 Kotin 的实现放在一起做一个对比。 一、创建型模式 单例模…

如何解决企业内部FTP文件传输速度过慢和安全问题

在数据化时代里&#xff0c;企业内部的文件传输永远是刚需&#xff0c;而因为 FTP协议的简单、易用、广泛支持等优点&#xff0c;让很多企业早期都普遍使用&#xff0c;随着数量量的增多&#xff0c;和对安全的要求越来越高&#xff0c;FTP也暴露出了一些列问题&#xff0c;小编…

C++构建简单静态库实例(cmakelist)

一、开发实例 通过cmake构建静态开发实例如下: 1.1 代码目录 代码目录结构如下: 1.2 代码内容 1.2.1 CMakeLists.txt # CMake 最低版本要求 cmake_minimum_required(VERSION 3.10)# 项目名称 project(mylib)# 添加源文件 set(SOURCE_FILESsrc/mylib

谷歌Linux内核自动测试平台架构介绍-用自动测试测试难以测试的问题

1 摘要 内核和硬件等低级系统已被证明极难进行有效测试&#xff0c;因此&#xff0c;许多内核测试都是以手动为主方式进行的。现有的大多数测试框架都是为测试与底层平台隔离的高级软件而设计的&#xff0c;而底层平台被假定是稳定可靠的。测试底层平台本身需要一套全新的假设…

互联网大厂面试题目

阿里篇 1.1.1 如何实现一个高效的单向链表逆序输出&#xff1f; 1.1.2 已知sqrt(2)约等于1.414&#xff0c;要求不用数学库&#xff0c;求sqrt(2)精确到小数点后10位 1.1.3 给定一个二叉搜索树(BST)&#xff0c;找到树中第 K 小的节点 1.1.4 LRU缓存机制 1.1.5 关于epoll和…

table表格中使用el-popover 无效问题解决

实例只针对单个的按钮管用在表格里每一列都有el-popover相当于是v-for遍历了 所以我们在触发按钮的时候并不是单个的触发某一个 主要执行 代码 <el-popover placement"left" :ref"popover-${scope.$index}"> 动态绑定了ref 关闭弹窗 执行deltask…

mysql的索引原理

目录 一、索引采用B树的优势二、为什么不使用其他数据结构2.1、哈希索引2.2平衡二叉树B树 参考 mysql索引采用B树 一、索引采用B树的优势 1可以进行范围查找&#xff0c;通过单向链表解决&#xff08;通过单向链表已经排好序&#xff09;。 2非叶子结点只存储key&#xff0c;不…