【好书精读】网络是怎样连接的 —— IP 与以太网的包收发操作

news2024/11/15 17:25:38

 ( 该图由AI制作 )

目录

包的基本知识

包收发操作概览

生成包含接收方 IP 地址的 IP 头部

生成以太网用的 MAC 头部

通过 ARP 查询目标路由器的 MAC 地址

以太网的基本知识

将 IP 包转换成电或光信号发送出去

给网络包再加 3 个控制数据

向集线器发送网络包

接收返回包

将服务器的响应包从 IP 传递给 TCP


TCP 模块在执行连接收发断开等各阶段操作时都需要委托 IP 模块将数据封装成包发送给通信对象

包的基本知识

包是由头部和数据两部分构成的 (a ))

 

头部包含目的地址等控制信息 (理解为:快递单)
头部后面就是委托方要发送给对方的数据 (理解为:快递本体)

发送方的网络设备会负责创建包创建包的过程就是生成含有正确控制信息的头部,然后再附加上要发送的数据)

包会被发往最近的网络转发设备

转发设备会根据头部中的信息判断接下来应该发往哪里
这个过程需要用到一张表,这张表里面记录了每一个地址对应的发送方向,也就是按照头部里记录的目的地址 在表里进行查询,并根据查到的信息判断接下来应该发往哪个方向
我们把发送方和接收方统称为终端节点
相应地,转发设备被称为转发节点或者中间节点

具体来说 如图 (b 所示 TCP/IP 包包含如下两个头部

我把图再拿下来一遍

(a MAC 头部 用于以太网协议
b IP 头部 用于 IP 协议
这两个头部分别具有不同的作用

首先 发送方将包的 目的地 也就 是要访问的服务器的 IP 地址写入 IP 头部
IP 协议就可以根据这一地址查找包的传输方向 从而找到下一个路由器的位置(路由器 R1)
IP 协议会委托以太网协议将包传输过去
这时,IP 协议会查找下一个路由器的以太网地址(MAC 地址),并将这个地址写入 MAC 头部中
这样一来,以太网协议就知道要将这个包发到哪一个路由器上了。
网络包在传输过程中 会经过集线器
集线器是根据以太网协议工作的设备 为了判断包接下来应该向什么地方传输 集线器里有 一张表 用于以太网协议的表 ), 可根据以太网头部中记录的目的地信息查 出相应的传输方向
包会到达下一个路由器(图②)
路由器中有一张 IP 协议的表 可根据这张表以及 IP 头部中记录的目的地信息查出接下来应该发 往哪个路由器 为了将包发到下一个路由器 我们还需要查出下一个路由 器的 MAC 地址 并记录到 MAC 头部中

就是在 TCP/IP 网络中一个网络包从出发到到达目的地的全过程

IP 和以太网的分工
其中以太网的部分也可以替换成其他的东西:无线局域网 ADSL FTTH
它们都可以替代以太网的角色帮助 IP 协议来传输网络包
IP 和负责传输的网络分开 可以更好地根据需要使用各种通信技术

包收发操作概览

在协议栈中 IP 模块是如何完成包收发操作的
将包从发送方传输到接收方的工作是由集线器 路由器等网络设备来完成的
IP模块仅仅是整个包传输过程的入口而已

包收发操作的起点是 TCP 模块委托 IP 模块发送包的操作(图1)

这个委托的过程就是 TCP 模块在数据块的前面加上 TCP 头部然后整个传递给 IP 模块,这部分就是网络包的内容

与此同时, TCP 模块还需要指定通信对象的 IP 地址 也就是需要写清楚 将什么内 容发给谁 ”。

IP 模块会将包的内容当作一整块数据 在前面加上包含 控制信息的头部 刚才我们讲过 IP 模块会添加 IP 头部和 MAC 头部这两 种头部 IP 头部中包含 IP 协议规定的 根据 IP 地址将包发往目的地所需 的控制信息 MAC 头部包含通过以太网的局域网将包传输至最近的路由器所需的控制信息
关于 IP 头部和 MAC 头部的区别以及其中包含的控制信息的含义 我们将稍后介绍 总之 加上这两个头部之后 一个包就封装 好了 这些就是 IP 模块负责的工作
IP 模块负责添加如下两个头部。
(1) MAC 头部:以太网用的头部,包含 MAC 地址
(2) IP 头部:IP 用的头部,包含 IP 地址
接下来, 封装好的包会被交给网络硬件 ②发送”)如以太网 无线局域网等
网络硬件可能是插在计算机主板上的板卡,也可能是笔记本电脑上的 PCMCIA 卡,或者是计算机主板上集成的芯片,不同形态的硬件名字也不一样,我们将它们统称为网卡
传递给网卡的网络包是由一连串 0 1 组成的数字信息 网卡会将这些数字信息转换为电信 号或光信号 并通过网线 或光纤 发送出去 然后这些信号就会到达集线 路由器等转发设备 再由转发设备一步一步地送达接收方
包送达对方之后,对方会作出响应。返回的包也会通过转发设备发送回来,然后我们需要接收这个包
接收的过程和发送的过程是相反的 信息先以电信号的形式从网线传输进来 然后由网卡将其转换为数字信息并 传递给 IP 模块 ③接收 ”)。 接下来 IP 模块会将 MAC 头部 IP 头部后面的内容 也就是 TCP 头部加上数据块 传递给 TCP 模块
在这个过程中,有几个关键的点
无论要收发的包是控制包还是数据包,IP 对各种类型的包的收发操作都是相同的。

生成包含接收方 IP 地址的 IP 头部

下面来看一看 IP 模块的具体工作过程
IP 模块接受 TCP 模块的委托, 负责包的收发工作 它会生成 IP 头部,并附加在 TCP 头部前面
IP 头部包 含的内容如表 所示

其中最重要的内容就是 IP 地址。它表示这个包应该发到哪里去这个地址是由 TCP 模块告知的,而 TCP 又是在执行连接操作时从应用程序那里获得这个地址的,因此这个地址的最初来源就是应用程序。

IP 头部中还需要填写发送方的 IP 地址 大家可以认为是发送方计算机的 IP 地址
IP 头部的“接收方 IP 地址”填写通信对象的 IP 地址。发送方 IP 地址需要判断发送所使用的网卡,并填写该网卡的 IP 地址。
但如果计算机上有多个网卡 如何判断应该把包交给哪块网卡呢?

答:与路由器使用 IP 表判断下一个路由器位置的操作是一样的。因为协议栈的 IP模块,与路由器中,负责,包收发的部分,都是根据 IP 协议规则,来进行包收发操作的,所以它们也都用相同的方法,来判断,把包发送给谁。

这个 IP 叫作路由表

 

首先 我们对套接字中记录的目的地 IP 地址与路由表左侧的 Network Destination 栏进行比较
例如,TCP 模块告知的目标 IP 地址为 192.168.1.21,那么就对应
图中的第 6 行,因为它和 192.168.1 的部分相匹配。
如果目标 IP 地址为 10.10.1.166,那么就和 10.10.1 的部分相匹配,所以对应第 3 行。
以此类 我们需要找到与 IP 地址左边部分相匹配的条目
接下来看从右边数第 2 列和第 3 列的内容
Interface 列 表示网卡等网络接口( 也叫网络掩码:用来判断 IP 地址中网络号与主机号分界线的值 )这些网络接口可以将包发送给通信对
Gateway (网关) 列表示下一个路由器的 IP 地址 将包 发给这个 IP 地址 该地址对应的路由器 就会将包转发到目标地址

路由表的第 1 行中,目标地址和子网掩码都是 0.0.0.0这表示默认网关如果其他所有条目都无法匹配就会自动匹配这一行

这样一来 我们就可以判断出应该使用哪块网卡来发送包了
可以在 IP 头部,的发送方 IP 地址中,填上这块网卡对应的 IP 地址

生成以太网用的 MAC 头部

生成了 IP 头部之后 接下来 IP 模块还需要在 IP 头部的前面加上MAC 头部

 

IP 头部中的接收方 IP 地址,表示网络包的,目的地 通过这个地址,我们就可以判断,要将包发到哪里
但在以太网的世界中 TCP/IP 的这个思路,是行不通的
以太网,在判断,网络包目的地时,和 TCP/IP 的方式不同 因此必须采用,相匹配的方式,才能在以太网中,将包发往目的地 MAC 头部,就是干这个用的
IP 模块,在生成 IP 头部之后 会在它前面,再加上 MAC 头部 MAC 头部是以太网使用的头部 它包含了接收方和发送方的 MAC 地址等信息
MAC头部的相关知识
MAC 头部的开头是接收方和发送方的 MAC 地址 大家可以认为它们和 IP 头部中的接收方和 发送方 IP 地址的功能差不多
3 个以太类型字段和 IP 头部中的协议号类似
IP 协议号表示 IP 头部后面的包内容的类型 而在以太网中 我们可以认为以太网类型后面就是以太网包的内 而以太类型就表示后面内容的类型
在生成 MAC 头部时,只要设置表中的 3 个字段就可以了
首先是 以太类型 ”, 这里填写表示 IP 协议的值 0800
接下来是 发送方 MAC 地址 里填写网卡本身的 MAC 地址 (MAC 地址是在网卡生产时写入 ROM 里)
而接收方 MAC 地址:需要进一步查询
查一下路由表就知道了。在路由表中找到相匹配的条目,然后把包发给 Gateway 列中的IP 地址就可以了,既然已经知道了包应该发给谁,那么只要将对方的 MAC 地址填上去就好了,但到这里为止根本没有出现对方的 MAC 地址,也就是说我们现在根本不知道对方的 MAC 地址是什么。因此,我们需要执行根据 IP 地址查询 MAC 地址的操作。

通过 ARP 查询目标路由器的 MAC 地址

在以太网中 有一种叫作广播的方法 可以把包发给连接在同一以太网中的所有设备
ARP 就是利 用广播对所有设备提问 :“×× 这个 IP 地址是谁的 请把你的 MAC 地址 告诉我 。”
然后就会有人回答 :“ 这个 IP 地址是我的 我的 MAC 地址是××××。”

如果对方和自己处于同一个子网中 那么通过上面的操作就可以得到对方的 MAC 地址 然后 我们将这个 MAC 地址写入 MAC 头部 MAC 头部就完成了

 MAC 头部加在 IP 头部的前面整个包就完成了

以太网的基本知识

完成 IP 模块的工作之后 下面就该轮到网卡了 不过在此之前 我们先来了解一些以太网的基本知识
以太网是一种为多台计算机能够彼此自由和廉价地相互通信而设计的通信技术,
它的原型如图 (a 所示

 

当一台计算机发送信号时 ,信号就会通过网线流过整个网络 最终到达所有的设备
网络中任何一台设备发送的信号所有设备都能接收到
我们无法判 断一个信号到底是发给谁的 因此需要在信号的开头加上接收者的信息
为了控制这一操作 我们就需要使用表 2.3 中列出的 MAC 通过 MAC 头部中的接收方 MAC 地址 就能够知道包是发给谁的
尽管以太网经历了数次变迁,但其基本的 3 个性质至今仍未改变,
  1. 即:将包发送到 MAC 头部的接收方 MAC 地址代表的目的地
  2. 用发送方 MAC 地址识别发送方
  3. 用以太类型识别包的内容
因此 大家可以认为具备这 3 个性质的网络就是以太网

将 IP 包转换成电或光信号发送出去

下面来看看以太网的包收发操作
我们需要将数字信息转换为电或光信号 才能在网线上传输
负责执行这一操作的是网卡

这是一张网卡主要构成要素的概念图 并不代表硬件的实际结构
网卡的初始化过程
网卡驱动程序会对硬件进行初始化操作
网卡的 ROM 中保存着全世界唯一的 MAC 地址,这是在生产网卡时写入的
网卡中保存的 MAC 地址会由网卡驱动程序读取并分配给 MAC模块

给网络包再加 3 个控制数据

看网卡是如何将包转换成电信号并发送到网线中的
网卡驱动从 IP 模块获取包之后 会将其复制到,网卡内的缓冲区中 然后向
MAC 模块,发送, 发送包 ,的命令 接下来就轮到 MAC 模块进行工作了
MAC 模块会将包从缓冲区中取出 并在开头加上报头和起始帧分界符 在末尾加上用于检测错误的帧校验序列

报头是一串像 10101010这样 1 0 交替出现的比特序列

它的作用是确定包的读取时机
当这些 1010 的比特序列被转换成电信号后,会形成如图这样的波形

用电信号来表达数字信息时 我们需要让 0 1 两种比特分别对应特定的电压和电流 例如图 a 这样的电信号就可以表达数字信息

这里暂时略过

向集线器发送网络包

加上报头 起始帧分界符和 FCS 之后 我们就可以将包通过网线发送出去了

发送信号的操作分为两种 一种是使用集线器的半双工模式 另一种是使用交换机的全双工 模式

接收返回包

网卡将包转换为电信号并发送出去的过程到这里就结束了 既然讲到了以太网的工作方式 那我们不妨继续看看接收网络包时的操作过程

将服务器的响应包从 IP 传递给 TCP

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

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

相关文章

代码随想录算法训练营第四十一天 | 背包问题(一维、二维)、416. 分割等和子集

01背包:n种物品,每种物品只有1个,有相应的重量和价值 最多只能装m的重量,最多价值为多少? dp[i][j] : [0, i]物品任取放进容量为j的背包里 不放物品i:dp[i-1][j] 放物品i:dp[i-1][j-weight[…

如何系统性的学习Python语言

零基础同学的福音来了,如果你对Python语言的学习感兴趣,接下来可以由浅入深的了解下Python语言,哪怕你是零基础的小白也完全可以学会的,最后也会给大家放出学习和实例相结合的教程及方法,给到各位同学系统性的教学&…

ES-索引管理

前言 数据类型 ​ 搜索引擎是对数据的检索,所以我们先从生活中的数据说起。我们生活中的数据总体分为两种: 结构化数据非结构化数据 结构化数据: 也称作行数据,是由二维表结构来逻辑表达和实现的数据,严格地遵循数…

<C语言> 数组

1.一维数组的创建和初始化。 1.1 数组的创建 数组是一组相同类型元素的集合。 使用以下方式声明一个一维数组: type arrayName[arraySize];type是数组中元素的类型,arrayName是数组的名称,arraySize是数组的大小(即元素的个数&a…

linux系统中如何制作rootfs?详细教程

如何制作rootfs?安排!想直奔主题的,直接跳到第四部分。 一、分析 1. 文件系统简介 理论上说一个嵌入式设备如果内核能够运行起来,且不需要运行用户进程的话,是不需要文件系统的,文件系统简单的说就是一种…

硬件入门之什么是mos管

硬件入门之什么是mos管 文章目录 硬件入门之什么是mos管一、mos管是什么?MOS管常用于: 驱动大功率电路中。MOS选型参数mos管调参数 二、实际应用场景1.防反接保护电路)2.防过压保护电路3.防反接防过压电路一体电路4.驱动电路 总结 一、mos管是…

VS+QT+VTK三维网格显示-点面选择-法线法向量显示-配准-分割窗体程序

程序示例精选 VSQTVTK三维网格显示-点面选择-法线法向量显示-配准-分割窗体程序 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<VSQTVTK三维网格显示-点面选择-法线法向量显示-配准-分…

Quartz使用H2数据库(嵌入模式)进行持久化

使用H2(嵌入模式)持久化Quartz任务 &#x1f51d;前言&#xff1a; Quartz在包内提供了多种数据库的sql文件&#xff0c;大家可以选择方便的使用。路径如下。 1.初始化h2(不使用Server模式) public class InitH2 {private static String USER_NAME "lee";private…

Unity简单操作:InputSystem获取WASD键盘输入 移动人物

目录 安装InputSystem 在编辑的脚本中使用 InputSystem生成的脚本 Unity版本&#xff1a;2019.2.3f1 安装InputSystem 菜单栏/Window/Package Manager/Input System 工程面板内 右键-->创建Input Actions 选中New Controls改名为PlayerControls 然后属性 面板按下Edit as…

软件项目管理 第七章 软件项目的质量管理与配置管理 课后习题参考答案——主编:李冰、张桥珍、刘玉娥

第七章 软件项目的质量管理与配置管理 课后习题参考答案 1.选择题 (1)项目质量管理的最终责任由谁来承担?&#xff08;D&#xff09; A.项目开发人员 B.采购经理 C.质量经理 D.项目经理 (2)“质量成本”是一个项目管理概念,它说明了下列哪项成本?…

HDFS 写流程源码分析

HDFS 写流程源码分析 一、客户端&#xff08;一&#xff09;文件创建及Pipeline构建阶段&#xff08;二&#xff09;数据写入&#xff08;三&#xff09;输出流关闭 二、NameNode端&#xff08;一&#xff09;create 环境为hadoop 3.1.3 一、客户端 以下代码创建并写入文件。 …

如何优雅地安装 Android Studio

&#x1f4ad; 写在前面&#xff1a;我们假设读者已经搞定 JDK 了&#xff0c;如果没搞定请先搜索 JDK 的安装教程。访问 Oracle JDK 下载页面&#xff1a;访问 Java Downloads | Oracle &#xff0c;点击 "JDK Download" 按钮。选择适合您操作系统的 JDK 版本&#…

设计模式之模板方法模式笔记

设计模式之模板方法模式笔记 说明Template Method(模板方法)目录模板方法模式示例类图抽象类包菜类菜心类测试类 说明 记录下学习设计模式-模板方法模式的写法。JDK使用版本为1.8版本。 Template Method(模板方法) 意图:定义一个操作中的算法骨架&#xff0c;而将一些步骤延…

yolo格式visdrone转换

目录 yolo格式转换1. Visdrone2019格式转换 yolo格式转换 1. Visdrone2019格式转换 数据集下载地址https://aistudio.baidu.com/aistudio/datasetdetail/115729 如果是visdrone数据集&#xff0c;直接使用txt2xml.py去转换&#xff0c;修改annotation和img的路径&#xff0c…

<Linux开发>驱动开发 -之- Linux LCD 驱动

&#xff1c;Linux开发&#xff1e;驱动开发 -之- Linux LCD 驱动 交叉编译环境搭建&#xff1a; &#xff1c;Linux开发&#xff1e; linux开发工具-之-交叉编译环境搭建 uboot移植可参考以下&#xff1a; &#xff1c;Linux开发&#xff1e; -之-系统移植 uboot移植过程详细…

网络基础一

网络发展 独立模式&#xff1a;计算机之间相互独立。 网络互联&#xff1a;多台计算机连接在一起&#xff0c;完成数据共享。 局域网LAN&#xff1a;计算机数量更多了&#xff0c;通过交换机和路由器连接在一起&#xff1b; 广域网WAN&#xff1a;将远隔千里的计算机都连在…

[BPU部署教程] 万字长文!通透解读模型部署端到端大流程——以终为始,以行为知

去年6月份拿到开发板到现在&#xff0c;转眼已经过去大半年了&#xff0c;这个博客11月初就在写&#xff0c;断断续续写到现在。C部署需要考虑的问题很多&#xff0c;如果只给个简单部署教程的话&#xff0c;就算整理出来&#xff0c;感觉帮助也不大&#xff0c;各位开发时候我…

YOLOv5改进系列(11)——添加损失函数之EIoU、AlphaIoU、SIoU、WIoU

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制

模版方法模式在 JDK 及 spring 源码中的应用

模版方法模式 模板方法模式是一种行为设计模式&#xff0c; 它在超类中定义了一个算法的框架&#xff0c; 允许子类在不修改结构的情况下重写算法的特定步骤。 更多有关于模版方法模式的介绍详见&#xff1a;https://refactoringguru.cn/design-patterns/template-method 模版…

津津乐道设计模式 - 委派模式详解(以家庭弟位让你彻底明白)

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…