<网络>初识计算机网络

news2024/11/15 14:05:26

目录

一、网络发展

(一)背景

(二)类型

二、网络协议

(一)认识协议

(二)协议分层

(三)OSI七层模型

(四)TCP/IP五层模型

(五)系统与网络的联系

三、网络传输

(一)协议报头是什么

(二)同一个局域网内通信

(三)数据包的封装与分用

(四)局域网通信原理

(五)跨路由器的远端通信

四、网络地址

(一)IP地址

(二)MAC地址

(三)IP与MAC的关系


一、网络发展

(一)背景

Internet的最早起源于美国国防部高级研究计划署DARPA(Defence Advanced Research Projects Agency)的前身ARPAnet,该网于1969年投入使用。由此,ARPAnet成为现代计算机网络诞生的标志。

        从六十年代起,由ARPA提供经费,联合计算机公司和大学共同研制而发展起来的ARPAnet网络。最初,ARPAnet主要是用于军事研究目的,它主要是基于这样的指导思想:网络必须经受得住故障的考验而维持正常的工作,一旦发生战争,当网络的某一部分因遭受攻击而失去工作能力时,网络的其他部分应能维持正常的通信工作。ARPAnet在技术上的另一个重大贡献是TCP/IP协议簇的开发和利用。作为Internet的早期骨干网,ARPAnet的试验并奠定了Internet存在和发展的基础,较好地解决了异种机网络互联的一系列理论和技术问题。

        1983年,ARPAnet分裂为两部分,ARPAnet和纯军事用的MILNET。同时,局域网和广域网的产生和逢勃发展对Internet的进一步发展起了重要的作用。其中最引人注目的是美国国家科学基金会 NSF(National Science Foundation)建立的NSFnet。NSF在全美国建立了按地区划分的计算机广域网并将这些地区网络和超级计算机中心互联起来。

(二)类型

如果按照 网络区域 进行划分,可以分为 局域网 LAN 和 广域网 WAN

局域网 LAN 通常指在一个区域内将多台计算机通过双绞线、同轴电缆等连接介质互相连接:

广域网 WAN 则是指将相隔千里的计算机进行连接:

值得注意的是 局域网和广域网只是一个相对的概念,并没有明显的界限,比如一个看似很大的广域网,实际也就是个局域网。

二、网络协议

(一)认识协议

“协议” 的本质是一种约定,也是一种标准,比如著名的 IEEE 754 标准,就规定了浮点数如何在内存中存储;再比如投资者往往会与被投资者签订一份对赌协议,确保投资顺利进行。

协议制定后,参与者都必须遵守该协议

不同行业中的 协议 往往由该行业中的翘楚制定,比如在通信标准领域,华为 就担任了重要角色,并作为 5G 标准的主导者之一。

一流企业定标准,二流企业做品牌,三流企业做产品

在当前互联网时代,有众多计算机生产商、计算机操作系统和多样化的计算机网络硬件设备。那么,如何实现这些不同设备之间的互相连接呢?

答案是 制定出被大家都认可的协议,当 协议 被制定出来且拥有一定用户基础后,后续厂商推出的硬件设施也必须遵守该 协议,通信双方只要曾经做过某种协议,之后就可以使用这种协议来完成某种事情,有了协议我们通信的数据才能被正常识别,通信才有意义。否则就会被市场抛弃,如此一来,可以倒逼众多配套设备共同遵守,网络连接环境也就逐渐完善了。

为了让计算机能够相互顺畅的通信, 需要约定一个共同的标准,大家都来遵守,这就是网络协议。

(二)协议分层

网络在传输过程中面临诸多问题:

  1. 数据如何组织,如何解析的问题
  2. 长距离传输,数据丢失的问题
  3. 如何在众多主机中定位目标主机的问题
  4. 如何进行数据转发、路径选择的问题
  5. 010101 硬件级别的协议问题

将问题分类,逐个击破 — 高内聚

这些问题之间是存在先后关系的,比如只有先把信息组织好了,才需要考虑数据传输过程中的丢失问题,丢失问题得到保障后,就要考虑把数据发送给谁、如何发送,最终通过硬件完成发送。

基于 解耦、可维护性、可扩展性 这三点出发,采用 协议分层 的解决方案,将不同的问题解决策略归入不同模块中,模块之间互不影响 — 低耦合

此时网络的 层状结构 呼之欲出,不同分层中包含了各种协议,负责解决不同的问题:

其实 分层 这个概念早在语言学习阶段就已经接触过了:在学习 继承 时,子类继承自父类,当前出现了 父类 和 子类 这两层结构,父类可以不必关心子类的具体实现,需要时可以直接通过父类指针对子类成员或函数进行访问。


拿日常生活举例,假设 A 想给 B 打电话,只需要拿起电话并拨通 B 的号码,待 B 接通电话后,双方可以通话,在通话过程中,A 与 B 都认为自己在直接与对方通话。

这是因为 A、B 同处 语言层,任务是 进行通话,而通话的具体实现属于 通信设备层,用于实现通话;语言层依赖通信设备层 的功能,但并不关心它的具体实现,因为没必要。

语言层和通信设备层之间通过 接口 进行连接,有点类似于操作系统中的系统调用

假设某天 通信设备层 中的电话机坏了,可以将其更换为无线电,继续向 语言层 提供通话的服务,即便设备更换了,AB 依旧可以正常通话:

不仅 通信设备层 可以更换设备,语言层 也可以更换角色,比如现在变成 BC 两个外国人进行通话,通信设备层 依旧可以正常提供服务:

上述例子中,很好的体现出 分层 的好处:分层之后,每一层都只关注自己层的功能,使用下层提供的接口,任何一层出问题,都不会直接影响其他层。

分层 是解决大量问题的最优解(高内聚、低耦合) 

能否不进行分层?
从技术层面来说是可以的,但这对于整个系统的设计都是非常不友好的,比如你可以把所有的代码都写到一个 main 函数中,程序依旧可以运行,但如果程序运行出现了问题,或者说需要对某个功能进行改动,会变得十分麻烦。
所以随着编程思想的深入,不同的功能由不同的函数实现,对功能(函数)进行聚合,也就形成了类;分层也是如此,分层之后,无论是进行功能维护,还是进行功能扩展,都可以在不影响其他层的情况下进行。

(三)OSI七层模型

基于 网络分层 的设计思想,诞生了著名的 OSI七层网络模型

OSIOpen System Interconnect,即 开放式系统互连, 一般都叫 OSI参考模型,是 ISO组织 在 1985 年研究的 网络互连模型,该模型将 网络 从逻辑上分成了 七层,每一层都有对应的 协议 或 物理设备。

OSI参考模型 最大优点是将 服务接口 和 协议 这三个概念明确地区分开来,通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯。

自底向上,OSI参考模型 中不同层级实现功能如下:

分层名称功能预览
物理层解决硬件相关的问题,比如 01 序列解析、数字/模拟信号处理、界定连接器和网线的规格
数据链路层解决两台主机在局域网中如何连通的问题
网络层解决主机跨网络,经过路径选择后如何到达目标主机的问题
传输层解决数据传输时可能发生的数据丢失问题,同时通过策略实现数据高效传输
会话层进行连接管理
表示层规定信息转换格式
应用层针对不同应用的协议

表格来源:《网络入门基础》

OSI参考模型 是一种框架性的设计方法,基于该模型可以实现不同的具体模型,其中最出名的是 TCP/IP五层模型,这也是我们主要学习的网络模型。

(四)TCP/IP五层模型

开发人员在使用 OSI七层模型 的过程中,发现这个标准设计的过于麻烦了,应用层、表示层、会话层 可以合为一层:应用层,加上剩下的四层,也就是变成了五层模型:

注意: TCP/IP是一组协议的代名词,其中包含了许多协议,共同组成了 TCP/IP 协议簇

TCP/IP 五层模型 也可以称为 TCP/IP 四层模型,这是因为 物理层 不是我们开发人员关注的重点:


TCP/IP 五层模型 的不同分层功能如下(自底向上

物理层

负责光电信号的传递方式以太网 中采用 同轴电缆、双绞线、光纤、电磁波 等传递信号,不同材质决定了信号最大传输速率、传输距离、抗干扰性等,如果信号传递过程中出现衰减,还可以使用 集线器 进行信号增强。

数据链路层

负责设备之间的数据帧的传送和识别,比如网卡设备的驱动、帧同步、冲突检测、差错校验等工作, 数据链路层 中有很多不同的实现标准:以太网、令牌环、无线 LAN 等,具体是什么标准,取决于网卡,用于连接多台设备,实现网络数据传输与交换的 交换机 就工作在 数据链路层。

网络层

负责地址管理和路由选择,比如在 IP 协议 中,通过 IP 地址来标识主机,可以通过查询路由表的方式规划出源主机与目标主机之间的传输路线,这正是 路由器 的工作职责。

传输层

负责两台主机之间的数据传输,通过诸如 TCP 协议 等传输协议,实现高效、可靠的数据传输,数据传输不一定成功,可以通过 重传 相关机制重新传输数据。

应用层

负责应用程序间沟通,比如 简单电子邮件传输(SMTP文件传输协议(FTP网络远程访问协议(Telnet 等,在进行网络编程时,主要针对的就是 应用层


一般而言,硬件除了工作在某一层外,还需要具备自己下层的功能

  • 对于一台主机,它的操作系统内核实现了从传输层物理层的内容
  • 对于一台路由器,它实现了从网络层物理层
  • 对于一台交换机,它实现了从数据链路层物理层
  • 对于集线器,它只实现了物理层

但这并不是绝对的,某些硬件也可以工作在上层,比如 路由器 可以实现传输层的部分功能,交换机 也可以实现网络层的转发。

(五)系统与网络的联系

系统网络 不分家,看似设计复杂的网络标准模型其实和系统设计有着千丝万缕的联系,比如 物理层、数据链路层、网络层、传输层 这四层属于 操作系统层,剩下的 应用层 属于 用户层,因为我们最终是需要通过操作系统来进行网络通信,所以网络标准模型必然会被融入操作系统中。

应用层中的 应用、表示、会话 不属于系统体系结构,也不能属于系统体系结构,因为他们由用户定义并实现,由于实现方式不固定,也就统称为 应用层,网络编程就是在 应用层 中进行的。

网络标准模型融入操作系统后,为了让用户能使用网络,操作系统就为网络相关操作提供了一批 系统调用接口,也就是后面学习的 socket 套接字编程。

操作系统具有四大管理模块:内存管理、进程管理、文件管理、驱动管理,压根就没有 网络管理,那么操作系统是如何网络进行管理的?

Linux 中一切皆文件,网络需要借助网卡通信,而网卡在操作系统看来,不过是一个提供了读方法与写方法的硬件设备而已,所以操作系统只需要通过 文件管理 那一套来对网络进行管理就行了。

其实 socket 本质上就是一个文件描述符,一个专门对于 网络资源(文件) 进行操作的句柄而已,这也就意味着系统提供的网络相关系统调用接口,必然与文件相关接口操作类似。

网络本质上是挂接至文件系统中的一个重要子功能

网络与系统也有一些区别:系统可以有很多种,但网络中的核心协议栈必须一致,无论是哪种系统,如果核心协议栈不一致,就无法进行网络通信。

所以所有主流操作系统都必须实现基于 TPCIP 实现的核心协议栈(工作在操作系统层中)

三、网络传输

(一)协议报头是什么

一、处在同一个局域网中的主机,是可以直接通信的

比如可以联机的游戏的本地连接对战功能,这些游戏在进行本地多人对战时,只需要构建一个局域网,主机相连后即可直接进行通信。

再比如QQ互传微信文件传输助手 等传输文件的方式,也是通过局域网连接实现的,本质上就是通过热点构建一个子网(局域网),其他手机(主机)连接后,可以直接通信,传输文件。

这些日常生活中接触过的操作都在证明 处于同一个局域网中的主机是可以直接通信的。

二、TCP/IP模型中的不同层都有自己的协议,而协议最直观的表现部分叫做 协议报头

每一层都有自己的 协议 很好理解,毕竟每层需要解决的问题都不同,用来解决问题的 协议 自然就不同

至于什么是 协议报头协议报头 有什么用?

协议报头 在数据传输过程中,用于承载一些控制信息;协议报头 提供了关于数据包或帧的元信息,以便在网络中正确地路由、传递和处理数据。

比如下面这个就是经典的 TCP 协议报头:


可以通过生活中的例子辅助理解

前面提到过,马云 创办的 淘宝 深刻改变了现代人的生活,说白了就是网购,这种网上购物方式必须依赖强大的 物流 体系,面对成千上万的商品,以及全国大大小小的收货信息,该如何设计快递方式,才能确保 物流 过程中不会出差错?

答案是通过 快递单 标识物流信息,这里的快递单就好比 协议报头,因为有很多家快递公司,每家公司的 快递单 都不一样,不同协议的 协议报头 也不一样,协议报头 是协议最直观的表现部分。

所以假设张三双十一在某东上买了一把青轴机械键盘,商家发货时,会先选择一家 快递公司(协议) 进行发货,将 键盘(有效载荷) 打包,并给包裹贴上一张 快递单(协议报头),准备物流。

如果不发生意外,张三在数天后会收到一条取件信息,张三拿到快递后,首先做的是读取 快递单(协议报头) 信息, 确认是自己的包裹后,才会 把包裹拆开(解包),最终张三成功拿到了自己网购的 键盘(有效载荷)。

在上面这个故事中,张三的整个购物过程可以分为三步:商家打包 -> 物流 -> 张三解包,快递单作为快递公司的代表,包含了很多重要信息,是包裹物流过程中的通关文牒。

如果张三想要退货,则会在原先包裹的基础之上,再加一张 快递单2,将之前的 快递单1+包裹 整体看作一个 包裹(有效载荷),利用新的 快递单2 进行封装。

  • 此时的有效载荷从 键盘 变成了 包裹,证明有效载荷是一个相对的概念。

网络中传输的 数据 可以看作商品,称为 有效载荷,传输过程中选择的 协议 可以看作快递公司,协议报头 自然就是快递单了,实际在进行网络传输时,也是遵循 打包 + 传输 + 解包 这三步走的,只不过在传输过程中还需要再打包,在众多协议报头的保驾护航之下,可以确保数据在网络世界中成功递达。

  • 快递单1 + 商品 —> 协议报头 + 有效载荷
  • 快递单2 + (快递单1+商品) —> 协议报头 + 有效载荷

所以现在可以理解为什么不同层中的协议可以共同完成数据传输工作了,因为对于同层来说,协议是用来解决问题的,问题解决后,会用自己的 协议报头 将数据打包,传给下层;或者把自己本层的协议报头与有效载荷分离后,把有效载荷传给上层。

  • 传给下层时:解决完问题后,将上层传过来的有效载荷,与自己层的协议打包后,继续传给下一层,这个过程称为 封装
  • 传给上层时:上层得到的是一个自己能看懂的数据包,把自己本层的协议分离后,把有效载荷继续往上传就好了,这个过程称为 分用

封装分用 是不同网络层中必须面对的重要问题,只有把这两个问题解决了,整个传输过程才会通畅,关于更多实现细节可以接着往下看。

(二)同一个局域网内通信

有了 局域网内直接通信 和 协议报头 的前置知识后,接下来演示 同一个局域网内两台主机如何通信:

通信过程:应用层将自己的 协议报头 与用户想发送的 信息 封装成一个 数据包,传给下一层,传输层将自己的协议报头与数据包封装成一个新的数据包,传给下一层,不断重复,直到数据包来到对端主机网络中;链路层从数据包中分离有效载荷,向上交付,网络层同样需要分离出有效载荷,向上交付,最终有效载荷为主机A发送的 信息,成功交给了主机B。

解铃还须系铃人,XXX层 封装 的协议报头,只有同层才能进行 解包,得益于 协议分层,看似 主机A 与 主机B 在直接通信,实际上数据至少经历了九次传输。

(三)数据包的封装与分用

从上面主机通信的例子中,可以产出以下结论:

  1. 每一层都有自己的协议报头
  2. 向下传输时,每一层都要有将自己的协议报头与有效载荷封装,传给下一层的能力
  3. 向上传输时,每一层都要有将自己的协议报头与有效载荷分离,识别并交付给上一层的能力
  4. 在逻辑上,同一层中使用的都是同一个协议,都认为自己在于对端直接通信

向上交付时,如何从数据包中将自己的 协议报头 有效载荷 分离呢?

a. 协议报头中一般都包含了当前报头的大小,用数据包总大小 - 协议报头大小,得到的就是有效载荷;除此之外有的协议报头与有效载荷之间存在特殊分隔符,可以轻松识别并分离。

可是协议有很多,在向上交付时,如何知道 有效载荷 该传递给哪个 协议 呢?

b. 如果要交给上一层,有效载荷中必然包含上一层协议报头,而协议报头中包含了协议信息,自然能知道将有效载荷交付给谁了。

几乎每层 协议 都要具备 ab 两个基本功能,否则就无法向上交付数据

补充概念

  • 不同的协议层对数据包有不同的称谓,在传输层叫做,在网络层叫做数据报,在链路层叫做帧。
  • 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部,称为封装。
  • 首部信息中包含了一些类似于首部有多长、载荷有多长、上层协议是什么等信息。
  • 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,,根据首部中的上层协议报头将数据交给对应的上层协议处理。

(四)局域网通信原理

局域网通信的一般原理:在局域网中进行通信时,无论任何时刻,只允许一台主机向局域网中发送信息。

通过一个例子来辅助理解

某天,张三正在上课,王老师定了一个规矩:在我上课期间,其他人不允许讨论,如果想发言,需要举手示意。

张三听着听着就走神了,突然王老师看着张三想起了一件事,并直接问到:“[张三] [你的作业为什么没交?]”,因为此时全班只有王老师的声音,其他同学听到后发现王老师叫的是 [张三],而不是自己,选择无视了王老师的发言,当张三听到王老师在叫自己名字后,打起精神并站了起来,开始分析王老师传达的信息:[为什么没交作业?],张三想了半天,想出一个理由:[王老师] [作业我写了,但在家里忘带了,下次带给你],其他同学听到张三的发言依旧选择无视,王老师收到张三的信息后表示:“[张三] [你能忘记作业,为什么不能忘记吃饭呢?]”,全班发出笑声,张三收到信息后尴尬坐下。

故事结束,在上面的故事中,张三所处的环境正是一个 局域网,同学和老师们可以直接通信,但任何时刻,都只允许一人通信,其中每个人的名字可以看作自己的标识符,王老师发出的信息中只包含了 [张三] 这个 标识符,因为在一个教室里,所以除张三外的其他同学也能收到王老师发出的信息,但他们选择无视,因为 [张三] 这个 标识符 与自己对不上当张三与王老师在进行对话时,虽然全班人都能听到,但本质上只有张三与王老师在进行通信,而这就是 局域网 中 以太网 的通信原理。

如何理解 “抓包” 行为?
当你收到不是发给你的数据包时,没有选择无视,而是将其收集了起来,这就是抓包;带入故事中,就是那种喜欢凑热闹的吃瓜群众。
网卡默认会过滤掉不属于自己的数据包,可以手动设置成混杂模式,以关闭过滤。

以太 是什么东西?为什么能跟网络扯上关系?

  • 以太这个名词源于物理学中的以太假说:认为光在太空中通过 以太 传播,但物理实验证明其根本不存在,最终沦为物理学界的笑柄。而我们网络中正是通过 光电信号 传输数据的(光电信号中有光),因此就把该标准称为 以太网,用来 “致敬” 物理学。

既然局域网中的数据包可以被所有人收到,也就意味着通信过程可能被干扰,就比如同时向湖面丢石头,产生的波纹之间会相互影响,导致自己的波纹 丢失/混乱。

如果我们不断往局域网中发送大量无用的数据包,会导致 网络碰撞,影响局域网中的正常通信,发生网络碰撞后,未递达的数据会重新发送,此时再发送就会变得特别慢,因为此时局域网中都是垃圾数据包,大部分时间都用在甄别垃圾数据包上了。

这就也解释了大部分学校的校园网在晚上打游戏的时候会很卡,因为大家处于同一个局域网中,大家都在打游戏,都在发送数据包,容易发生 数据碰撞,从而导致数据 延迟递达,也就是 网卡,即每次失误都会骗朋友,给自己找一个借口:卡了。


在网络世界中需要使用 唯一标识符 来标识自己的主机,否则就无法做到信息传递与接收,网卡厂商在生成网卡时,会给每一个网卡都写入属于自己的 SN 号,也就是 MAC 地址,这是一个硬件地址,目前 全球唯一。

对于 Windows 电脑用户,可以调起 cmd 窗口,输入指令 ipconfig /all 查询自己当前电脑网卡的 MAC 信息

当我们在局域网中进行通信时,可以直接通过 MAC地址比对,判断数据包是不是发给自己的

(五)跨路由器的远端通信

在学习远端通信之前,需要先认识一下 路由器

路由器 主要工作在 网络层,但它也具备 数据链路层物理层 的工作能力,并且 路由器 也可以可以看作一台 主机(节点),作为远端通信的桥梁,路由器 至少需要级联两个子网,至少要提供两个网络接口:

主机A 与 主机B 不处在同一个局域网中,如果想要进行通信,需要让 路由器 与 主机A 处于同一个子网,同时让 路由器 与 主机B 也处在同一个子网,主机A 把数据交给 路由器路由器 把数据转发给 主机B主机A 与 主机B 完成了通信。

假设 主机A 与 路由器 所在子网标准为 以太网主机B 与 路由器 所在子网标准为 令牌环,同样可以演示两台主机如何进行跨路由器的远端通信。

令牌环 是局域网中实现通信的另一种方法,存在一个 令牌,该局域网中的主机轮流持有,只有持有 令牌 的主机才能发出信息,令牌环 目的也是确保任何时刻都只有一台主机发送信息。

主机A 正常将信息封装后,向下传递,当数据包来到 网络层 时,发现此时有很多主机,自己该如何将数据包正确传递给路由器呢?


在局域网中,主机可以通过甄别 唯一标识符 MAC 的方式无视不属于自己的信息,此时目标主机并不存在于当前局域网中,按照之前的逻辑,主机A 发送的信息会被所有人丢弃(包括路由器),所以光靠 唯一标识符 MAC 是无法完成跨路由器通信的,还需要一个重要概念:IP 地址。

IP 地址 的功能是 标识公网环境下的所有主机,当前所谈及的 IP 地址 均为 IPv4 标准,该标准使用了一个 4 字节的无符号整数类型(unsigned int)来表示一个 IP 地址

// IP地址的结构(通过位段实现)
struct ip
{
    int part1 : 8;
    int part2 : 8;
    int part3 : 8;
    int part4 : 8;
}

操作系统内核由 C语言 编写,而网络中的 传输层 和 网络层 属于操作系统内核,自然也是通过 C语言 实现的。

从代码结构中可以看出 IP 地址 由四部分组成,每一部分占 8 字节,表示范围为 [0, 255]

直接使用二进制表示比较抽象,IP 地址 一般表示为:xxx.xxx.xxx.xxx

这种表示方式称为 字符串风格的点分十进制方案,是方便给人看的,如何将二进制转换为 点分十进制

// IP地址
unsigned int ipVal = 3332933889;

// 分别获取IP地址中的四个部分
struct ip* pIP = (struct ip*)(&ipVal);

pIP->part1;
pIP->part2;
pIP->part3;
pIP->part4;

将获取的四个部分转为十进制,然后拼接成字符串即可,关于转换工作不需要我们手动完成,使用系统提供的接口就行了。

如何借助 IP 地址 把数据包正确交给路由器?

在路由器中存在一张 路由表,其中包含了当前子网中已有路径信息,以及之前通信过的路径信息,主机A 在进行数据包发送前,会先到 路由表 中查询目标路径是否存在,如果存在,就按照路径传递,如果不存在,就会把数据包交给路由器,由路由器完成数据包的转发。

可以把 IP地址 看作学号,规定不同班级的学号前缀不一样,假设张三捡到了一张学生证(数据包),仔细查阅花名册(路由表)后发现不是自己的同班同学,于是将学生证交给了辅导员(路由器),由辅导员来完成学生证的归还工作。
将数据包丢给路由器的行为称为 默认路由


现在 主机A 知道自己要把数据包交给路由器,同时也知道 主机B 的 IP 地址,接下来路由器就会收到一个数据包

路由器拿到数据包后会进行解包,将 以太网报头 拆掉,然后分析 IP 报头,规划该数据包的路径,得知需要将此数据包交给 主机B,加上 令牌环报头 后把数据包丢入令牌环网络中,等待 主机B 截取

不仅是主机需要解包,路由器等中间设备也需要具备解包能力,因为路径规划依赖于 IP,而查看IP协议报头,需要先将以太网等链路层协议报头去除。

得益于 路由器 + IP 地址,在 网络层 及以上层次中,都认为数据包的内容始终没有改变,而在 网络层 之下,允许各种不同的实现标准进行通信(比如这里的以太网与令牌环),这种优秀的设计使网络在普及时可以畅通无阻。

IP 是全球网络的基础


四、网络地址

(一)IP地址

IP地址用来标识网络中不同主机的地址

目前的 IP 地址 有两种:IPv4、IPv6,凡是没有特殊说明的,IP 地址 都是指 IPv4

IPv4 由一个 4 字节的无符号整数 构成,占 32 比特位,可表示的最大地址数为 42亿+。

为了让 IP 地址 更便于阅读,可以将整数中的四部分转为十进制后通过符号连接,以 点分十进制 的形式展现,比如 192.168.0.1。

IPv4 标准于 1981 年推出,在那个联网设备都还极度匮乏的年代,使用一个无符号整型(最大表示 42 亿+)就足够了,IPv4 在当时看来确实可以标识网络中的主机所有主机,然而谁也没有意料到网络发展如此之快,快到 42 亿个地址根本不够用,IPv4 标准中的所有地址于 2019 年全部分配完毕,这就导致 IPv4 标准现在并不能标识所有主机,只能标识公网环境下的所有主机。 

为了应对 IPv4 地址不够用的窘境,推出了 IPv6、NAT 等技术,IPv6 足足使用了 16 字节,长度为 128 位,是 IPv4 的四倍,可以标识 340 亿亿亿台设备,是一个天文数字,称可以为全世界的每一粒沙子编上一个地址,目前 IPv6 标准尚未全面普及;而 NAT 技术则是引入了 地址转换 的概念,简言之就是在公网与内网间建立映射关系,使得内网中允许地址重复,NAT 技术提供了一定的安全保护。
我们普通人使用的网络一般都是内网,地址普遍都是 192.168.xxx.xxx,这种情况下即使你的 IP 暴露,也无法直接定位至你的主机设备。

(二)MAC地址

MAC地址用来识别数据链路层中相连的节点

MAC 地址 用一个 6 字节的整数表示,占 48 比特位,可表示的最大地址数为 百万 亿+。

MAC 地址 一般用十六进制数字加上冒号的形式来表示,例如: 08:00:27:03:fb:19

MAC 地址 在网卡出厂时就确定了,不能修改. MAC 地址 通常是唯一的(虚拟机中的 MAC 地址 不是真实的 MAC 地址,可能会冲突,也有些网卡支持用户配置 MAC 地址)。

IP 地址很紧张,MAC 地址就不一样,作为数据包转发的节点,同一个局域网内,MAC 地址重复的可能性几乎为0,48 比特位显得有点浪费,这就好比你每个月要1000生活费,但你爸每个月都给你1000w,足够用,但过于夸张了。

(三)IP与MAC的关系

IP 地址 与 MAC 地址 最大的区别在于:传输过程中,IP 地址不会改变,MAC 地址会改变,随着传输距离的增加,MAC 地址改变的次数也会增加。

如何理解 IP 地址 与 MAC 地址 的关系?

IP 地址 分为 源IP地址、目标IP地址,MAC 地址 也分为 源MAC地址、目标MAC地址

假设有一天,张三考上了大学,临近上学日,一向谨慎的张三选择规划好自己的报名路线。

因为张三家住广州,而他的学校在温州,途径多个省份,张三需要坐高铁从广州到厦门,再从厦门到温州,分为两程:广州->厦门,厦门->温州,虽然中途涉及换乘,并且每一程的始发地和目的地也不一样,但张三的最终目的地始终没有改变。

  • 源IP地址:张三家
  • 目标IP地址:张三考上的学校
  • 源MAC地址:[广州,厦门]
  • 目标MAC地址:[厦门,温州]

张三只需要带够钱,并且明确自己的目的地,就一定能抵达

张三的报名之路类似于数据包在网络中的传输之路,IP 地址始终没有改变,但 MAC 地址可能发生改变当 主机A 将数据包交给路由器时,路由器分析 IP 地址得知需要将数据包转交给 主机B,于是数据包中的 目的 MAC 地址 会变成 MAC-主机B,主机B 收到数据包后,经过不断解包分用,主机B 将会收到 主机A 发送的信息。

所以 IP 地址 用来表示始发地与目的地,MAC 地址 用来表示途中需要经过的中转区间,通常把 MAC 地址 的改变称为 下一跳,就是从一个 子网 跳转到另一个 子网 中。

IP 地址 和 MAC 地址 共同协作,确保数据能够从源设备传输到目的设备。IP 地址 提供了端到端的逻辑标识,而 MAC 地址 则在局域网中提供了物理设备之间的唯一标识。这种分层的设计有助于网络的灵活性和可扩展性。


如何在 Linux 中查看 IP 地址 与 MAC 地址

ifconfig

ether 表示 以太,当前局域网中采用了以太网 的通信方式 

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

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

相关文章

[音视频学习笔记]八、FFMpeg结构体分析 -上一个项目用到的数据结构简单解析:AVFrame、AVFormatContext、AVCodecContext

前言 上次我们做了一个简单的视频解码,MediaPlay-FFmpeg - Public 这一次简单对这个代码进行一个剖析,对其中的数据结构进行一个解析。 这些数据结构之间的关系 AVFrame 、AVFormatContext 、AVCodecContext 、AVIOContext 、AVCodec 、AVStream 、AV…

Pillow教程01:初识Pillow模块(创建Image对象+查看属性+图片的保存与缩放)

--------------Pillow教程集合--------------- Python项目18:使用Pillow模块,随机生成4位数的图片验证码 Python教程93:初识Pillow模块(创建Image对象查看属性图片的保存与缩放) Pillow教程02:图片的裁剪…

【算法专题--双指针算法】leecode-15.三数之和(medium)、leecode-18. 四数之和(medium)

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 前言1. 三数之和2. 解法&…

如何使用PHP和RabbitMQ实现延迟队列(方式二)?

前言 前几天写了一篇关于PHP和RabbitMQ如何通过插件实现延迟队列的功能。 今天写另外一篇不需要插件的方式,使用RabbitMQ的死信队列(Dead-Letter-Exchanges, DLX)和消息TTL(Time-To-Live)。 这种方法涉及到设置消息…

OpenHarmony 源码解析之SystemUi—Statusbar(TS)

作者:董伟 简介 SystemUI应用是OpenHarmony中预置的系统应用,为用户提供系统相关信息展示及交互界面,包括系统状态、系统提示、系统提醒等,例如系统时间、电量信息。 本文主要分析batterycomponent、clockcomponent、wificompo…

C#自定义控件 生成 与 加入到项目

C#自定义控件生成 在C#中,自定义控件通常是通过继承现有的控件类(如UserControl、Form等)并添加或修改其属性和方法来实现的。以下是一个简单的示例,演示如何创建一个自定义控件: 首先,创建一个新的Window…

陪诊小程序成品|陪诊系统功能|陪诊小程序研发功能和流程

近年来,随着人们健康意识的提升和医疗行业的不断发展,陪诊小程序在医疗领域中扮演着越来越重要的角色。那么,什么是陪诊小程序?它具有怎样的功能和流程呢?本文将为您详细解读。 陪诊小程序是一种通过手机应用程序进行…

Ipython与Jupyter之间的关系

IPython 和 Jupyter 之间的关系可以从它们的历史和目标中得到很好的解释。IPython(Interactive Python)最初是由 Fernando Prez 于 2001 年创建的,旨在提升 Python 的交互式计算体验。它提供了一个强大的交互式 Python shell 和一个面向高效计…

Arduino IDE工程代码多文件编程和中文设置

一、esp8266模块信息 二、中英文切换 点击文件( File )–选择首选项( Preference )—选择语言( Language )—选择中文–点击确定( OK ) 三、多文件编程 在Arduino编程中,将代码分割成多个文件是一种很好的做法,特别是项目变得越来越大和复杂时。这样…

基于nodejs+vue基于hive旅游数据的分析与应用python-flask-django-php

系统阐述的是使用基于hive旅游数据的分析与应用系统,对于nodejs结构、MySql进行了较为深入的学习与应用。主要针对系统的设计,描述,实现和分析与测试方面来表明开发的过程。开发中使用了express框架和MySql数据库技术搭建系统的整体架构。利用…

【爬虫框架pyspider】02 - pyspider 用法详解

pyspider 用法详解 前面我们了解了 pyspider 的基本用法,我们通过非常少的代码和便捷的可视化操作就完成了一个爬虫的编写,本节我们来总结一下它的详细用法。 1. 命令行 上面的实例通过如下命令启动 pyspider: pyspider all 命令行还有很…

如何调用occtproxy放入自己的wpf文件

1.创建一个wpf程序 2.添加项目occtproxy.vcxproj 3.把该项目配置类型设为dll 4.添加引用 5.报错显示,这是因为还没有生成dll 6.把occtproxy设为启动项目运行,设定输出目录在该目录下,生成dll 7.再运行,即可

基于Colab训练的yolov4-tiny自定义数据集(可用于OpenCV For Unity)

参考资料文档和视频。 1.打开文档,点击【文件】【在云端硬盘中保存一份副本】,即将文档复制到自己云端硬盘。 2.打开该文件,按文中提示进行。 【代码执行程序】【更改运行时类型】修改运行时为GPU(免费的GPU不好用,收费的好用,某宝上几十元就可用一个月) 步骤1) !git…

日新增百万数据clickhouse大数据解决方案记录分享

公司广告业务需求,需要多个维度统计每个应用的设备数,点击率,展示率,等相关数据,而且数据需要进行去重,我第一时间想到的是利用clickhouse来做统计,因为我们平台访问量比较大,用mysq…

STM32-01基于HAL库(CubeMX+MDK+Proteus)仿真开发环境搭建(LED点亮测试实例)

STM32-01基于HAL库(CubeMXMDKProteus)仿真开发环境搭建(LED点亮测试实例) 一、 开发工具版本列表二、安装过程三、实例测试(点亮单个LED)0、功能需求分析1、Proteus绘制电路原理图2、STMCubeMX 配置引脚及模…

35.网络游戏逆向分析与漏洞攻防-游戏网络通信数据解析-登录成功数据包内容分析

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果 内容参考于:易道云信息技术研究院VIP课 上一个内容:34.登录数据包的…

2.3 Mac OS安装Python环境

Mac OS安装Python环境 和 Linux 发行版类似,最新版的 Mac OS X 也会默认自带 Python 2.x。 我们可以在终端(Terminal)窗口中输入python命令来检测是否安装了 Python 开发环境,以及安装了哪个版本,如下所示&#xff1…

go的for循环应该这么用

目录 目录 一:介绍 1: for流程控制 2:for-range流程控制 二:实例展示 1://按照一定次数循环 2://无限循环 3: //循环遍历整数、各种容器和通道 4:遍历通道 5://指针数组循环 6&…

javaWeb个人日记(博客)管理系统

一、简介 在快节奏的生活中,记录生活点滴、感悟和思考是一种重要的方式。基于此,我设计了一个基于JavaWeb的个人日记本系统,旨在帮助用户轻松记录并管理自己的日记。该系统包括登录、首页、日记列表、写日记、日记分类管理和个人中心等功能&…

ssm006基于java的少儿编程网上报名系统+vue

少儿编程网上报名系统 摘 要 在国家重视教育影响下,教育部门的密确配合下,对教育进行改革、多样性、质量等等的要求,使教育系统的管理和运营比过去十年前更加理性化。依照这一现实为基础,设计一个快捷而又方便的网上少儿编程网上…