Linux - 第11节 - 网络入门

2023-05-16

目录

1.计算机网络背景

1.1.网络发展

1.2.认识 "协议"

2.网络协议初识

2.1.协议分层

2.2.OSI七层模型

2.3.TCP/IP五层(或四层)模型

3.网络传输基本流程

3.1.同局域网的两台主机通信

3.2.跨网络的两台主机通信


1.计算机网络背景

1.1.网络发展

\bullet 独立模式:计算机之间相互独立

在早期的时候,计算机之间是相互独立的,此时如果多个计算机要协同完成某种业务,那么就只能等一台计算机处理完后再将数据传递给下一台计算机,然后下一台计算机再进行相应的业务处理,效率非常低下。

\bullet 网络互联:多台计算机连接在一起,完成数据共享 

这时就有人设法将这些计算机连接在一起,当某个业务需要多台计算机协同完成时,就可以将共享的数据放到服务器中进行集中管理,此时各个计算机就都能获取到这些共享的数据,所以各个业务在处理就能随时进行切换了。

注:

1.在一台计算机中具有很多设备,如下图所示,这些设备都是硬件,这些硬件是如何进行数据交互的?设备和设备之间(硬件和硬件之间)一定要有“线”连接,计算机体系结构本质也可以被看作成一个小型网络。在一台计算机中,这些设备之间的“线”比较短,如果多台计算机要进行通信,那么多台计算机之间要用长一点的“线”(网线、无线LAN)连接起来,其本质是用“线”将多台计算机的网卡设备用“线”连接起来。

计算机体系结构内部各设备间是用“线”连接起来传输数据的,而用“线”将多个计算机体系结构连接起来,可以看作是计算机体系结构的延展。

2.主机内“线”比较短,“线”比较短可能存在信号干扰问题。跨主机“线”比较长,“线”比较长可能存在可靠性、效率、寻找到对方的问题。

\bullet 局域网LAN:计算机数量更多了,通过交换机和路由器连接在一起

后来这样的网络雏形逐渐发展,连入这个网络中的机器变得越来越多,于是就出现了局域网的概念。

在局域网中有一种设备叫做交换机,交换机主要完成局域网内数据的转发工作,也就是在局域网内将数据从一台主机转发给另一台主机。各个局域网之间通过路由器连接起来,路由器主要完成数据的路由转发工作。

\bullet 广域网WAN:将远隔千里的计算机都连在一起

各个局域网之间通过路由器相互连接在一起,便组成了一个更大的网络结构,我们将其称之为广域网。实际局域网和广域网是一种相对的概念,我们也可以将广域网看作一个比较大的局域网。

注:局域网内部没有路由器,广域网内部涉及到多种路由器且要接入公网。

1.2.认识 "协议"

协议的概念:

“协议”本质就是一种约定,通信双方只要曾经做过某种约定,之后就可以使用这种约定来完成某种事情。而网络协议是通信计算机双方必须共同遵从的一组约定,因此我们一定要将这种约定用计算机语言表达出来,此时双方计算机才能识别约定的相关内容。

计算机之间的传输媒介是光信号和电信号. 通过 “频率” 和 “强弱” 来表示 0 和 1 这样的信息。 要想传递各种不同的信息, 就需要约定好双方的数据格式。

协议应该由谁来定制:

在当前这个互联网时代,计算机生产商有很多,计算机操作系统也有很多,计算机网络硬件设备更是多种多样,那我们是如何让这些不同厂商之间生产的计算机能够相互顺畅的通信的呢?这时候就需要有人站出来,约定一个共同的标准,并且让大家都来遵守这个标准,这就是网络协议。

而那个站出来的人一定是该领域当中的佼佼者,因为网络协议的定制本质就是规则的定制,你要站出来制定规则那么一定要同行业的其他人都认可你。比如5G标准的定义,华为就是那个站出来的人,华为在通信领域已经具备很强的通信能力了,在这个行业里它就是所谓的佼佼者。

正所谓“一流的企业做标准,二流的企业做品牌,三流的企业做产品”。但是标准的定制有一部分是公益性、开源性的,它制定标准的目的是为了让我们的世界变得更好;而标准的定制还有一部分是具有一定盈利性质的,当你需要使用这项技术时就会收取部分专利费,此时就能将曾经做的技术投入进行变现。


2.网络协议初识

2.1.协议分层

协议分层的好处:

网络协议栈设计成层状结构,其目的就是为了将层与层之间进行解耦,分层的同时将问题归类,便于工程师进行维护,保证代码的可维护性和可扩展性。

比如在打电话的时候,站在工程师的角度实际这两个人并不是直接进行沟通的,而是甲的电话将甲说的话记录下来,经过一系列编码转码后,通过通信网络将信息从甲的电话传递到了乙的电话,然后信息在乙的电话中再经过对应的编码转码,最后乙才通过话筒听到了甲所说的话。

其中,人与人之间通信使用的是汉语,我们可以将其称为语言层;而电话和电话之间通信使用的是电话系统相关的一些接口,我们可以将其称之为通信设备层。

后来随着科技的发展,我们都用上了智能手机,此时我们下层使用的通信设备变了,或是这部电话卖到了其他国家,此时上层使用的通信语言变了,但我们仍然可以正常沟通。

分层最大的好处在于“封装”,在分层情况下,将某层的协议进行替换后,通信双方之间是不会受到影响的。

理解各层之间直接通信:

从上述例子我们还可以看出,虽然在打电话时我们并不是直接进行沟通的,但是我们可以认为我们是在直接进行沟通,并且这两台电话也不是直接在进行沟通的,数据经过电话后,还需要各种基站,各种电信网络来进行数据转发,但是这两台电话依旧可以认为是直接在和对方电话进行通信的。

因此对于网络协议我们需要有一个基本的认识:关于通信,同层协议可以认为自己在和对方层直接进行通信,从而达到简化对于网络协议栈的理解。因此同层之间一定要有自己的协议。

也就是说,在网络协议栈中我们可以认为通信双方的应用层之间直接在进行通信,也可以认为通信双方的传输层之间直接在进行通信,对于网络层和数据链路层也同样如此。

2.2.OSI七层模型

上面我们说的是TCP/IP四层协议,而实际当初那个站出来的人定的协议叫做OSI七层协议:

\bullet OSI(Open System Interconnection,开放系统互联)七层网络模型称为开方式系统互联参考模型,是一个逻辑上的定义和规范。
\bullet OSI把网络从逻辑上分为了七层,每一层都有相关的、相对应的物理设备,比如路由器,交换机。
\bullet OSI七层模型是一种框架性的设计方法,其最主要的功能就是帮助不同类型的主机实现数据传输,比如手机和电视之间数据的传输。
\bullet OSI七层模型最大的优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整,通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯。
\bullet 但是,OSI七层模型既复杂又不实用,所以后来在具体实现的时候就对其进行了调整,于是就有了我们现在看到的TCP/IP四层协议。

OSI七层模型:

2.3.TCP/IP五层(或四层)模型

TCP/IP是一组协议的代名词,它还包括许多协议,共同组成了TCP/IP协议簇。TCP/IP通讯协议采用了五层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。

\bullet物理层:负责光/电信号的传递方式。比如现在以太网通用的网线(双绞线)、早期以太网采用的同轴电缆(现在主要用于有线电视)、光纤,现在的WiFi无线网使用的电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等。集线器(Hub)就是工作在物理层的。
\bullet数据链路层:负责设备之间的数据帧的传送和识别。例如网卡设备的驱动、帧同步、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。数据链路层底层的网络通信标准有很多,如以太网、令牌环网、无线LAN等。交换机(Switch)就是工作在数据链路层的。
\bullet网络层:负责地址管理和路由选择。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间数据传输的线路(路由)。路由器(Router)就是工作在网络层的。
\bullet传输层:负责两台主机之间的数据传输。例如传输控制协议(TCP),能够确保数据可靠的从源主机发送到目标主机。
\bullet应用层:负责应用程序间沟通。比如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。我们的网络编程主要就是针对应用层的。

注:物理层不属于软件范畴,且我们考虑的比较少, 因此很多时候也可以称为TCP/IP四层模型

TCP/IP五层(或四层)模型与OSI七层模型各层的对应关系:

如下图所示,可以看到它们的下面几层几乎是没有区别的,操作系统对应的是传输层和网络层,数据链路层和物理层都是对应在驱动层的,而TCP/IP协议当中的应用层就对应到OSI七层协议当中的应用层、表示层和会话层。

一般而言:

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

但这并不是绝对的,比如很多交换机也实现了网络层的转发,很多路由器也实现了部分传输层的内容(比如端口转发)。

补充知识1:集线器(工作在物理层)

电磁信号在长距离传输过程中信号是会衰减的,而集线器的主要功能就是对接收到的信号进行再生整形放大,以扩大网络的传输距离,同时把所有节点集中在以它为中心的节点上。

需要注意的是,集线器属于纯硬件网络底层设备,基本上不具有类似于交换机的“智能记忆”能力和“学习”能力,也不具备交换机所具有的MAC地址表,所以它发送数据时都是没有针对性的,而是采用广播方式发送,也就是说,当集线器要向某节点发送数据时,不是直接把数据发送到目的节点,而是把数据包发送到与集线器相连的所有节点。

补充知识2:猫(工作在物理层)

猫的英文名称是MODEM,中文名称是调制解调器,作用是实现信号转换的。数字信号适合在局域网内通信,模拟信号适合长距离转发。我们平常上网时计算机内部和运营商的机房设备内部所传送的信号是数字信号,而线路上传送的信号是模拟信号,那么就需要一个设备来完成数字/模拟信号之间的转换,完成通信过程,这就是猫的作用。

补充知识3:以太网名字的由来

“以太网”这个名字实际来源于物理学,在早期的时候,很多科学家都认为任何信息的传播都是需要媒介的,因此物理学家们就认为光的传播也是需要媒介的。这时物理学家们就发现了一个问题:既然光能够从太阳传播到地球上,那么在这个传播的过程中一定需要某种媒介,但太阳和地球之间不是绝对真空的状态吗?

此时物理学家们就提出了一个“以太假说”,认为宇宙空间并不是真空的,而是填充满了一种叫做“以太”的物质的,此时“以太”就可以作为光传播的媒介。但后来经过实验后发现,“以太”这种物质实际上是不存在的。

其中在这个故事线当中有两个人是与计算机学科相关的,一个人叫做图灵,另一个叫做冯诺依曼,这两个人当时也是参与了这场讨论的,因为他们不仅是计算机科学家,同时也是数学家。

经过后来的发展,在局域网产生之后就需要对局域网进行命名,而在局域网命名的时候人们就将其命名为“以太网”。因为我们曾经在物理学上认为“以太”就是传送物质的介质,也就是说“以太”是具有某种通信能力的,虽然“以太”在物理学上验证是不存在的,但现在在计算机领域我们做出来了这样一种东西,它也是能够传播物质(信息)的,同时也为了纪念之前的“以太假说”,于是早期的局域网标准就被命名为了“以太网”。

补充知识4:网络和操作系统之间的关系

操作系统工作在传输层和网络层,驱动程序工作在数据链路层,硬件设备工作在物理层,如下图所示。发送数据需要使用网卡(硬件),因此用户想要发送数据必须从上至下贯穿操作系统,操作系统是硬件的管理者,那么操作系统必须对上提供系统调用。在应用层库、指令、shell等根据系统调用进行功能设计,进而被用户使用。

tcp/ip协议和操作系统之间的关系是:操作系统内部有一个模块就叫做tcp/ip协议,网络协议栈是隶属于操作系统的。

如果有多台主机要进行通信,假设用户1向用户2发起通信请求,那么请求会从上至下贯穿用户1主机的TCP/IP五层模型到物理层,然后经过网络路由转发,被用户2的主机物理层收到,进而请求会从下至上贯穿用户2主机的TCP/IP五层模型被用户2收到。

体系结构直接决定数据包在主机内进行流动的时候,一定是要进行自顶向下或自底向上流动的,以前所有IO的过程都是这样的。然而在同层之间,同层的协议都认为自己在和同层的对方直接通信,所以每一层都要有自己的协议。

补充知识5:计算机的视角如何看待协议

举个例子,用户和商家沟通好要买一个鼠标,实际上快递员给用户的是一个包裹,包裹里面有鼠标。用户收到的除了鼠标还多给我了一些东西,即包裹上的快递单。快递单是一种数据,是快递公司、快递点、快递小哥之间约定的协议。快递公司根据快递单的不同有不同的操作,例如根据目的地的不同会派送往不同的地方。

那么计算机如何看待协议呢?体现在数据和代码逻辑上:

\bullet 体现在数据上:计算机网络与上面的例子类似,为了维护协议,一定要在被传输的数据上新增其他数据(协议数据)。

\bullet 体现在代码逻辑上:计算机网络与上面的例子类似,会根据不同的新增协议数据执行不同的代码逻辑。

补充知识6:封装与解包

如下图所示,用户1给用户2发送“你好”消息,消息自顶向下流动,每经过一层都要加入对应层的协议数据,用户2收到消息,消息自底向上流动,每经过一层该层都会从消息中获取对应层的协议数据,最后到用户2时收到的就是“你好”消息。

注:

1.因为同层之间都认为自己在和同层的对方直接通信,所以用户1应用层发的是“\square你好”,用户2应用层收到的也是“\square你好”,以此类推。

2.我们将每一层给下一层交付的数据中,数据开头“多出来的协议数据”叫做报头。报头是用来描述某一层协议相关字段的,因为每一层都有对应协议,因此每一层都有属于当前层的报头结构。

3.消息自顶向下流动,每一层添加对应层报头字段的过程叫做封装。消息自底向上流动,每一层去掉对应层报头字段的过程叫做解包。


3.网络传输基本流程

我们这里以两台主机进行文件传输为例,此时各层对应的协议如下:

3.1.同局域网的两台主机通信

同一个局域网内的主机是能够直接进行通信的,因为最初局域网设计的目的,就是为了让局域网内的主机能够进行通信。

局域网的常见标准有:以太网、令牌环网、无线LAN。

同局域网的两台主机通信如下图所示:

当用户要将文件传输给另一台主机前,该文件数据需要先通过网络协议栈进行封装:

\bullet 文件数据先交给应用层,应用层添加上对应应用层协议的报头信息后,将数据再交给传输层。
\bullet 传输层收到数据后,再添加上对应传输层协议的报头信息,并将数据继续向下进行交付。
\bullet 网络层收到数据后,再添加上对应网络层协议的报头信息,接着将数据再交给链路层。
\bullet 链路层收到数据后,最后再添加上对应链路层协议的报头信息,至此数据封装完毕。
数据封装完毕后就可以通过局域网将其发送给对端主机了,而当对端主机收到数据后,对应也需要通过网络协议栈对该数据进行解包:

\bullet 链路层收到数据后,先将数据中对应链路层协议的报头信息提取出来,然后将剩下的数据交给网络层。
\bullet 网络层收到该数据后,再将数据中对应网络层协议的报头信息提取出来,然后将剩下的数据继续向上进行交付。
\bullet 传输层收到该数据后,再将数据中对应传输层协议的报头信息提取出来,然后将剩下的数据再交付给应用层。
\bullet 应用层收到数据后,最后将数据中对应应用层协议的报头信息提取出来,至此便完成了数据的解包。
也就是说,任何一台主机在发送数据之前,该数据都要先自顶向下贯穿协议栈来完成数据的封装,在这个过程中,每一层协议都会添加上对应的报头信息;而任何一台主机收到数据后,都要先自底向上贯穿协议栈来完成数据的解包,在这个过程中,每一层协议都会将对应的报头信息提取出来。

数据包封装和分用:

\bullet 段、数据报、帧:不同协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)。

\bullet 封装:应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation)。首部信息中包含了一些类似于首部有多长,载荷(payload)有多长,上层协议是什么等信息。

\bullet​​​​​​​ 分用:数据包添加报头的时候,每层协议都要考虑未来解包的时候,将自己的有效载荷交付给上层的哪一个协议,因此添加的报头中有上层协议是什么的信息。决定自己向上交付给哪一个协议的过程就是有效载荷分用的过程。数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的“上层协议字段”将数据交给对应的上层协议处理。

\bullet 所有协议的公共属性:

(1)一般而言,任何报头属性里面,一定要存在一些字段支持封装和解包。

(2)一般而言,任何报头属性里面,一定要存在一些字段支持分用。

下图为数据封装的过程:

下图为数据分用的过程:

局域网通信相关知识:

\bullet MAC地址

每一台主机都有唯一的标识:该主机对应的MAC地址。MAC地址实际上是网卡地址,电脑在生产的时候至少配套的装有一张网卡,每一张网卡在出厂时就已经内置了一个48位的序列号,我们将这个序列号称之为“MAC地址”,这个MAC地址是全球唯一的。MAC地址主要工作在局域网,在局域网中标定主机的唯一性。

如下图所示,使用 ifconfig 命令就能够看到当前云服务器主机的MAC地址为十六进制表示的fa:16:3e:23:7a:5f。

\bullet 局域网内传输数据时,该局域网内的所有主机都能收到

在一个局域网当中,除了当前正在进行通信的A主机和B主机以外,还有其他的主机,那A主机是如何将数据成功发送给B主机的呢?

实际当主机A想要发数据给主机B的时候,该局域网内的其他主机也都收到了该数据,只不过除了主机B以外,其他主机识别到该数据并不是发给自己的,此时其他主机就把收到的数据丢弃了。

也就是说,在局域网(以太网)通信时,该局域网内所有的主机在底层其实都收到了任何数据,只不过经过筛选后只提交上来了发给自己的数据。

\bullet 碰撞

任何一台主机,在任何时刻,都可以随时发消息,当主机A在向主机B发送数据时,其他主机彼此之间可能也正在进行通信,甚至主机A在和主机B通信的同时也在和其他主机进行通信。

但同一局域网中的所有主机在通信时,使用的都是一个共同的通信信道,因此如果局域网内的多台主机同时进行通信,此时这些数据之间就可能会相互干扰。

每一个局域网都可以看作是一个碰撞域,如果某个主机发送出去的数据与其他主机发送的数据之间产生了干扰,我们就称这两台主机在该碰撞域中发生了碰撞。
\bullet 如何判断发送出去的数据是否发生了碰撞?

因为发送到局域网当中的数据是所有主机都能够收到的,因此当一个主机将数据发送出去后,该主机本身也是能够收到这个数据的。当该主机收到该数据后就可以将其与之前发送出去的数据进行对比,如果发现收到的数据与之前发送出去的数据不相同,则说明在发送过程中发生了碰撞。

也就是说,主机实际是能够通过某种方式,知道曾经发送出去的数据是否发生了碰撞的。
\bullet 发生碰撞后是如何处理的?

当一个主机发现自己发送出去的数据产生了碰撞,此时该主机就要执行“碰撞避免”算法。“碰撞避免”算法实际很简单:当一个主机发送出去的数据产生了碰撞,那么该主机可以选择等一段时间后,再重新发送该数据。这就像现实生活中的两个人同时想要说话,此时对方就都会说“你先说吧”,这实际上就是一种碰撞避免。

需要注意的是,实际在网络通信压力不大的时候发生碰撞的概率是不大的,我们不要太小瞧计算机的处理速度,也不要太小瞧网线传播数据的速度。
\bullet 每个主机如何判断该数据是否是发送给自己的?
在局域网中发送的数据实际叫做MAC数据帧,在这个MAC数据帧的报头当中会包含两个字段,分别叫做源MAC地址和目的MAC地址。

在局域网中进行通信的时候,每一个主机在收到一个MAC数据帧后,都会提取该MAC数据帧的报头,找到对应的目的MAC地址与自己的MAC地址进行比对。如果该MAC地址与自己的MAC地址不匹配,则直接将该MAC数据帧丢弃,只有MAC地址匹配时,该主机才会将该数据帧的有效载荷继续向上进行交付处理。

3.2.跨网络的两台主机通信

上面说的都是同一局域网内的主机之间的通信,那跨局域网的两台主机之间是如何进行通信的呢?

局域网之间都是通过路由器连接起来的,因此一个路由器至少能够横跨两个局域网。而这些被路由器级联局域网都认为,该路由器就是本局域网内的一台主机,因此路由器可以和这些局域网内的任意一台主机进行直接通信。

如果路由器级联的两个局域网采用的是相同的通信标准,那么通信过程大致就是上述那样。但被路由器级联的局域网可能采用的是不同的通信标准,比如局域网1采用的是以太网,而局域网2采用的却是令牌环网,如下图一所示。

由于以太网和令牌环网是不同的通信标准,它们给数据添加的报头也是不一样的,因此令牌环网当中的主机无法对以太网当中的数据帧进行解包。

这种情况实际是由路由器来处理的,路由器是工作在网络层的一个设备,我们可以认为路由器当中的协议栈是如下图二所示的。

此时当数据要从局域网1发送到局域网2时,路由器收到局域网1的数据后,数据链路层会先将以太网对应的报头进行解包,然后将剩下的数据向上交付给网络层,在网络层进行一系列数据分析后,再将数据向下交付给链路层,此时在链路层当中就会给该数据添加上令牌环对应的报头信息,然后再将该数据发送到局域网2当中,此时该数据就能够在令牌环网当中传输了。

注:因为路由器连接的是多个局域网,要跨网络传送数据,所以路由器至少要有两个以上的网络接口(至少要有两个以上网卡),每个网络接口(网卡)连接一个局域网。

跨网络的两台主机通信如下图所示:

当用户要将文件传输给另一台主机前,该文件数据需要先通过网络协议栈进行封装:

\bullet 文件数据先交给应用层,应用层添加上对应应用层协议的报头信息后,将数据再交给传输层。
\bullet 传输层收到数据后,再添加上对应传输层协议的报头信息,并将数据继续向下进行交付。
\bullet 网络层收到数据后,再添加上对应网络层协议的报头信息,其中包括源IP地址和目的IP地址,接着将数据再交给链路层。
\bullet 链路层收到数据后,最后再添加上对应链路层协议的报头信息,至此数据封装完毕。
数据封装完毕后通过以太网局域网将其发送给路由器,路由器中在数据链路层工作的以太网驱动程序收到数据,先将数据中对应链路层协议的报头信息提取出来(这里提取的是以太网协议的报头信息),然后将剩下的数据向上交给路由器的网络层部分,路由器的网络层部分对网络层协议的报头信息提取出来,对目的IP进行识别,识别到的目的IP和路由器直接相连,此时路由器的网络层部分再添加上对应网络层协议的报头信息,接着将数据再交给路由器中在数据链路层工作的令牌环驱动程序,添加上对应链路层协议的报头信息(这里添加的是令牌环协议的报头信息),数据在路由器封装完毕,通过令牌环局域网将其发送给目的主机。

\bullet 链路层收到数据后,先将数据中对应链路层协议的报头信息提取出来,然后将剩下的数据交给网络层。
\bullet 网络层收到该数据后,再将数据中对应网络层协议的报头信息提取出来,这里对报头中的目的IP和自己的IP做对比,发现数据确实是发给我的,此时将剩下的数据继续向上进行交付。
\bullet 传输层收到该数据后,再将数据中对应传输层协议的报头信息提取出来,然后将剩下的数据再交付给应用层。
\bullet 应用层收到数据后,最后将数据中对应应用层协议的报头信息提取出来,至此便完成了数据的解包。
注:如果网络层及以上层的协议我们使用同一套标准,那么所有网络层及以上层的协议(所有IP层向上的协议),发送主机、接收主机及路由器等收到的数据包是一模一样的,如下图所示。我们通常将网络也叫做IP网络,IP网络屏蔽了底层网络的差异(不同局域网协议的差异)(源MAC地址和目的MAC地址不停变化,源IP地址和目的IP地址不变),相当于用网络层(IP层)在网络内将所有的主机设置了一个虚拟的软件层。

这是一种软件虚拟化技术,该技术的应用还有Linux下的一切皆文件以及虚拟地址空间等。

跨网络通信相关知识: 

\bullet IP地址

IP地址是在IP协议中,用来标识网络中不同主机的地址。对于IPv4来说,IP地址是一个4字节,32位的整数。我们通常也使用“点分十进制”的字符串表示IP地址,例如192.168.0.1,用点分割的每一个数字表示一个字节,范围是0-255。
需要注意的是,IP协议有两个版本,分别是IPv4和IPv6。IPv4用32个比特位来标识IP地址,而IPv6用128个比特位来标识IP地址。

注:

1.MAC地址用来在局域网中标定主机的唯一性,IP地址用来在广域网(公网)中标定主机的唯一性。

2.在数据包传输过程中,源IP地址和目的IP地址是不变的,而源MAC地址和目的MAC地址在不停变化。就像坐高铁从北京到云南,源IP地址是北京,目的IP地址是云南,它们是不变的,在高铁行驶过程中上一站是源MAC地址,下一站是目的MAC地址,它们是在不停变化的。

\bullet 路由器为什么能够“认路”?
一个路由器可能会级联多个局域网,当路由器需要将一个局域网的数据转发到另一个局域网时,路由器如何知道该数据应该转发到哪一个局域网的呢?

路由器其实是通过IP地址来确定数据的转发方向的,因特网上的每台计算机都有一个唯一的IP地址,而在数据向下进行封装时,在网络层封装的报头当中就会包含两个字段,分别是源IP地址和目的IP地址。

当路由器需要将一个局域网的数据转发到另一个局域网时,在路由器的链路层会先将数据的在当前局域网对应的底层报头去掉,然后将剩下的数据向上交付给网络层,此时在网络层就可以获取到该数据对应的目的IP地址,然后路由器就可以根据该IP地址在路由表当中进行查找,最终就能够确认该数据应该发送到哪一个局域网。
\bullet 屏蔽底层的差异
IP地址的存在除了帮助数据“路由”以外,还有一个很重要的作用,那就是屏蔽了底层网络的差异。对于通信主机双方的IP层及其往上的协议来说,它们并不需要关心底层采用的是以太网还是令牌环网,它们认为只要填写了源IP地址和目的IP地址就能够将数据发送出去,因此现在主流的网络也叫做“IP网络”。

注:这种类似的技术还有:(1)虚拟地址空间。 屏蔽了内存之间的差别,让所有的进程看到的都是同一块内存,并且这块内存的布局都是一样的。(2)一切皆文件。通过文件结构体和函数指针的方案,让我们能够以对待文件的方式对待某些资源。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux - 第11节 - 网络入门 的相关文章

  • python虚拟环境移植到另一台电脑

    如果觉得本篇文章对您的学习起到帮助作用 xff0c 请 点赞 43 关注 43 评论 xff0c 留下您的足迹 x1f4aa x1f4aa x1f4aa 本篇文章为python环境打包离线安装移植的所做笔记 xff0c 一是为了日后查找方便
  • python安装jupyter lab和使用插件

    如果觉得本篇文章对您的学习起到帮助作用 xff0c 请 点赞 43 关注 43 评论 xff0c 留下您的足迹 x1f4aa x1f4aa x1f4aa 本篇文章为python安装jupyter lab和使用插件的所做笔记 xff0c 一是
  • Bean的初始化和销毁(java配置方式)

    bean生命周期管理 spring对bean的生命周期的操作提供了支持 xff0c java配置和注解配置分别使用如下方式 xff1a 1 java配置 xff1a 使用 64 Bean 的initMethod和destoyMethod 2
  • UWB使用教程

    前言 本篇文章主要对淘宝商家给的UWB资料进行整理 xff0c 方便大家快速入门 注重UWB定位模块的使用 xff0c 不解释具体的原理 实现功能 xff1a 搭建UWB基站使用上位机配置参数ROS接受UWB的定位信息修改IMU的STM32
  • 【Tiva_C系列】一、ARM Cortex-M4F 处理器

    ARM Cortex M4F 处理器 0 引言1 Cortex M4处理器和基于Cortex M4的MCU2 Cortex M4F处理器结构3 存储器映射4 处理器模式和软件执行的权限级别5 内核寄存器6 异常和中断处理6 1 优先级6 2
  • Windows11解决无法设置移动热点

    文章目录 前言1 解决办法 前言 今天装了个Win11 xff0c 回头发现移动热点无法打开 xff0c 在网上找了好久 xff0c 才找到解决方案 xff0c 这里分享下解决方案 1 解决办法 打开设备管理器 找到网络适配器 启用这两个设
  • python实现aruco的生成和检测

    OpenCV aruco的生成 import cv2 as cv import numpy as np if name 61 61 39 main 39 Load the predefined dictionary dictionary 6
  • SMPL经典论文

    摘要 模型参数从这些数据中学习 xff1a 休息姿势模板 混合 xff08 blend xff09 权重 与姿势相关的混合形状 与身份相关的混合形状 从顶点到关节位置的回归器与姿势相关的混合形状是姿态旋转矩阵的线性函数 xff0c 这个简单
  • 灰度图片二值化matlab

    rge图片灰度化之后 xff0c 往往存在灰度值比较近的情况 根据自己的需求将灰度值调到两个极端值 xff0c 也叫做阈值处理 本文的阈值是自定义的 xff0c 建立在已经读取到灰度图片灰度值的基础之上 存在获取灰度图片最佳阈值的算法 大津
  • Maven Helper插件下载&Maven导入jar包(依赖管理)

    1 maven Helper插件 1 1搜索 File gt Settings gt Plugins gt 搜索Maven Helper 发现没有 1 2 安装 点击Browse reositories gt 选择maven Helper
  • Ubuntu18.04下基于ROS和PX4的无人机仿真平台的基础配置搭建

    Ubuntu18 04下基于ROS和PX4的无人机仿真平台的基础配置搭建 参考资料 xff1a https www yuque com xtdrone manual cn basic config 1 11 https blog csdn
  • darknet_ros安装的以及在PX4无人机仿真平台的目标检测

    darknet ros的安装以及在PX4无人机仿真平台的目标检测 参考资料 xff1a https github com leggedrobotics darknet ros https gitee com robin shaun XTDr
  • Ubuntu上设置查看SSH Key并在GitHub上添加设置

    这里讲了如何在Ubuntu设置查看SSH key并在GitHub上添加设置 有的时候git clone可能出现错误 xff1a 这需要我们在Ubuntu设置查看SSH key并在GitHub上添加设置 1 在终端上输入 ssh keygen
  • git 添加更新子模块

    添加submodule到仓库 下载父仓库 git clone git 64 gitlab span class hljs preprocessor abc span span class hljs preprocessor com span
  • Docker容器图像界面显示到宿主机屏幕配置方法——挂载方式

    原理简介 可以把docker镜像看做一台没配显示器的电脑 xff0c 程序可以运行 xff0c 但是没地方显示 而linux目前的主流图像界面服务X11又支持 客户端 服务端 xff08 Client Server xff09 的工作模式只
  • JETSON TX2卸载原有的opencv安装opencv3.2

    参考博客 xff1a http blog csdn net u014613745 article details 78310916 http blog csdn net public669 article details 99044895
  • Ubuntu使用ros进行多电脑IP通信

    TUF Gaming是我的笔记本 xff0c master是实验室的主机 xff0c 在同学komorebi fresh xff08 https me csdn net weixin 44270815 xff09 的帮助下把我自己的笔记本和
  • Mavros与无人机

    记录一些mavros与无人机的指令 xff0c 这篇博客只是起备忘录的作用 飞控接口赋权 span class token function sudo span span class token function chmod span 77
  • Ubuntu18.04安装ax200网卡驱动以及更新内核

    Ubuntu18 04安装ax200网卡驱动以及更新内核 参考资料 xff1a https zhangyiming748 github io 2019 12 05 useAX200OnUbuntu 原来的网卡是小螃蟹的8822ce xff0
  • 笔记:QGC使用及姿态环仿真调节方式

    笔记 xff1a QGC使用及姿态环仿真调节方式 打开Gazebo及QGC 进入终端管理员权限 sudo s 在终端打开Gazebo cd Firmware make px4 sitl default gazebo 点击文件夹中的QGC x

随机推荐

  • PIX4飞控调参

    飞控调参
  • nano板载电脑连接无线时断时续

    在无人机上使用nano b01板载电脑 xff0c 在地面站电脑上ssh板载电脑名字及ip地址可进入地面站电脑 通过在两个电脑的 bashrc文件中加入主从节点ip xff0c 实现ros通信 xff0c 想要实现用地面站电脑控制板载电脑
  • 树莓派小车————避障篇

    避障模块的功能就是让小车能够检测到障碍物并且可以正确的避开障碍物 当然避障的方式有很多种 我选择的是超声波结合红外传感器来避障 为什么要用超声波传感器结合红外传感器 xff1f 因为硬件原因 xff0c 没有舵机 xff0c 原本超声波可以
  • 睿尔曼超轻量仿人机械臂--Realsense D435手眼标定

    目录 1 环境要求 2 概述 3 开始前准备 4 aruco ros配置 5 easy handeye配置 6 启动相关launch文件开始标定 1 环境要求 本教程主要介绍RM机械臂与Realsense D435相机手眼标定的配置及方法
  • Docker容器-------dockerfile概念简介

    文章目录 引言一 dockerfile概念二 Docker镜像的创建1 基于现有镜像创建2 基于本地模板创建3 基于dockerfile创建3 1 dockerfile结构 xff08 四部分 xff09 3 2 构建镜像命令 三 Dock
  • 关联github与dockerhub生成镜像

    首先登录dockerhub xff0c 按照下面的步骤 xff0c 绑定github账户 然后选择Create Create Automated build xff0c 选中指定的dockerfile项目 选中指定的Dockerfile自动
  • VSCode远程连接Gitee

    目录 1 gitee介绍2 准备3 生成ssh公钥4 添加公钥5 初始化git6 关联远程仓库7 推送更新的代码8 拉取远程仓库代码9 移除远程连接 1 gitee介绍 Gitee xff08 码云 xff09 是开源中国 xff08 OS
  • 从零开始搭建ROS下Intel RealSense D435i的使用环境(全安装流程记录)

    文章目录 一 Ubuntu16 04安装二 Ubuntu16 04下的ROS安装三 cmake升级替换四 相机SDK安装 xff08 注意 xff1a 安装时不要连接相机 xff09 五 安装对应的ROS接口六 关闭红外结构光参考文章 为了
  • 解决fp = builtins.open(filename, “w+b“)FileNotFoundError: [Errno 2] No such file or directory:

    最近在做一些关于图像处理方面的问题 xff0c 用到了python中的PIL库对图像进行保存 xff0c 代码如下 span class token comment 新建一张图片 span GroundImg span class toke
  • python-旋转图像并裁剪出黑色边框

    在进行旋转图像时 xff0c 遇到了旋转后的图像存在黑边的情况 xff0c 上网查了很多方法 xff0c 找到了这个方法是比较好的 xff0c 附上链接添加链接描述 span class token keyword def span spa
  • 解决NetworkX遇到 AttributeError: ‘Graph‘ object has no attribute ‘node‘ 问题

    学习NetworkX时 xff0c 查看结点属性时遇到了报错 xff1a AttributeError Graph object has no attribute node G span class token operator 61 sp
  • Docker的安装以及可视化图形界面的安装

    Dockerd的主要作用 xff1a 起到一个 容器 xff08 代码 43 环境 xff09 的作用 xff0c 解决了软件跨环境迁移导致的版本不兼容等问题 使用沙箱机制 xff0c 相互之间没有任何接口 xff0c 且性能开销极低 Do
  • MySQL数据库忘记密码后,如何修改密码

    MySQL修改密码 xff08 本人亲身试验可行 xff01 xff09 1 以管理员身份打开命令行 2 在命令行中进入MySQL的bin目录所在文件夹 即 xff1a 在命令行中输入 xff1a cd 路径 路径查找如下 xff1a 命令
  • 人工智能_03

    逻辑回归 xff08 用于解决分类问题的一种模型 xff0c 核心 xff1a 找到决策边界 xff09 根据数据的特征或者属性 xff0c 计算出其归属于某一类别的概率 P x P x P x
  • 人工智能_04

    无监督学习 xff08 Unsupervised Learning xff09 机器学习的一种方法 xff0c 没有给定事先标记过的训练示例 xff0c 自动对输入的数据进行分类或分群 优点 xff1a 算法不受监督信息 xff08 偏见
  • 远程连接本地以及其他机器上的Ubuntu虚拟机

    连接本机的Ubuntu虚拟机 xff1a 1 查看Ubuntu虚拟机是否安装了ssh服务 xff1a service sshd status 2 安装ssh服务 sudo apt get install openssh server 3 开
  • 注册中心Nacos

    注册中心 nacosNacos注册中心与配置中心nocos优点与缺点启动docker镜像测试linux windows下单机启动应用启动个报错nacos如何修改用户名密码 nacos Nacos注册中心与配置中心 nacos官方文档 Nac
  • git常见问题

    git常见错误 1 在git pull时遇到fatal refusing to merge unrelated histories错误 意思是 xff1a 拒绝合并不相关的分支 表示要合并的本地分支和远程分支是相互独立而不是相关联的 我的情
  • PID 控制器

    本文参考 xff1a 从不懂到会用 xff01 PID从理论到实践 哔哩哔哩 bilibili 目录 1 PID控制器入门 1 1 PID控制器的引入 1 2 PID控制器适用系统 1 3 PID控制器宏观意义 2 PID控制器的必备知识
  • Linux - 第11节 - 网络入门

    目录 1 计算机网络背景 1 1 网络发展 1 2 认识 34 协议 34 2 网络协议初识 2 1 协议分层 2 2 OSI七层模型 2 3 TCP IP五层 xff08 或四层 xff09 模型 3 网络传输基本流程 3 1 同局域网的