【Linux网络】网络基础
本篇博客整理了 Linux 网络编程的前置知识,例如网络的发展、协议和协议栈分层、网络通信原理、网络地址等,为后续进入 Linux 网络编程作铺垫。
目录
一、网络发展
二、网络协议
1)协议的作用
2)协议栈
3)协议分层
4)OSI 参考模型
5)TCP/IP 分层模型
三、网络通信原理
1)同局域网的通信
.1- 协议的报文、报头、有效载荷
.2- 数据的封装、解包和分用
.3- 碰撞
2)广域网的通信
四、网络地址
1)MAC 地址
2)IP 地址
一、网络发展
由计算机的协同,网络的发展大致可以分为四个阶段:独立模式、互联模式、局域网、广域网。
- 独立模式:计算机之间相互独立
早期,计算机之间是相互独立的,如果要由多台计算机来完成一个任务,那么就只能等一台计算机处理完后,再将数据传递给下一台计算机,让下一台计算机进行相应的业务处理,
虽然多台计算机可以共同完成一个任务,但它们之间并没有协作,而且还存在对资源的竞争,使得完成任务的效率十分低下。
计算机是为人服务的,人和人之间是存在协作的,因此,计算机之间能够进行协作是计算机发展的一个必然趋势。
计算机之间进行协作的前提,是计算机之间能够进行数据的传输。然而,计算机之间本身是不能传输数据的,最初在计算机的物理层面本身就没有硬件支持,直到后来,有人用“线”将一台计算机与另一台计算机连接起来,使得计算机之间通过"线"来传输数据。而连接计算机的“线”其实就叫做网线,同时这也使得计算机从独立模式走向互联模式。
- 互联模式:多台计算机连接在一起,进行数据共享
将共享的数据放到服务器中进行集中管理,就可以让多台计算机获取这些共享的数据,使它们不仅可以协同完成一个任务,还可以随时地、自由地在任务间进行切换。
- 局域网(LAN,Local Area Network):计算机数量更多了,通过交换机和路由器连接在一起
起先,几台计算机连接在一起,形成一个规模较小的网络,协同处理任务。后来,网络逐渐发展,越来越多计算机也连入到这个网络中,于是就出现了局域网的概念。
在局域网中,有一种设备叫做交换机,主要完成局域网内数据的转发工作,具体来说就是在局域网内将数据从一台主机转发给另一台主机。
而各个局域网之间,又有一种设备叫做路由器,主要完成局域网之间数据的路由转发工作。
- 广域网(WAN,Wide Area Network):将远隔千里的计算机都连接在一起
各个局域网之间通过路由器相互连接在一起,组成一个更大的网络结构,被称之为广域网,可以实现不同局域网之间的数据传输。
实际上,局域网和广域网是一种相对的概念,广域网也可以看作是一个比较大的局域网。
二、网络协议
“协议”本质是一种约定,通信双方做了某种约定之后,就可以通过这种约定来完成一些事情。
假设在技术不发达的年代,小明要去上大学了,但小明没有手机,只能通过电话亭联系家里的座机,为了节省电话费,小明在走之前和父母做了个约定:
- 家里的座机响一声,说明小明很好,不用担心。
- 家里的座机响两声,说明小明没钱了,需要通过信用社或者邮寄打钱。
- 家里的座机响三声,说明小明有其他事情,需要父母接起电话来交流。
家里的座机响几声并意味着什么,就是小明和父母之间做的约定,也就是协议。
多台计算机为了通信而共同遵从一组约定,这组约定可以用计算机语言表达,使每台计算机都能识别约定的相关内容,而这组约定就是网络协议。
【Tips】纯硬件的约定方案
计算机之间的传输媒介是光信号和电信号,通过“频率”和“强弱”可以表示 0 和 1 这样的信息,因此要想传递各种不同的信息,就需要约定好双方的数据格式。
【Tips】纯软件的约定方案
假设有多台计算机对于以下位段结构曾做过以下约定:
struct cmd {int code : 4;int data : 28; }
- 若 code 的值为 1,则将 data 的值存储进数据库。
- 若 code 的值为 2,则将 data 的值写入日志信息。
- 若 code 的值为 3,则将 data 的值进行打印输出。
当甲计算机向乙计算机发送类似于 {1, 0x1234} 的数据时,乙计算机识别到 code 的值为1,于是就知道了甲计算机是让自己将data的值存储进数据库。
1)协议的作用
如果通信双方的距离较近,通信的障碍就会很小,通信的内容也不容易出错。这就好比两个人面对面聊天,双方要说的话基本可以方便地、清晰地传达。
而如果通信双方的距离很远,通信就会遇到很多障碍,也就是通信问题,例如,信号在传输过程中会受到各种干扰,可能导致通信的内容丢失或赘余。这就好比,两个人之间相隔了一百米,由于声波的衰减和空气的阻力,哪怕喊的声音非常大,双方要说的话也基本很难让对方接收清楚;当这个距离从一百米变至一千米,甚至更远,双方的交流也越来越困难了。
在上文小明跟父母打电话的例子中,小明跟父母做了一些协议,电话响的次数不同,所传达的信息和父母应对的行为也不同,总体上简化了通信的过程,也节省了一些通信的成本。
而远距离的通信双方,同样可以通过协议来克服远距离传输所附带的问题,同时降低通信的成本。
【Tips】所有网络问题的本质:信号的物理传输距离过长。
【Tips】协议的存在其实就是为了降低通信的成本。
2)协议栈
人们通常在电脑或手机上使用的的应用软件,例如QQ、淘宝、B站等,都是在应用层的,用户在应用层的各种请求最终会下达给操作系统,由操作系统进一步帮用户完成。
操作系统除了要做进程管理、文件管理、内存管理、驱动管理之外,其中还有一个内嵌的软件协议栈,协议栈将用户的数据进行各种封包后,通过网卡将数据传递到网络当中,数据在网络内部经过各种路由转发,最终将数据传送到了对端服务器。
对端服务器本身也是一台计算机,也有自己的协议栈。对端服务器将获取的数据通过协议栈进行各种解包操作后,会上交给应用层,应用层中有对应的服务器软件,例如QQ服务器、淘宝服务器、B站服务器等。软件服务器对数据进行各种分析处理后,会以相同的方式将结果返回给用户。
协议栈是网络标准组织定义的,具有全球性,所有操作系统都必须支持。客户端和服务端可以使用不同种类的操作系统,但每个操作系统实现网络协议栈的方法包括各种细节都必须一致,双方对数据进行的封包和解包操作都必须一致。
3)协议分层
为了将层与层之间进行解耦,保证代码的可维护性和可扩展性,网络协议栈被设计成层状结构。
以两个人用座机打电话为例,整个通话的过程大致可以分为两层:语言层和通信设备层。
两个人在打电话的时候,并不是直接进行交流的。当甲要对乙说话时,甲是对甲所持的电话在说话,而甲所持的电话会将“甲说的话”记录下来并进行一系列的编码转码,然后通过通信网络将“甲说的话”从甲所持的电话传递到乙所持的电话,最终,经过编码转码的“甲说的话”在乙所持的电话中再经过一系列的编码转码,就使乙能够在电话中听到了“甲说的话”。当乙要对甲说话时同理。
假设甲乙之间的通话用的是汉语,或称其为语言层,遵守了一种汉语协议;电话和电话之间通信用网络作为媒介,或称其为通信设备层,遵守了一种座机协议;而甲乙和电话之间,也就是语言层和通信设备层之间是通过一些接口关联起来的。
通话的过程中,每一层都各自遵守了一种协议,而且对于同一层来说,所遵守的协议是可以按需替换的。
例如甲乙之间的通话不再使用汉语,而是英语,那么语言层所要遵守的不再是汉语协议,而是英语协议了;通话的设备可以不是座机,而是手机,那么通信设备层所要遵守的可能就不再是座机协议,而是手机协议了。
尽管每一层所遵守的协议能够发生替换,但通信的双方始终都能够保持通信,不受协议替换的影响。
【Tips】协议分层的重要特征(1):
分层最大的好处在于“封装”,可以灵活地使用和替换某一层的协议,而使通信的双方是始终保持通信且不受协议替换的影响。
由以上例子, 尽管从细节上看,甲乙并不是直接进行通信的,通信过程中存在一系列不可省略的步骤,但总体来说,甲乙之间由于都属于语言层,且都遵守了汉语协议或英语协议,因此,可以简单地认为甲乙是直接进行通信的。
同理, 尽管从细节上看,设备和设备之间并不是直接进行通信的,甲乙说的话经过设备后,还需要经过各种基站、各种电信网络来进行数据转发,但总体来说,设备和设备之间由于都属于通信设备层,且都遵守了座机协议或手机协议,因此,也可以简单地认为设备和设备之间是直接进行通信的。
这也就是说,同层协议下,双方可以直接进行通信。
【Tips】协议分层的重要特征(2):
同层协议下,双方可以直接进行通信,这是对网络协议的一个基本认识。
【小结】协议分层——高内聚,低耦合:
- 在软件设计方面的优势:低耦合,某一层发生变化并不影响其他层。
- 分层的依据:功能比较集中,耦合度比较高的模块就可以分为一层(高内聚)。
- 每一层都要解决特定的问题。
【补】在网络通信中,通信双方基本要面对的问题:
- 如何把数据交付给和自己直接相连的下一台主机。
- 要有路径选择的能力,因为网络通信过程中存在很多节点。
- 容错纠错的能力,当通信信息发送错误时,能够处理。
- 当信息递达以后,具体的应用问题。
以上就是协议分层的大致原理。
实际中的网络协议分层,主要有 OSI 模型、TCP/IP 模型两种。
4)OSI 参考模型
OSI 七层网络模型(Open System Interconnection),或称为开放式系统互联参考模型,是一个逻辑上的定义和规范,从逻辑上把网络分为了 7 层.,使每一层都有相关和相对应的物理设备,比如路由器、交换机等。
OSI 七层模型是一种框架性的设计方法,其最主要的功能是,帮助不同类型的主机实现数据传输。
它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整,通过七个层次化的结构模型使不同的系统、不同的网络之间实现可靠的通信。
| 分层名称 | 功能 | 每层功能概览 | |
| 7 | 应用层 | 针对特定应用的协议 | ![]() |
| 6 | 表示层 | 设备固有数据格式和网络标准数据格式的转换 | ![]() |
| 5 | 会话层 | 通信管理、负责建立和断开通信连接(数据流动的逻辑通路)、管理传输层以下的分层 | ![]() |
| 4 | 传输层 | 管理两个节点之间的数据传输、负责可靠性传输(确保数据被可靠地传送到目标地址) | ![]() |
| 3 | 网络层 | 地址管理与路由选择 | ![]() |
| 2 | 数据链路层 | 互联设备之间传送和识别数据帧 | ![]() |
| 1 | 物理层 | 以0/1代表电压的高低以及灯光的闪灭、界定连接器和网线的规格 | ![]() |
5)TCP/IP 分层模型
TCP/IP 是“一组协议”的代名词,是由许多协议共同组成的协议簇。
TCP/IP 模型也遵循 OSI 规则。由于 OSI 参考模型的上三层(5、6、7),到目前为止都没有完全统一的协议标准,且情况复杂多变,因此, TCP/IP 模型将 OSI 参考模型的上三层合并为一层应用层,实际中 TCP/IP 模型也就一共有五层。
而由于物理层与底层电路硬件有关,与网络编程相关性小,因此在学习网络编程的时候, TCP/IP 模型可以大致看作四层。
| 分层名称 | 功能 | |
| 5 | 应用层 | 负责应用程序间沟通。比如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。 |
| 4 | 传输层 | 负责两台主机之间的数据传输。例如传输控制协议(TCP),能够确保数据可靠的从源主机发送到目标主机。 |
| 3 | 网络层 | 负责地址管理和路由选择。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间数据传输的线路(路由)。路由器(Router)就是工作在网络层的。 |
| 2 | 数据链路层 | 负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。数据链路层底层的网络通信标准有很多,如以太网、令牌环网、无线LAN等。交换机(Switch)就是工作在数据链路层的。 |
| 1 | 物理层 | 负责光/电信号的传递方式。比如现在以太网通用的网线(双绞线)、早期以太网采用的同轴电缆(现在主要用于有线电视)、光纤,现在的WiFi无线网使用的电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)就是工作在物理层的。 |
【补】路由器
路由器的作用是,用来进行路径规划。因为网络通信中,一台计算机发送信息到另一台计算机的信息传递过程中,路径上会有很多的节点,而通过路由器规划后,信息就能准确的发到另一个计算机上。
【补】集线器
电磁信号在长距离传输过程中信号是会衰减的,而集线器的主要功能就是对接收到的信号进行再生整形放大,以扩大网络的传输距离,同时把所有节点集中在以它为中心的节点上。
需要注意的是,集线器属于纯硬件网络底层设备,基本上不具有类似于交换机的“智能记忆”能力和“学习”能力,也不具备交换机所具有的 MAC 地址表,所以它发送数据时都是没有针对性的,而是采用广播方式发送,也就是说,当集线器要向某节点发送数据时,不是直接把数据发送到目的节点,而是把数据包发送到与集线器相连的所有节点。
【补】以太网
“以太网”这个名字实际来源于物理学。物理学发展早期,很多科学家都认为任何信息的传播都是需要介质的,光也不例外——既然光能够从太阳传播到地球上,那么在传播过程中一定需要某种介质,于是物理学家们就提出了一个“以太假说”,认为宇宙空间并不是真空的,而是填充满了一种叫做“以太”的物质的,而“以太”就是作为光传播的介质。但后来经过实验后发现,“以太”这种物质实际上是不存在的。
在这个故事中,有两个人物是与计算机学科相关的,一个人叫做图灵,另一个叫做冯诺依曼,这两位当时也参与了相关的学术讨论。
再后来,局域网问世了,需要对局域网进行命名。由于在计算机领域,人们确实做出了一种能够传播物质(信息)的、类似于“以太”的东西,同时也为了纪念“以太假说”,于是人们就将早期的局域网标准命名为了“以太网”。
以太网在任何一个时刻只允许一台计算机在局域网中发送消息,否则发生碰撞,此时的局域网也被叫做碰撞域。发生碰撞后,局域网中的信息都会被舍弃,计算机也需要重新发送信息。
另外,由于在局域网的中存在一张令牌,只有持有令牌的计算机才能在局域网中发生消息(这张令牌是在所有计算机之间传递的,和信号量类似),因此局域网又称为令牌环网。
以太网、令牌环网等,其实都是一种局域网中计算机之间的通信规则,相当于不同的通信协议。而局域网本质是一种共享资源,局域网中的所有计算机都能看到,因此在局域网中传输信息也需要互斥。【补】交换机
是和计算机直接相连的设备,局域网中的所有计算机都是通过交换机互相建立链接的。
【补】跨层
一般而言:
- 对于一台主机, 它的操作系统内核实现了从传输层到物理层的内容
- 对于一台路由器, 它实现了从网络层到物理层
- 对于一台交换机, 它实现了从数据链路层到物理层
- 对于集线器, 它只实现了物理层
但这并不绝对 . 很多交换机也实现了网络层的转发 ; 很多路由器也实现了部分传输层的内容(比如端口转发 )。
【补】TCP/IP 分层模型 vs OSI 参考模型
【补】TCP/IP 分层模型 vs Linux 操作系统层状结构
- 应用层——具体的代码实现
- 网络层和传输层——内核层(会提供相应的系统调用接口)
- 数据链路层——驱动层
三、网络通信原理
以下以两台计算机之间进行通信为例,通过 TCP/IP 分层模型,演示网络传输的流程。
1)同局域网的通信
.1- 协议的报文、报头、有效载荷
假设上文中的小明长大了,后来学会了网上购物,并在网上买了一个水杯。
小明买的这个水杯并不是由商家直接交付到小明手里的,而是先要有商家将水杯打包好,交给快递公司,然后是快递公司在包裹贴上包含了很多信息的快递单,再将包裹寄送到小明填写的地址,等到小明收到快递员的电话后,取到包裹、拆开包裹之后才能得到买的水杯。
小明去取买的水杯的时候,实际上取的并不是一个水杯,由于水杯是被打包起来的,因此连带着取了的还有快递包裹、包裹上的快递单等。
快递单上的信息,例如快递单号、收货地址等,对于快递公司、快递员等来说,就相当于是一种协议,通过快递单上的信息,快递公司、快递员等可以准确地将快递包裹送到小明手上。
而类比这个例子,网络通信中的报文其实就相当于送到小明手里的一整个快递包裹,报头就相当于快递单,有效载荷就相当于打包了水杯但没贴快递单的包裹。
【Tips】协议的报文、报头、有效载荷
- 报文:是一份完整的通信数据,报文 = 报头 + 有效载荷。
- 报头:(1)通常位于数据的开头部分,用于描述和控制数据的传输以及提供必要的信息。报头本质也是一种数据,一般是通过位段实现的,协议栈的每一层都有一个对应的位段来表示当前层的报头。(2)在网络通信中,在 TCP/IP 模型的每一层中都存在一种协议,而每一种协议的最终表现就是协议要有协议报头,也就是说,协议通常是通过协议报头来表达的,且每一份数据在被发送或者处于不同的协议层中,都要有自己的报头。
- 有效载荷:指报文中除了报头的部分,是用户数据核心的一部分。
【Tips】报头于封装、于分离
对于报头和有效载荷,TCP/IP 模型的每一层都得必须具备将其封装与分离的能力,只有这样才能将这一层有用的数据封装起来或解析出来。
在不同的层,有效载荷和报头都是不同的,每一层具体的封装操作,一般较为简单,在上一层报文的基础上增加对应层的报头即可;而每一层具体的分离操作,一般与报头的长度,即数据的字节数有关。
由于报头都在数据的首部,因此只要知道报头的大小,就能够将报头和有效载荷进行封装或分离。要获取报头的大小,通常有两种方法:
- 定长报头(报头的大小是固定的)。
- 自描述字段(报头当中提供了一个字段,用来表示报头的长度)。
.2- 数据的封装、解包和分用
同一个局域网内的主机是能够直接进行通信的。
当一份数据要从一台主机传输给另一台主机前,需要先通过网络协议栈进行封装:
- 数据先交给应用层,应用层添加上应用层协议的报头信息后,将数据再交给传输层。
- 传输层收到数据后,再添加上传输层协议的报头信息,并将数据继续向下进行交付。
- 网络层收到数据后,再添加上网络层协议的报头信息,接着将数据再交给链路层。
- 数据链路层收到数据后,最后再添加上数据链路层协议的报头信息,至此数据封装完毕。
直到数据封装完毕,就可以通过局域网发送给对端主机了。
当对端主机收到发来的数据后,也需要通过网络协议栈对其进行解包与分用:
- 数据链路层收到数据后,先将数据中数据链路层协议的报头信息提取出来,然后将剩下的数据交给网络层。
- 网络层收到该数据后,再将数据中网络层协议的报头信息提取出来,然后将剩下的数据继续向上进行交付。
- 传输层收到该数据后,再将数据中传输层协议的报头信息提取出来,然后将剩下的数据再交付给应用层。
- 应用层收到数据后,最后将数据中应用层协议的报头信息提取出来,至此便完成了数据的解包与分用。
也就是说,任何一台主机在发送数据之前,该数据都要先自顶向下贯穿协议栈来完成数据的封装,在这个过程中,每一层协议都会添加上对应的报头信息;而任何一台主机收到数据后,都要先自底向上贯穿协议栈来完成数据的解包和分用,在这个过程中,每一层协议都会将对应的报头信息提取出来。
【Tips】数据的封装、解包和分用
- 封装:在上一层报文的基础上增加对应层的报头(各种协议细节)。
- 解包:将对应层中报文的协议报头去掉。
- 分用:将解包后的有效载荷交给上一层对应的协议(每一层中可能不止有一个协议)。在每种协议的报头当中,几乎都会包含一个字段,表明应该将分离出来的有效载荷交付给上层的哪个协议。
【Tips】协议的性质
- 必须提供一个将报头与有效载荷分离的方法。
- 协议当中必须包含一个字段,表明应该将有效载荷交付给上层的哪个协议。
.3- 碰撞
同一个局域网内的主机是能够直接进行通信的,而实际上,在一个局域网内传输数据时,该局域网内的所有主机都能收到这份数据。
例如下图中,处于同一个局域网的主机 A 和主机 B 要进行通信。主机 A 想要发数据给主机 B的时候,其实局域网内的其他主机也都收到了 A 发的数据,只不过其他主机都能够识别数据的接收者是谁,从而筛选需要自己处理的数据,由此,除了主机 B 外,其他主机都会将 A 发的数据丢弃。
然而同一个局域网内,可能存在不止两台主机要进行通信,甚至可能存在一台主机对多台主机要进行通信。所有主机在通信时,使用的都是同一个通信信道,那么多台主机同时进行通信,就会使通信的数据之间互相产生干扰。而这就是碰撞。
【Tips】网络通信中的碰撞
其实每一个局域网都可以看作是一个碰撞域,对于同一个碰撞域中的主机,如果有一台主机发送的数据与其他主机发送的数据之间产生了干扰,就称这两台主机在该碰撞域中发生了碰撞。
但由于计算机的处理速度和网线传播数据的速度都很快,因此在网络通信压力不大的时候,碰撞发生的概率其实也是不大的。
每个主机是能够通过某种方式,得知自己发送的数据是否发生了碰撞。这是因为,当一台主机将数据发送出去后,该主机本身也是能够收到这个数据的,此时只需将收到的数据与之前发送的数据进行对比,若不相同则说明在发送过程中数据发生了碰撞。
而发生碰撞后,主机会执行“碰撞避免”算法。所谓“碰撞避免”算法是指,如果一台主机发送的数据产生了碰撞,那么该主机可以选择等一段时间后,再重新发送该数据,这就好比两个人在对话时,突然同时说话从而影响了对话的质量,然后其中一人说“你先说吧”。
【补】局域网内数据的发送方式
- 单向数据发送: 主机发送数据帧时,将数据帧当中的目的MAC地址指定为某一台主机,此时每台主机对数据帧进行识别后,最终只有那台指定的主机会将该数据帧向上交付进行处理。
- 局域网内的数据广播: 主机发送数据帧时,将数据帧当中的目的MAC地址设置为全1,此时所有主机收到该数据帧后都会对该数据帧进行处理。
【补】主机如何识别数据的接收者是否为自己?
在局域网中发送的数据实际叫 MAC 数据帧,在 MAC 数据帧的报头中会包含两个字段,分别叫做源 MAC 地址和目的 MAC 地址。
每一台计算机都至少配有一张网卡,每一张网卡在出厂时就已经内置了一个48位的、全球唯一的序列号,被称为 MAC 地址。
在局域网中通信的时候,每一个主机在收到一个 MAC 数据帧后,都会提取 MAC 数据帧的报头,将其中的目的 MAC 地址与自己的 MAC 地址进行比对。若不匹配则直接将该 MAC 数据帧丢弃,若匹配时则将 MAC 数据帧的有效载荷继续向上层进行交付处理。
【补】与碰撞相关的一种局域网攻击机制
如果一个局域网内的某台主机,一直在局域网内发送一些无用的数据,那么会使其他主机一发送数据就会产生碰撞,其他主机“碰撞避免”算法,等待这台主机停止发送数据,最终其他主机主机都“沉默”了,进而导致该局域网瘫痪。
为了能够让某台主机一直发送“垃圾数据”,必须要通过某种方式使其绕过“碰撞避免”算法,否则当其发送的数据导致碰撞后,它自己也会因执行“碰撞避免”算法而瘫痪。
2)广域网的通信
广域网中的通信,也就是跨局域网的通信,与路由器息息相关。
局域网之间都是通过路由器连接起来的,一个路由器至少能够横跨两个局域网。而这些被路由器级联的局域网都认为,这个级联它们的路由器是自己(局域网)内部的一台主机,因此,路由器可以和这些局域网内的任意一台主机直接进行通信。
以以太网和令牌环网内的主机通信为例,由于以太网和令牌环网是不同的通信标准,它们添加的报头是不一样的,因此令牌环网中的主机无法对以太网中的数据帧进行解包。而这个解包的“活儿”其实可以交给路由器处理。
由于路由器是工作在网络层的一个设备,因此可以认为路由器当中的协议栈如下:
一份数据要从以太网发送到令牌环网时,会先经过路由器。路由器收到来自以太网的数据后,会先将以太网对应的报头进行解包,然后将剩下的数据向上交付给网络层,在网络层进行一系列数据分析后,再将数据向下交付给数据链路层。而在数据链路层中,数据会被添加上令牌环对应的报头信息,然后再被发送到令牌环网中。
【补】路由器是怎么“认路”的?
路由器其实是通过IP地址来确定数据的转发方向的。
因特网上的每台计算机都有一个唯一的 IP 地址,而在数据向下进行封装时,在网络层封装的报头当中就会包含两个字段,分别是源 IP 地址和目的 IP 地址。
当路由器需要将一个局域网的数据转发到另一个局域网时,路由器的数据链路层会先去掉数据包含的当前局域网对应的底层报头,并将剩下的数据向上交付给网络层,然后在网络层中获取到该数据对应的目的 IP 地址,并将其拿到路由表中匹配,最终确认该数据应该发送到哪一个局域网。
【补】“底层屏蔽”技术
IP 地址除了可以帮助数据“路由”以外,还屏蔽了底层网络的差异。
对于通信主机双方的 IP 层及其上层的协议而言,它们并不需要关心底层是以太网还是令牌环网,只需关心数据的源 IP 地址和目的 IP 地址,即可将数据发送出去,因此现在主流的网络也叫“IP 网络”。
而这种类似的底层屏蔽技术又例如:
- 进程地址空间: 屏蔽了内存之间的差别,让所有的进程看到的都是同一块内存,且这块内存的布局都相同,能够支持统一的管理操作。
- “Linux下一切皆文件”: 通过文件结构体和函数指针的方案,让用户能够统一地对待文件和某些资源。
四、网络地址
1)MAC 地址
局域网中的每一台计算机都有自己的“名字”。
这是因为,每台计算机都绑定了一张网卡,而每张网卡都有一个独一无二的序列号,即 MAC 地址,以表明自己在局域网中的唯一性。
在Xshell中,输入指令 ifconfig 即可查看当前机器的 MAC 地址:
【Tips】MAC 地址的特点
- MAC 地址仅用在局域网中,识别数据链路层中相连的节点。
- 长度为 48 位,即 6 个字节,一般用 16 进制数字加上冒号的形式来表示(例如 08:00:27:03:fb:19 等)。
- MAC 地址在全球范围内是唯一的(注:虚拟机中的MAC地址不是真实的MAC地址,可能会冲突,也有些网卡支持用户配置MAC地址)
- MAC 地址在网卡出厂时就已经确定,不能修改。
2)IP 地址
在整个广域网中,每一台计算机也有自己的“名字”,即 IP 地址。
由于广域网中有非常多的路由器、基站等,仅靠 MAC 地址无法进行数据路由,因此每台计算机都用一个 IP 地址在广域网中来标识它的唯一性。
在Xshell中,输入指令 ifconfig 也可以查看当前机器的 IP 地址:
【Tips】IP 地址的特点
- IP 地址是在 IP 协议中,用来标识网络中不同主机的地址。
- IP 协议有两个版本,分别是 IPv4 和 IPv6 ,其中,IPv4 用 32 位(是一个整数,即 4 字节)来标识 IP 地址,IPv6 则用 128 位(即 16 字节)来标识 IP 地址。
- 通常也使用“点分十进制”的字符串表示 IP 地址,例如 192.168.0.1,其中,用点分割的每一个数字表示一个字节,范围是0-255。
- 发送报文的 IP 地址叫源地址,接收报文的 IP 地址叫目的地址。
- 在广域网通信的过程中(报文从主机到路由器再到主机),MAC 地址会不断变化,但源 IP 地址和目标 IP 地址始终不变。这是因为,每个路由器都会根据源 IP 地址和目标 IP 地址规划路线,给出下一个路由器或主机的 MAC 地址,使报文越来越接近目标。总得来说,IP 地址相当于的一座灯塔,指引报文的最终去向,而 MAC 地址相当于报文途经的坐标,指引报文接下来的具体去向。
相关文章:
【Linux网络】网络基础
本篇博客整理了 Linux 网络编程的前置知识,例如网络的发展、协议和协议栈分层、网络通信原理、网络地址等,为后续进入 Linux 网络编程作铺垫。 目录 一、网络发展 二、网络协议 1)协议的作用 2)协议栈 3)协议分层…...
Open3D 可视化点云配准中匹配点之间的连线
目录 一、概述 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2处理后的点云 一、概述 在点云配准的过程中,可视化匹配点之间的连线(匹配线)有助于更直观地理解配准结果和误差分布。以下是可视化匹配点之间连线的好处和作用: 1. 直观理…...
Linux编程第三篇:Linux简介,开源软件简介(Linux是否安全?参考TESEC指标)
业精于勤荒于嬉,行成于思毁于随。 今天这篇算是Linux的正式学习,废话不多说,我们开始吧 第三篇 一、UNIX与Linux发展史1.1、UNIX发展历史和发行版本1.2、UNIX主要发行版本1.3、Linux发展历史1.4、Linux内核版本1.5、Linux主要发行版本 二、开…...
【JavaSE复习】数据结构、集合
JavaSE 复习 1.数据结构1.1 查找1.1.1 基本查找1.1.2 二分查找1.1.3 插值查找1.1.4 斐波那契查找1.1.5 分块查找1.1.6 分块查找的扩展(无规律数据) 1.2 排序1.2.1 冒泡排序1.2.2 选择排序1.2.3 插入排序1.2.4 快速排序 2. 集合2.1 基础集合2.1.1 集合和数…...
Java版Flink使用指南——自定义无界流生成器
大纲 新建工程自定义无界流 使用打包、提交、运行工程代码 在《Java版Flink使用指南——从RabbitMQ中队列中接入消息流》一文中,我们让外部组件RabbitMQ充当了无界流的数据源,使得Flink进行了流式处理。在《Java版Flink使用指南——将消息写入到RabbitMQ…...
Vue3框架搭建4:配置说明-eslint配置
配置说明: .eslintrc.cjs: /* eslint-env node */ //node环境,并引入一个模块解析补丁 require(rushstack/eslint-patch/modern-module-resolution)module.exports { //继承其他配置root: true, //跟配置文件,ESLint不会在父目…...
JavaFx+MySql学生管理系统
前言: 上个月学习了javafx和mysql数据库,于是写了一个学生管理系统,因为上个月在复习并且有一些事情,比较忙,所以没有更新博客了,这个项目页面虽然看着有点简陋了,但是大致内容还是比较简单的,于是现在跟大家分享一下我的学生管理系统,希望对这方面有兴趣的同学提供一些帮助 &a…...
Java--抽象类
1.抽象--abstract 2.不能对抽象类进行实例化,也就是不能new这个抽象类 3.抽象类的应用,就是在class前加入abstract这个单词,同理抽象方法也是在void前加入abstract 4.在抽象类中可以写普通方法,但抽象方法只能写在抽象类中 5.…...
26.Labview波形图、XY图、强度图使用精讲
我们如何使用Labview显示曲线或者制作出下面这种我们想要的曲线并随着我们输入值的变化而变化呢? 本文详细讲解一下每种波形图的使用方式,帮助大家深入了解波形图的使用技巧。 文章中所有程序均可在百度网盘下载,下载方式:复制下…...
系统启动 | 安全启动时 “地址线” 被篡改了怎么办?
Hi,你们有没有想过,在咱们启动的过程中,就算是开了安全启动。但是如果在执行最后一条跳转指令时,如果此时改变FLASH或者DDR的地址线,相当于跳转到了非法的地址,那安全启动功能不就丧失了吗? 提到…...
Kafka基础组件图推演
文章目录 1. Controller Broker保障机制 2. 组件架构1. Log Manager2. Replication Manager3. SocketServer4. NetworkServer5. ZKClient 1. Controller Broker Kafka集群中有一个Controller Broker,负责元数据管理和协调。 Kafka使用Zookeeper作为集群元数据的存储…...
k8s中使用cert-manager生成自签名证书
一、安装 cert-manager 注意查看cert-manager和K8S支持的对应版本 我的 k8sv1.28.2,cert-manager v1.12.11 下载 cert-manager.yaml 文件,执行 kubectl apply -f cert-manager.yaml注意:安装成功后如果应用路由使用了Ingress,应用路由不需要…...
处于群晖Docker中的HomeAssistant监控宿主机CPU温度
处于群晖Docker中的HomeAssistant监控宿主机CPU温度 解决方案 在configuration.yaml中添加: sensor: - platform: filename: "Host Temperature" # 可以自定义file_path: /sys/class/hwmon/hwmon0/temp1_inputvalue_template: "{{ int(value)/100…...
STM32串口工作原理
STM32的串口是相当丰富的,功能也很强劲。最多可提供5 路串口,有分数波特率发生器、支持单线光通信和半双工单线通讯、支持LIN、智能卡协议和IrDA SIRENDEC 规范(仅串口3支持)、具有DMA等。 串口最基本的设置,就是波特率的设置。STM32的串口使…...
STM32杂交版(HAL库、音乐盒、闹钟、点阵屏、温湿度)
一、设计描述 本设计精心构建了一个以STM32MP157A高性能单片机为核心控制单元的综合性嵌入式系统。该系统巧妙融合了蜂鸣器、数码管显示器、点阵屏、温湿度传感器、LED指示灯以及按键等多种外设模块,形成了一个功能丰富、操作便捷的杂交版智能设备。通过串口…...
多输入多输出 | Matlab实现Transformer多输入多输出预测
多输入多输出 | Matlab实现Transformer多输入多输出预测 目录 多输入多输出 | Matlab实现Transformer多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现Transformer多输入多输出预测(完整源码和数据) 1.da…...
Linux文件编程(标准C库)
目录 一、标准C库打开/创建文件,读写文件,光标移动 二、标准C库写入结构体到文件 三、其他函数补充 1.fputc函数 2.feof函数和fgetc函数 前面讲到的open函数都是基于linux内核的,也就是说在Windows系统上无法运行,移植性比较…...
生产英特尔CPU处理器繁忙的一天
早晨:准备与检查 7:00 AM - 起床与准备 工厂员工们早早起床,快速洗漱并享用早餐。为了在一天的工作中保持高效,他们会进行一些晨间锻炼,保持头脑清醒和身体活力。 8:00 AM - 到达工厂 员工们到达英特尔的半导体制造工厂&#…...
MVC拦截器、ThreadLocal来进行登录拦截
MVC拦截器、ThreadLocal来进行登录拦截 1. 对登录进行拦截1.1 什么是ThreadLocal1.2 定义UserHolder 类,来封装ThreadLocal方法1.3 拦截器WebMvcConfigurer 的配置1.4 登录的配置,当碰到拦截的方法的时候调用1.5 UserServiceImpl1.6 controllerÿ…...
小程序问题
1.获取节点 wx.createSelectorQuery() wx.createSelectorQuery().in(this) //组件中加in(this),不然获取不到 2.使用实例 wx.createSelectorQuery().in(this).select(#share).fields({node: true,size: true}).exec(async (res) > {const canvas res[0].node;…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
动态规划-1035.不相交的线-力扣(LeetCode)
一、题目解析 光看题目要求和例图,感觉这题好麻烦,直线不能相交啊,每个数字只属于一条连线啊等等,但我们结合题目所给的信息和例图的内容,这不就是最长公共子序列吗?,我们把最长公共子序列连线起…...
Netty自定义协议解析
目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...
Cursor AI 账号纯净度维护与高效注册指南
Cursor AI 账号纯净度维护与高效注册指南:解决限制问题的实战方案 风车无限免费邮箱系统网页端使用说明|快速获取邮箱|cursor|windsurf|augment 问题背景 在成功解决 Cursor 环境配置问题后,许多开发者仍面临账号纯净度不足导致的限制问题。无论使用 16…...

























