【网络面试(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.mzph.cn/news/589458.shtml

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

相关文章

Docker 从入门到实践:Docker介绍

前言 在当今的软件开发和部署领域&#xff0c;Docker已经成为了一个不可或缺的工具。Docker以其轻量级、可移植性和标准化等特点&#xff0c;使得应用程序的部署和管理变得前所未有的简单。无论您是一名开发者、系统管理员&#xff0c;还是IT架构师&#xff0c;理解并掌握Dock…

7.11全排列(LC46-M)

算法&#xff1a; 排列和组合很像&#xff0c;但是有顺序。 还是用回溯算法。 与组合不同之处&#xff08;无startindex&#xff0c;有used数组&#xff09;&#xff1a; 首先排列是有序的&#xff0c;也就是说 [1,2] 和 [2,1] 是两个集合。 可以看出元素1在[1,2]中已经使…

大学物理II-作业1【题解】

1.【单选题】——考查高斯定理 下面关于高斯定理描述正确的是&#xff08;D &#xff09;。 A.高斯面上的电场强度是由高斯面内的电荷激发的 B.高斯面上的各点电场强度为零时&#xff0c;高斯面内一定没有电荷 C.通过高斯面的电通量为零时&#xff0c;高斯面上各点电场强度…

基于被囊群算法优化的Elman神经网络数据预测 - 附代码

基于被囊群算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于被囊群算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于被囊群优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&#x…

2023-12-15 LeetCode每日一题(反转二叉树的奇数层)

2023-12-15每日一题 一、题目编号 2415. 反转二叉树的奇数层二、题目链接 点击跳转到题目位置 三、题目描述 给你一棵 完美 二叉树的根节点 root &#xff0c;请你反转这棵树中每个 奇数 层的节点值。 例如&#xff0c;假设第 3 层的节点值是 [2,1,3,4,7,11,29,18] &…

lambda表达式和包装器

正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 我们在使用库里的排序算法时如果排序的是自定义类型或者库里默认的排序不能满足我们则需求&…

【力扣100】46.全排列

添加链接描述 class Solution:def permute(self, nums: List[int]) -> List[List[int]]:# 思路是使用回溯if not nums:return []def dfs(path,depth,visited,res):# 出递归的条件是当当前的深度已经和nums的长度一样了&#xff0c;把path加入数组&#xff0c;然后出递归if …

HTML与CSS

目录 1、HTML简介 2、CSS简介 2.1选择器 2.1.1标签选择器 2.1.2类选择器 2.1.3层级选择器(后代选择器) 2.1.4id选择器 2.1.5组选择器 2.1.6伪类选择器 2.2样式属性 2.2.1布局常用样式属性 2.2.2文本常用样式属性 1、HTML简介 超文本标记语言HTML是一种标记语言&…

帆软报表如何灵活控制水印的显示

在帆软报表中如果要显示水印,如果要全部都要显示,只需要到决策系统--安装设置中打开水印开关。如果想要某个报表显示水印,可以在设计器的水印设置中为该报表设置水印。 但是如果碰到这种需求,比如某些人或者某些角色需要显示水印,其他人不显示。或者是预览报表需要显示水印…

[附代码]稳态视觉诱发电位SSVEP之预训练模型提高性能

SSVEP 之深度学习 深度学习已经被广泛运用在脑电信号分析来提高脑机接口的性能,这是一个end-to-end的方法,简单来说,只要搭建好深度学习网络,做好特征工程,然后分类即可,对于一个刚刚接触脑机接口领域深度学习的学习者来说,可以先忽略中间的数学相关的东西,先建一个网…

软件测试/测试开发丨Linux 数据处理三剑客学习笔记

一、Linux 三剑客之 grep 1、 内容检索 获取行&#xff08;单行&#xff09; grep pattern file获取内容 grep -o pattern file获取上下文 grep -A -B -C pattern file 2、 文件检索 递归搜索 grep pattern -r dir/展示匹配文件名 grep -H 111 /tmp/1只展示匹配文件名 grep …

HTML进阶

列表、表格、表单 文章目录 列表、表格、表单01-列表无序列表有序列表定义列表 02-表格表格结构标签-了解合并单元格 03-表单input 标签input 标签占位文本单选框上传文件多选框下拉菜单文本域label 标签按钮 04-语义化无语义的布局标签有语义的布局标签 05-字符实体 01-列表 …

影视后期:Pr 调色处理之风格调色

写在前面 整理一些影视后期相关学习笔记博文为 Pr 调色处理中风格调色&#xff0c;涉及下面几个Demo 好莱坞电影电影感调色复古港风调色赛博朋克风格调色日系小清晰调色 理解不足小伙伴帮忙指正 简单地说就是害怕向前迈进或者是不想真正地努力。不愿意为了改变自我而牺牲目前所…

软考网络工程师教程第五版(2018最新版)

软考网络工程师教程第五版(2018最新版) 内容简介 本书是全国计算机技术与软件专业技术资格(水平)考试指定用书。作者在前4版的基础上,根据网络工程师新版大纲的要求,针对考试的重点内容做了较大篇幅的修订,书中主要内容包括数据通信、广域通信网、局域网、城域网、因特网…

Python 创建第一个项目

打开pycharm编辑器 点击New Project创建一个新项目。 主要修改项目名和项目路径&#xff0c;其它保持默认&#xff0c;点击Create。 当编辑器创建好项目后&#xff0c;我们通过右键项目名&#xff0c;点击New&#xff0c;再点击Python File 创建一个Python文件。 写好文件名&a…

Motionface VoiceFocus使用教程

Motionface VoiceFocus使用教程 1&#xff1a;系统要求 软件运行支持32位/64位window 10/11系统, 其他要求无。 2&#xff1a;下载安装 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;1234 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 下载VoiceFo…

69.乐理基础-打拍子-大切分与变体

内容来源于&#xff1a;三分钟音乐社 前置内容&#xff1a;66.乐理基础-打拍子-小切分-CSDN博客 上一个内容&#xff1a;68.乐理基础-打拍子-大附点与变体-CSDN博客 大切分&#xff1a; 把每个小切分的每一个音符翻一倍就变成大切分了&#xff0c;小切分是两个十六分音符夹一…

08 通信协议之UART

引言&#xff1a; 从本文开始&#xff0c; 本个专题之后的几篇文章都是讲解嵌入式开发中几种常见的通信协议的&#xff0c; 比如UART, I2C&#xff0c;SPI&#xff0c; CAN总线这些我就不讲了&#xff0c; 没用到过&#xff0c; 学是学不完的&#xff0c; 等用到的时候再去学习…

什么情况下不应该使用 LockWindowUpdate ?

在之前的文章中&#xff0c;我们将了解了 LockWindowUpdate 应该在什么场景下使用&#xff0c;也就是拖动的场景。 今天&#xff0c;我们来看看 LockWindowUpdate 被误用的一些场景。 人们看到 LockWindowUpdate 的“您锁定的窗口将无法重新绘制自身”行为&#xff0c;并将其…

磁盘阵列(RAID)

1.独立硬盘冗余阵列&#xff08;RAID, Redundant Array of Independent Disks&#xff09; 旧称廉价磁盘冗余阵列&#xff08;Redundant Array of Inexpensive Disks&#xff09;&#xff0c;简称磁盘阵列 用虚拟化存储技术把多个硬盘组合起来&#xff0c;成为一个或多个硬盘阵…