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

news2025/1/22 12:49:33

 在前面的博客中,我们提到过,网络传输的报文是有真实的数据包和一些头部组成,目前我们了解的头部就有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.coloradmin.cn/o/1347579.html

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

相关文章

香橙派5plus从ssd启动Ubuntu

官方接口图 我实际会用到的就几个接口&#xff0c;背面的话就一个M.2固态的位置&#xff1a; 其中WIFI模块的接口应该也可以插2230的固态&#xff0c;不过是pcie2.0的速度&#xff0c;背面的接口则是pcie3.0*4的速度&#xff0c;差距还是挺大的。 开始安装系统 准备工作 一张…

2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项样题卷③

2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项&#xff08;高职组&#xff09; 样题&#xff08;第3套&#xff09; 目录 2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项&#xff08;高职组&#xff09; 样题&#xff08;第3套&#xff09; 模块…

【Redis-10】Redis集群的实现原理和实践

Redis集群是Redis提供的分布式数据库方案&#xff0c;通过分片来进行数据共享&#xff0c;实现复制和故障转移的功能。 1. Redis集群节点 一个Redis集群由多个节点组成&#xff0c;多个节点可以通过命令实现连接&#xff0c;由独立状态转为集群状态&#xff0c;命令是cluster …

论文解读:Coordinate Attention for Efficient Mobile Network Design(CVPR2021)

论文前言 原理其实很简单&#xff0c;但是论文作者说得很抽象&#xff0c;时间紧的建议直接看3.1中原理简述CBMA、原理简述CBMA以及3.2中原理简述coordinate attention block即可。 Abstract 最近关于mobile network设计的研究已经证明了通道注意(例如&#xff0c;the Squee…

7.java——异常

异常——error&#xff08;资源耗尽&#xff0c;JVM内部系统错误&#xff0c;代码一般处理不了&#xff09;和excption&#xff08;数组越界&#xff0c;空指针访问&#xff0c;代码可以处理&#xff09; java.lang.Throwable;异常体系的根父类 -------java.lang.Error:错误。…

20231231_小米音箱接入GPT

参考资料&#xff1a; GitHub - yihong0618/xiaogpt: Play ChatGPT and other LLM with Xiaomi AI Speaker *.设置运行脚本权限 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned *.配置小米音箱 ()pip install miservice_fork -i https://pypi.tuna.tsinghua.edu.cn/sim…

如何设置Android Studio绘制布局时的视图--新手建议收藏!

目录 前言 一、总体步骤 二、详细步骤 三、总结 四、更多资源 前言 在Android Studio中&#xff0c;你可以使用布局编辑器来绘制应用程序的用户界面。布局编辑器提供了一个可视化界面&#xff0c;可让你以所见即所得的方式布局和设计应用程序的视图。 一、总体步骤 打开…

Pytest 项目结合Jenkins

一、window安装centos7虚拟机 参考网上其他教程 二、Linux安装Jenkins 进入jenkins.io网址&#xff0c;点击download&#xff0c;选择CentOS版本 1、Linux中安装java环境和git Jenkins的运行需要java环境&#xff1b;安装git是为代码上传给仓库做准备&#xff1b; yum - y…

idea构建maven项目报错的解决

使用idea创建了一个新的spring项目&#xff0c;maven配置完毕后&#xff0c;报错&#xff0c;引用的依赖不存在。 控制台报错信息如下&#xff1a; 通过查询资料&#xff0c;发现是阿里云的maven仓库中没有这个版本的jar包&#xff0c;导入无法引用到对应的依赖。 解决方法就是…

vmware部署docker+springboot+MySQL(超详细)

一、前期准备 (一)安装jdk #docker search openjdk #docker pull openjdk:8 (二)确认网络 如果局域网其他终端(如手机访问),虚拟机网络连接需要选择《桥接》模式,而且,需要使用有线连接,不能使用Wi-Fi,切忌切忌! 并且要选择实际的那个有线连接。比如我这里是“R…

WorkPlus私有化即时通讯的标杆,助力企业实现信息管控与保障

在信息时代&#xff0c;保护企业的信息安全至关重要。而私有化即时通讯成为了企业提升信息安全的重要手段。作为私有化即时通讯的领先选择&#xff0c;WorkPlus以其卓越的性能和领先的技术&#xff0c;为企业提供了安全可靠的通信解决方案。 私有化即时通讯是企业保护信息安全的…

华为云Stack 8.X流量模型分析(五)

六、EIP流量模型分析 ​ 弹性公网IP&#xff08;Elastic IP&#xff0c;简称EIP&#xff09;提供独立的公网IP资源&#xff0c;包括公网IP地址与公网出口带宽服务。如果资源只配置了私网IP&#xff0c;则无法直接访问Internet&#xff0c;为资源配置弹性公网IP后&#xff0c;可…

普中STM32-PZ6806L开发板(HAL库函数实现-按键扫描)

简介 实现按键扫描, 实现四个按键按下控制灯的亮灭 电路原理图 按键电路原理图 按键与主芯片引脚原理图 其他知识 原理图分析 Key_UP按下会有高电平输入, 所以电路设置应该是默认低电平, 初始化为下拉输入 Key_Left/Right/Down按下会有低电平&#xff0c; 初始化为下拉输…

HTML教程(2)——基础标签

一、HTML的元数据 <meta>标签定义关于 HTML 文档的元数据。元数据是关于数据的数据&#xff08;信息&#xff09;,其始终位于<html>元素内&#xff0c;通常用于指定字符集、页面描述、关键词、文档作者和视口设置&#xff1b; 元数据不会显示在页面上&#xff0c…

redis—List列表

目录 前言 1.常见命令 2.使用场景 前言 列表类型是用来存储多个有序的字符串&#xff0c;如图2-19所示&#xff0c;a、b、C、d、e五个元素从左到右组成 了一个有序的列表&#xff0c;列表中的每个字符串称为元素(element) &#xff0c;一个列表最多可以存储2^32 - 1 个元素…

MySQL Too many connections报错

MySQL 时不时出现Too many connections报错&#xff0c;重启MySQL就好了 但是过段时间又出现 一、解决方案&#xff1a; 1.修改mysql最大连接数 set global max_connections500; 以上是修改立即生效的&#xff0c;重启MySQL就会还原回去 在MySQL配置文件修改 max_connection…

GAMES101:作业4记录

文章目录 总览算法编写代码&#xff1a;recursive_bezier()的实现Bezier()函数的实现提高部分&#xff1a;反走样 总览 Bzier 曲线是一种用于计算机图形学的参数曲线。在本次作业中,你需要实现 de Casteljau 算法来绘制由 4 个控制点表示的 Bzier 曲线 (当你正确实现该算法时,…

拒绝采样(算法)总结

先说说什么是拒绝采样算法&#xff1a;就类似于数学上的求阴影面积的方法&#xff0c;直接求求不出来&#xff0c;就用大面积 - 小面积 阴影面积的办法。 所谓拒绝 和 采样 &#xff1a;就像是撒豆子计个数&#xff0c;计算概率问题一样&#xff0c;大桶里面套小桶&#xff0c…

从0到1入门C++编程——01 C++基础知识

文章目录 一、工具安装二、新建项目三、设置字体、注释、行号四、C基础知识1.数据类型2.输入输出3.运算符4.选择、循环结构5.跳转语句6.数组7.函数8.指针9.结构体 一、工具安装 学习C使用到的工具是Visual Studio&#xff0c;Visual Studio 2010旗舰版下载链接&#xff1a;点此…

uni-app模版(扩展插件)

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…