【网络面试(6)】IP协议对网络包的转发

 在前面的博客中,我们提到过,网络传输的报文是有真实的数据包和一些头部组成,目前我们了解的头部就有TCP头、IP头、MAC头,而且这三个头部信息都是在应用程序委托给协议栈之后,被写入的相关信息,这些头部都是跟网络包的转发和传递有关系的。前面我们学习了TCP协议对网络包的拆分、重发、三次握手四次挥手等机制,本篇博客来看一下,在IP协议中,如何借助于IP头部和MAC头部实现对网络报文转发的。

在这里插入图片描述

1. 网络包添加头部信息

 在IP协议中,包转发的起点是在网络包的头部添加IP头部和MAC头部。这里先了解这两个概念,IP头部是跟IP地址相关的,也就是通过IP地址要知道最终应该把包发送给这个IP对应的服务器,这个目的地的IP地址自始至终不会发生变化。MAC头部则是跟以太网协议相关,他记录的是网络线路中最近的、将要到达的路由的MAC地址,随着包在路由器之间相互传递,这个MAC地址会被修改为将要到达的下一个MAC地址。

1.1 IP头部

 IP头部,顾名思义记录的就是跟收发双方IP地址相关的控制信息,这一动作是由IP模块添加到网络包头部的,这里面最重要的就是IP地址,这个IP地址就是TCP模块告知给IP模块的,还记得我们在TCP连接阶段,调用Socket库的时候入参的IP地址吗?
connect(<套接字描述符>, <服务器IP地址>, <服务器端口号>, ...),IP协议只会负责将包发送给此IP对应的服务器,至于中间的丢包、重试统统不管,这是TCP模块该做的事情。我们看下IP头部的格式:

在这里插入图片描述
 这里面除了接收方IP地址之外,还有发送方IP地址,发送方地址这里会涉及到一个知识点,对于大部分计算机来说,一台计算机装有一个网卡,没问题,这个IP地址就是这块网卡上的,但是对于有多个网卡的性能优异的计算机,就代表这有多个IP地址,那么发送方的IP地址应该写哪个呢,也即是应该通过哪块网卡将消息发送出去呢?

 这里就需要通过IP路由表去确定应该使用那一块网卡,我们来使用一个命令``route print`可以看到这张位于计算机上的路由表。

在这里插入图片描述
 举个例子,现在我们要向IP地址未192.168.1.233的服务器上发消息,根据子网信息192.168.1.x就可以匹配到第6行192.168.1.0的这一行。我们看下这几列分别表示什么意思:

  • destination 目标的子网地址
  • netmask 子网掩码,和目标IP地址可以确定子网地址
  • gateway 网关,这里指的是路由器的IP地址
  • interface 接口,这里指的就是我们要找到网卡ip地址

 通过路由表,我们确定了第6行的interface10.10.1.16就是我们要使用的网卡,这样,消息就知道要在哪里发送出去了。

1.2 MAC头部

 在IP头部添加完成后,还需要再IP头部前面添加MAC头部,MAC头部是以太网使用的头部,包含发送方和接收方的MAC地址信息。

 我们首先来看下MAC头包含的完整信息。

在这里插入图片描述
  这里面,首先看以太类型,和IP头部的协议号类似,表明当前是那种协议的网络包,我们使用IP协议,就是16进制的 0800。另一个信息是发送方的MAC地址,其实也好找,前面我们已经确定好了是由哪块网卡发送网络消息了,因此读取这块网卡的MAC地址就可以了。MAC地址是厂家在生产的时候烧录在ROM里面的,一般不会变动,长度48个bit。
在这里插入图片描述

 然后就是发送方的MAC地址了,从发送开始,我们无从得知接收方的MAC地址是什么,也就是应该把消息发送到哪一块网卡。这里就需要ARP协议和路由表了,在首次发送网络包的时候,ARP协议会通过广播的形式,向子网中的所有网络设备发送消息,发送请求询问当前接收方IP地址由哪块网卡做转发。如果子网中确实有这样一块网卡转发此IP的网络包,就会回复消息,这样接收方的MAC地址就确定了,其实就确定了应该把网络包发送到哪个网卡上。

在这里插入图片描述
 需要注意的是,并不是每次查询MAC地址都需要发送广播请求,因为ARP缓存会把前一次查询的结果缓存下来,几分钟会过期,所以这里可能会有子网设置网络信息变动,导致实际情况和ARP缓存不一致的情况。

 经过上述处理,发送方和接收方的MAC地址都可以知道了,就可以发送包含了MAC头部和IP头部的网络包了。在现实生活中,我们可以把IP头部信息比作快递中填写的收件人的地址,是不会变的,而MAC地址是邮递过程中,作为中转站的不同快递站点,是可以发生变化的,最终目的就是为了找到收件人的地址。

2. 将网络包转换成光/电信号发送到接收方

 网络包是存放在内存中的二进制数据,并没有办法直接发送给对方,要想通过网线或者光纤发送给对方,还需要转换成光或者电信号发送出去。

 负责这一操作的就是网卡,网卡是硬件,本身也没法独立完成这个转换,因此还需要网卡的驱动程序来控制网卡完成这个转换。在操作系统启动之初,网卡驱动程序会对网卡进行初始化,这里会包含错误检查,初始这是、mac地址设置等等,这个MAC地址是全世界独一无二的。

2.1 MAC模块添加报头、起始帧分界符和帧校验序列

 网卡驱动程序从IP模块获取到网络包信息之后,会将其复制到网卡的缓存中,然后调用MAC模块,完成发送包的命令。那么MAC模块在这期间,完成了哪些工作呢?

 首先,mac模块读取缓冲区中的数据,然后在网络包的起始位置添加上报头起始帧分界符(SFD),在末尾添加上用于检测错误的帧校验序列

在这里插入图片描述

  • 报头:用来测定读取报文的时机,报头的0和1变化频率是和时钟信号变化频率同步的,因此接受方通过一段时间对报头的0和1变化观察,就能找到固定的变化周期,确定时钟信号的发送的频率。
  • 起始帧分界符(SFD):在经过一段报头的数据之后,会有一段长度为8个比特的起始帧分界符,起始帧分界符的末尾比特排列有少许的变化,用以告诉读取的一方,报头将要结束, 接下来要读取的就是正式的数据包。
  • 帧校验序列(FCS):是在包末尾的、长度为32比特的序列,是通过一个公式计算出从包头到包尾的内容,用以接收方在接收到网络包之后对数据包进行校验,避免中间发生数据错误。

在这里插入图片描述

2.2 发送网络包

 当网络包封装好之后,就会向以太网中发送信号,MAC模块就会从包头开始将数字信息按照每个比特转换成电信号,然后由信号收发模块发送出去,这里将数字信息转换成电信号的速率就是我们常说的网络传输速率,例如每秒把10Mbit的数字信息转换成电信号发送出去,这里的网速就是10Mbit。

 下一遍链接:【网络面试必问(7)】聊聊集线器、交换机和路由器

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

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

相关文章

30 UVM Adder Testbench Example

1 Adder Design 加法器设计在时钟的上升沿产生两个变量的加法。复位信号用于clear out信号。注&#xff1a;加法器可以很容易地用组合逻辑开发。引入时钟和重置&#xff0c;使其具有测试台代码中时钟和重置的样子/风格。 module adder(input clk, reset, input [7:0] in1, in…

go语言语法基础

文章目录 前言一、输入和输出常用的字符串格式化符号 二、注释三、Go常用基本语言数据类型数字类型布尔类型字符类型变量与常量数组和切片数组切片 map类型创建map增删改查特别提醒 指针 四、运算符五、条件判断语句if系列switch六、循环语句for循环标准写法死循环while循环do …

2024.1.1 hive_sql 题目练习,开窗,行列转换

重点知识: 在使用group by时&#xff0c;select之后的字段要么包含在聚合函数里&#xff0c;要么在group by 之后 进行行转列,行转列的核心就是使用concat_ws函数拼接(分隔符,内容), -- 以及collect_list函数进行收集,list不去重, set去重无序 列转行,核心就是使用炸裂函数把东…

【深入浅出RocketMQ原理及实战】「云原生升级系列」打造新一代云原生“消息、事件、流“统一消息引擎的融合处理平台

打造新一代云原生"消息、事件、流"统一消息引擎的融合处理平台 云原生架构RocketMQ的云原生架构实现RocketMQ的云原生发展历程互联网时期的诞生无法支持云原生的能力 云原生阶段的升级云原生升级方向促进了Mesh以及多语言化发展可分合化的存算分离架构存储分离架构的…

message: 没有找到可以构建的 NPM 包,请确认需要参与构建的 npm 都在 `miniprogra

第一步&#xff1a;修改 project.config.json 文件 "packNpmRelationList": [{"packageJsonPath": "./package.json","miniprogramNpmDistDir": "./miniprogram/"}], "packNpmManually": true 第二步&#xff1a;…

QDialog

属性方法 样式表 background-color: qlineargradient(spread:reflect, x1:0.999896, y1:0.494136, x2:1, y2:1, stop:0 rgba(0, 0, 0, 255), stop:1 rgba(255, 255, 255, 255));border: 1px groove rgb(232, 232, 232);border-radius: 20px; QDialog 的常用方法&#xff1a; e…

35--JDK新特性

1、新语法结构 新的语法结构&#xff0c;为我们勾勒出了 Java 语法进化的一个趋势&#xff0c;将开发者从复杂、繁琐的低层次抽象中逐渐解放出来&#xff0c;以更高层次、更优雅的抽象&#xff0c;既降低代码量&#xff0c;又避免意外编程错误的出现&#xff0c;进而提高代码质…

数据结构和算法-B+树(性质 查找)

文章目录 B树叶子节点B树的查找第一种查找方式第二种查找方式 小结 B树 B树节点的关键个数1B树该节点的子树个数 B树节点的关键字个数和节点的子树个数一样 叶子节点包含全部关键字&#xff0c;并且都相互链接了 叶子节点 根节点也能是叶子节点 B树的查找 第一种查找方式…

2022年全国职业院校技能大赛(高职组)“云计算”赛项赛卷①第一场次:私有云

2022年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算”赛项赛卷1 第一场次&#xff1a;私有云&#xff08;30分&#xff09; 目录 2022年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算”赛项赛卷1 第一场次&#xff1a;私有云&#xff0…

echarts手动触发气泡的显示和隐藏

点击echarts图表后将点击的那个进行突出显示 <template><div id"demo"> </div><el-button type"primary" click"set">设置</el-button><el-button type"primary" click"cancel">取消&…

C语言程序设计——输入输出函数

写给自己 工作之后&#xff0c;已经好久没有学习编程、码代码了&#xff0c;因为最开始是从python开始接触的编程&#xff0c;所以对于一些底层的逻辑了解不够清晰&#xff0c;所以打算从0开始学习一下C语言程序。 C语言 关于其相关历史优劣等&#xff0c;在这里不再一 一赘…

git上传代码到github远程仓库

1、添加SSH公钥 为了把本地的仓库传到github&#xff0c;还需要配置ssh key&#xff0c;说白了就是为了把本地的代码上传到github。 1、前置准备 本地需要安装git&#xff1a;Git - Downloads。安装成功后本地右键鼠标会多出一些git选项。 2、添加SSH Key 首先在本地创建s…

Note: An Interesting Festival

An Interesting Festival 一个有趣的节日。 festival The Agricultural Feast takes place after the independence Day. 农业盛会在独立日后举行 takes place independence feast agricultural It is not a worldwide celebration. 它不是一个全球的庆典。 worldwide ce…

【教学类-43-11】 20231231 3*3宫格数独提取单元格坐标数字的通用模板(做成2*2=4套、3*2=6套)

背景需求&#xff1a; 1、以前做单元格填充&#xff0c;都是制作N个分开的单元格 &#xff08;表格8&#xff09; 2、这次做五宫格数独的Word模板&#xff0c;我图方便&#xff0c;就只用了一个大表格&#xff0c;第六行第六列隐藏框线&#xff0c;看上去就是分开的&#xff…

redis安装与配置(Ubuntu)

目录 1. 切换到 root 用户 2. 搜索安装包 3. 安装 redis 4. 查看 redis 是否正常存在 5. 修改ip 6. 重新启动服务器 7. 连接服务器 1. 切换到 root 用户 通过 su 命令切换到 root 用户。 2. 搜索安装包 apt search redis 这里安装的是下面的版本&#xff1a; 3. 安装 …

《深入理解C++11:C++11新特性解析与应用》笔记七

第七章 为改变思考方式而改变 7.1 指针空值--nullptr 7.1.1 指针空值&#xff1a;从0到NULL&#xff0c;再到nullptr 传统C头文件里NULL是一个宏定义&#xff1a; 在函数重载同时出现int和char *参数版本的函数时&#xff0c;使用NULL作为参数调用函数会调用int参数版本&…

Anaconda3 2021.11安装

1. 镜像下载&#xff1a;Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2. 安装在D盘&#xff1a; 3. 配置环境变量&#xff1a; 在这里&#xff0c;第一个教程A在系统变量里配置了五个&#xff0c;但我没有 所以又搜了教程B&#xf…

python命令大全及说明,python命令大全下载

大家好&#xff0c;本文将围绕python命令大全及说明展开说明&#xff0c;python命令大全下载是一个很多人都想弄明白的事情&#xff0c;想搞清楚python简单命令语句需要先了解以下几个事情。 Python有哪些常用但容易忘记的命令&#xff1f; 1 如何忽略报错信息2 Python常见绘图…

【Pytorch】Pytorch或者CUDA版本不符合问题解决与分析

NVIDIA CUDA Toolkit Release Notes Package installation issues INSTALL PYTORCH 先声毒人&#xff1a;最好资料就是上面三份资料&#xff0c;可以通过官网明确的获取一手信息&#xff0c;你所遇到的99%的问题都可以找到&#xff0c;明确的解决方案&#xff0c;建议最好看…

安全生产信息化平台是如何实现“五要素”的动态管理的

安全生产信息化平台以集成信息技术和管理理念为基础&#xff0c;实现了对“五要素”&#xff08;人、机、料、法、环&#xff09;的动态管理。以下是该平台如何实现这一目标的简要说明&#xff1a; 人员管理&#xff1a;通过建立员工档案和记录员工的安全培训、证书、违章记录等…
最新文章