以下是网络部分整体的学习路线:
网络的发展历程
因为人与人之间是需要合作去完成一些任务的,这也就意味着计算器之间也是需要互相"沟通"的。因为计算机也是人所使用的工具,人都需要互相协作,也就注定了计算机也是需要互相协作的。
假设现在有三个人,现在三个人都需要一份资料,在早前想要将这份资料拷贝到这三个人的计算机中,就需要一个软盘一样的东西,去拷贝资料,在分别放到这三个人的计算机上。
后来就有了下面的进步:
将三个人的计算机都连接到一个局域网中,可以简单的理解成上图中使用后一根线将这些主机连接起来了。然后这三台计算机共同需要访问的数据就可以设定一个服务器(“服务器也是计算机“)。此时其中一个人处理完了数据,另外一个人需要就可以直接去服务器上拿取了(获得了别人的同意)。
有了这个简单的网络雏形之后,这三个计算机之间再进行数据的拷贝就不需要依靠类似网盘的东西了,而是直接使用服务器实现数据的共享。
后来随着计算机的增多,在一个子网中,各个计算机之间发生数据碰撞的可能性就会变大。此时就引入了一些新设备(交换机等硬件)
这里路由器的作用可以简单认为是用来联通子网的。
例如左边是一个研究机构的局域网,而右侧是另外一个实验室的局域网,后面因为学术资料交流的原因就使用路由器将这两个局域网连接起来了。此时就构成了一个更大的网络了。
上图左侧是一个局域网,右侧也是一个局域网,而也可以认为左右整体也是一个局域网。
后来随着主机数的继续增加,就可以通过省/国家/国际级别的路由器将各个省/国家之间的局域网连接起来。
也就构建出来一个如此之大的网络形态,这种网络形态也就是广域网。
经过上面的任务,我们可以知道根据主机数量的不同,网络是可以被划分为广域网和局域网的概念的。
那么我们国家现在如此巨大的互联网只凭互联网公司能够办到吗?当然不是,如此巨大的互联网的背后还有三大运营商的助力(给国家做网络基础设施的建设【内网,机房,基站等等】)。
随着网络的增大也是需要有新的设备出现的。最典型的:集线器,网线,光纤,调制解调器,路由器,防火墙,服务器等等设备的诞生。
这些设备的诞生,都是互联网蓬勃发展的产物。
由此也就说明了,网络的发展不是一个组织或者国家推动的,网络的发展是一个系统的工程,既要有运营商做网络基础设施的建设,还需要有大批量的用户,还需要有各种个互联网公司来给用户提供对应的服务。所以互联网的发展本身就是一个历史的产物。
认识协议
协议的本质
在说明协议之前,还需要思考一些东西。在之前的学习中,冯诺依曼体系中的各个部件(输入/输出设备,内存,cpu)都是互相独立的。而将输入从输入设备输入到内存中(两个独立的设备进行数据间的拷贝的本质不就是两个设备之间再进行通信吗?两个设备的通信通过总线连接起来)由此也就能知道了单台机器其实也是一个网络结构:
现在一台主机再向另一台主机发送消息,本质也就是两个主机的网卡在进行发消息。
所以网络说到底也是硬件和硬件之间再进行信息的传递。
那么在计算机内部的这种数据的拷贝和两个主机之间进行数据的拷贝的区别是什么呢?
区别也就是单纯的距离变长了
而这个距离边长也就会衍生出一些问题:
第一个:如果两台主机在进行信息传递的时候丢包了怎么办?也就是保证信息的可靠性的问题。
第二个:在单台机器内部,有os的管理,输入设备向往内存中发送消息,很快就能找到内存的所在,但是在网络中就不一样了,因为距离的增加如何保证一台机器发送的消息一定能送到另外一台机器上,也就是保证一台机器能够精准的定位到另外一台设备(连接公网的机器是非常多的)。
第三个:一个信息在一个设备上要到达另外一个设备是需要经过无数个设备的。如何让我们的报文,在经历了无数个设备之后,还能准确的把数据推送给远端机器。
这些问题最后都要由一个东西统一解决:这个东西也就是协议。
现在回顾一下这些问题的逻辑,首先为什么会产生这些问题,原因就是要收发信息的两台主机的距离变长了,而解决这些问题依靠的就是协议。
下面的问题就是什么是协议呢?
在讲解协议之前,我们要知道其实在我们的一台机器中也是存在协议的。例如:磁盘和内存之间的协议(这些协议一般都是由硬件厂商给os提供的协议),这种协议一般内置在驱动当中。而网络为了更加的通用也是单独定制了一份协议。
以上就解释了为什么要网络中要存在协议,就是为了解决上面所说的问题。
下面正是说明什么是协议呢?
协议的本质其实就是一种约定!
这里讲解一个例子,在很早之前,要和在远方的亲人联系,需要打电话,而在那个时间段打电话是不会收钱的,而接通了电话就需要收钱了,于是你为了省钱就和你的家人约定好了,如果打电话的时候电话响一声就挂断那就是我在向家中报平安,如果响两声代表我没有生活费了等等。这种你和你的家人的这种约定就是一种协议。
而这种约定就是为了解决长距离的信息传递的问题的。
回到计算机这里,其实两台计算机之间也是可以做约定的。例如现在有两台主机,一台client,一台server。如果client给server发1代表client需要登陆,如果发2代表需要注册。
发三代表需要访问什么资源。
当然在网络的层状结构中不同的层之间的约定也是不一样的。对于这一点后面说明。
那么现在需要通信的两台主机将协议定制好之后,就能够实现通信了呢?我们都知道计算机是只认识0和1的,但是不同的机器对于这种0和1信息的识别也是不一样的,例如有的设备对于0和1信息的识别靠的是电流的频率,而有的设备对于0和1信息的识别靠的是电流的强弱,也就是每种品牌的电脑,内部是被0和1信息都是被供应商做好规定了的。磁盘的供应商有自己的协议,网卡有自己的协议。单台计算机这样是没有问题的,但是网络不一样,因为网络在构建完成之后需要让更多的人能够接入到互联网当中。虽然此时不同的主机之间遵守了协议,但是不一定各个品牌的计算机就能够通信,原因就是不同的计算机在对于网卡上信息的是被,有的使用的是电路的频率来作为0和1的区别的,而有的依靠的是电流的强弱来做的。此时两台计算机都遵守了0和1序列表示什么信息,但是两台计算机的电气特性不一样。此时所有的设备在网络当中也是不可能联通起来的
所以在网络当中一定要保证:
所以要完成上面的保证是需要一整套的工作去做的:
总结一下:
一般这种标准都是会存在很多机构去提出方案的,而最后的标准就看这些方案中谁的方案更为优秀,就选择让谁去定制协议,这个协议从硬件到软件是全方位的定制好的。不能只是单纯的定制软件,而必须把电气特性也要规定好。此时所有的主机如果使用这种定制好的全面的协议,此时这些主机连接上网络时自然全部都能上网了。
一般将协议定制好了之后,还需要使用代码去实现。
此时就有各种的团队去使用不同的代码去实现协议了。同时硬件厂商也要定制自己硬件的电气特性了。例如Windows和Linux中对于网络的协议就是不同的人在开发,但是因为大家使用的协议都是同一份协议,所以各自之间的网络的功能也是能够使用的。
既然网络能够编码实现了,这个网络协议和操作系统之间又有什么区别呢?
网络和os都是程序员写的代码,这两者之间又有什么关系呢?
网络和os的关系
为了理解网络和OS的关系,需要按照下面的几个步骤来做处理:
现在两台主机之间需要通信一定是需要经过很多中间的设备的
这些设备可能是集线器,路由器,到自己的家中也许还需要解调器等等。
所以要将信息从一台主机发送到另外一台主机需要保证信息能在各个设备之间进行转发。
那么第一个问题就是:
第二个问题:
左边的这个A主机在发送信息的时候,怎么可能是只能往一个主机中发送消息呢?现实的场景是,A这个主机不仅能给中间的主机发送信息,也能向其它的主机发送信息。
那么A在发送消息给B的时候,凭什么是交给中间的这个主机呢(假设中间的这个主机是一个路由器)。
同理到了路由器的时候,凭什么说路由器这个主机是将信息交给后面的这个主机而不是上面的主机呢?
这里面临的本质问题就是:
第三个问题:
此时又要如何处理呢?
现在假设前面的三个问题都没有问题了。
前面三个问题的解决已经能够做到一点就是:
也就是数据通信已经没有问题了,现在A主机千里迢迢将信息从A交给B就完了吗?后面这个B主机要如何处理这个数据呢?(这个数据的作用是什么)
所以最后一个问题也就是:
前面三个问题产生的原因很简单就是A主机在向B主机发送信息的时候两者的距离太远了。
对于上面的abcd四个问题都要有对应的协议来解决。
由此我们就能知道了网络是由很多协议构成的。
如果不将这些协议好好的规制管理起来,后面想要维护是很困难的。
网络的层状结构
而为了能够更好的解决上面所说的四个问题,所以网络协议是一种层状的结构。
对于层状结构有一个点:在软件上很多的解决方案都是层状的。
所以c++/java等语言设计出了继承这样的概念,因为大部分的软件的解决方法都是层状的。
下面就是网络的层状结构图:
对于这个分层图的理解后面会说明。
但是这个分层在我们现实生活中也是存在的。
比如说两个人通过座机在打电话。
两个人在打电话,逻辑上两个人是直接在通电话,但是物理上我的声音是被我的电话接收,然后我的电话经过种种的处理,然后将处理过的信息传递给对面的电话机,对面的电话机在对接收的信息进行处理,才让两个人实现了电话的通信。
此时我们两个人使用汉语去交流,这一层也就是语言层,而传输的过程也就是通信设备层。所以我们现实生活中的打电话也是层状的结构。
此时人无法和对面的电话沟通,电话两端的人只能互相沟通。所以逻辑上只允许同层的协议进行通信。不同层之间一般不允许沟通。
这种层状结构有什么好处呢?
有一天还是那两个人这次我们不使用座机来打电话了,而是通过手机来打电话。
此时底层改变了但是上层改变了。或者是底层座机不改变但是打电话的两个人使用英语交流。
从这里我们就能知道了通过层状的结构能够很容易的完成软件的解耦合。未来能够非常方便的对软件进行维护(更新,替换,优化)。改变某一层不会过于影响到其它层。
既然网络协议是层状的,那么是如何划分的呢?这里先看网络层状的最终方案。
既然网络要按照层状来划分,那么就要按照问题去划分。每一层解决一个问题。
所以网络协议在纯软件层面被划分为了四层。
其中的数据链路层是通过Mac协议完成的,而网络层是通过IP协议完成的。传输层通过tcp/udp协议完成,而应用层则是通过http/https协议完成的。
各个层解决的问题:
当前我们就这么理解即可。
但是实际上在定制协议的时候定制的方案并不是上面的这种而是下面这种:
也就是纯软件的话(不考虑物理层),是将其分成了6层的.
上图中的应用层,表示层,会话层,被合成为了应用层。
这个七层的协议是由OSI定的网络协议栈的标准。后来不同的工程师再去实现这个协议栈的时候,发现应用层,表示层,会话层没办法将其拆的很细(某些系统很难实现)。所以就将这三层压缩成为了一层。此时也就有了应用层。
OSI定的这个标准很完善,非常好。但是因为一些客观原因没办法让应用层,表示层,会话层这三层分层实现。所以最后将这三层统一成为了一层,由用户级去实现。
我们可以认为理论就是6层的这个模型,而实践就是四层的这个模型(都去除了物理层)
TCP/IP四层协议栈就是上图中的那个四层协议栈,那么为什么要叫做TCP/IP呢?原因就是TCP/IP在这个协议栈中起着最核心的作用。
我们现在使用的手机,电脑中的os本身就实现了这个网络TCP/IP协议栈。
比较详细的各层之间的作用:
物理层中的硬件集线器的作用为在物理层放大信号的,从而保证信息能够传递的更远。
典型的工作在数据链路层的就是网卡的驱动(其实已经算是软件层了),工作在链路层的设备有一种叫做交换机。这个设备的作用就是如果在一个局域网中,主机太多了。多个主机之间想要信息转发的时候成本就会变高。交换机能够完成一些报文的转发,从而减轻局域网的压力。
在网络层最重要的设备也就是路由器了。
而传输层和应用层就没有直接对应的设备了。
因为传输层和设备层对应的也就是电脑了,在往上就是软件了。
这里最重要的就是要知道网络是分层次的,纯软件分成了四层。每一层都会去解决因为主机间距离过远导致的信息传递问题。
那么这个网络协议栈和os到的关系又是什么呢?首先两者之间的关系非常密切,密切到什么程度呢?
通过图像来理解:
下图是计算机的层状结构。其中的system call和操作系统层都是属于os的
网络又叫做网络协议栈。
网络最底层的硬件也就是网卡。
网络协议栈中的数据链路层是工作在网卡的驱动层中的。
继续往上也就到了网络层(IP协议)和传输层(tcp/udp协议)。而这两层其实是在操作系统的内核中实现的。在往上也就到了用户层。
所以如果用户想要访问网卡不能直接访问网卡,需要贯穿操作系统。贯穿操作系统也就是在贯穿协议栈。
所以用户想要使用协议栈,本质就是用户在使用操作系统。
所以在协议栈当中,操作系统就会基于TCP/IP协议提供系统调用。只不过这这一个系统调用是网络提供的系统调用。
所以未来在进行网络编程的时候和之前使用系统调用进行编程是没有区别的。也就是用户调用系统调用来使用网络层的功能。例如在用户层能够使用https/http等,自然也就存在各种网络库了,这些网络库就是对系统调用进行的各种封装,简化我们的开发流程。
所以os和网络的关系也就出来了,网络协议栈和os是一体的。
这也是为什么网络协议栈也被叫做TCP/IP协议栈,因为TCP/IP协议是在内核当中实现的。处于一个核心的地位。
但是在网络中是不止有一台机器的。即使每一种机器都是不同os的。
虽然操作系统在实现上各个系统都是不同的Windows上既有线程又有进程,在Linux上只有进程和轻量级进程。但是在网络协议栈上,每一层都是标准定制好的,所以不同系统的工程师在实现这部分功能的时候是完全一样的(网络协议栈)。所以即使os不同也能使用网络协议栈去进行通信。
这就是为什么不同系统的主机能够使用网络进行通信。因为使用的网络标准是一样的。
所以:
以上是网络部分的前提认识。
当我们在使用计算机的时候,你可能使用计算机再看直播的同时下载各种软件。也就是说计算机会接收到大量的报文,那么计算机需不需要将这些报文管理起来呢?当然需要,如何管理呢?先描述再组织。 先对报文使用结构体进行描述,对于每一个报文再形成一个结构体对象,然后使用一个容器对这些对象储存起来,便是先描述再组织。
有了所有的报文之后,所有所谓的网络协议栈,本质都是对储存报文对象的链表/队列/其它数据结构的增删查改
网络流程传输图
现在基本的知识已经具备了,如何让两台主机通过网络实现数据的传递呢?
先来看一个简单的网络局域网:
为了理解网络的传输,我们需要重谈协议
然后就是在局域网中多态主机能直接通信吗?如何通信?
这里使用一个现实的例子:
现在网购了一个无人机,卖家在给我发货的时候,会将无人机放到一个盒子中,然后在盒子上贴一张纸,这张纸就是快递单。
在这张纸上面就有着各种的信息。
那么我买无人机为什么要将这张纸也发送过来呢?我只关心无人机,并且这张快递单也不是给我看的,而是给发快递的物流体系看的(快递员等等去看的)。对于我来说我实际收到的东西比我期望的东西要多。
多出来的这个东西其实就是日常失火中的报头。
对于收物品的我来说我看的懂这个快递单号上写的东西。而对于物流机构的人来说他们也看的懂这是什么由此就能知道了:
这里假想一下:如果快递员是直接将交给我,而不是和快递单一起交给我,我反而会起疑心。
同时这也说明了:
我们想要的只是内容但是往往会给我们多出来一些东西,这个多出来的东西称之为特定协议对应的报头。
如果我们使用计算机语言(C),来表示快递单,如何表示呢?
在os中协议是很多的,那么报文自然也就会有很多,所以os也是需要管理这些报文的,如何管理先描述在组织。所以使用计算机语言来表示这个快递单使用的就是struct xxx来表示的.
所以:
所以现在一个主机要发送一个信息,会带上一个报头,其实也就是把协议带上了。
所谓的协议会转化为特定结构的报头。
所以现在一台主机发送了消息给另一台主机,另一台主机收到的信息是多了一部分的。
以下就是在Linux中的tcp协议对应的报头字段:
所以协议就是结构化的字段。
现在不同系统的两台主机通过网络来发送信息,其中一个主机发送的信息(报头+内容),因为不同的系统内部采用了几乎相同的方式去实现报头结构体,所以这个报头两个系统的主机都是认识的,而这也就是约定。
以下就是ip报头的结构化字段:
现在假设存在一个局域网,局域网中存在很多台的主机。
横线充当局域网。
假设现在A主机向B主机发送了一条信息。
那么此时A向B发送的消息能够送到吗?或者说在一个局域网中A和B能够互相通信吗?如果能如何通信呢?
首先在同一个局域网中,两台主机是能够直接通信的。
例如以前的CS游戏是支持直接在局域网中创建房间的。此时其它在同一局域网中的玩家就能看到这个房间了。
那么通信原理是什么?
首先计算机中的网卡都有一个mac地址,原则上这个mac地址是在全球内唯一的,但是实际上网卡的这个地址可以通过一些虚拟技术虚拟出来。
通过指令无论是在Linux还是Windows上都能查到mac地址。
所以每一台主机都是存在自己的mac地址的。
通信原理:使用现实举例子,现在有一间教室,教室中坐满了人,然后老师大喊一声:" xxx,你的作业怎么不见",此时全班的同学都能听到这个信息,但是老师找到是xxx,除了xxx之外其余人都会继续做自己之前的事情。而xxx在收到这个信息之后就需要去处理了。
而现在所有人都是主机(都在同一个局域网中),一台主机向另一台主机发送信息的时候,其实就是给每一台主机都发送了信息,只不过这个信息中还包含了接收信息的主机的mac地址,其余的主机发现这个mac地址不是自己的,对于收到的信息会直接丢弃。而mac地址正确的主机就会收到信息。
但是现在主机A在发送消息的时候主机c有没有可能也在发送消息呢?主机D也有没有可能在发送消息呢?
此时在局域网中出现多台主机一起发送消息的情况:我们称之为在局域网中发生了数据碰撞。
如果发生了这种情况,发生碰撞的两台主机就要执行一下碰撞避免的算法(此时A和C的数据经过碰撞已经无效了)。而这里所谓的碰撞避免也就是A和C主机现在不发了。过一会之后再发。在AC不发的时候网络资源不就被腾出来了,此时BDE主机就能发送信息了。
所以我们将一个局域网称之为一个碰撞域,
所以在正常情况下,要发送信息,只允许一台主机向局域网中发送信息。
由此就能知道了
第一个:想要黑掉一个局域网只需要不停的往局域网中发送报文,此时整个局域网中的所有主机就无法发送信息了。
第二个:如果一个局域网中的主机数量越多,发生数据碰撞的可能性也就越大。
所以之前就说明了在数据链路层会存在一个机器叫做交换机,这个机器解决的就是这个问题。所以在一个局域网中,机器越少,通信的成功率越高
这种基于碰撞域,碰撞避免,碰撞检测的局域网通信也就是居于概率的通信,我们将其称之为以太网。
手机上也就是这样,当你在在一个人非常多的情况下使用网络时,是存在网络不好的情况(发生了丢包),这就是因为在这个地区太多的人连接到同一个基站上,导致数据碰撞的概率提高了
这里我们换个视角理解一下局域网,现在多台主机都能通过局域网发送信息,那么局域网不就相当于这多台主机的共享资源吗?
既然局域网是共享资源的话,一台主机再写的时候另一台主机也在写,这也就是数据不一致。
所以执行碰撞算法之后,让只有一台主机向局域网中发送信息不就是只让那一台主机使用局域网资源吗?
所以使用系统的观点:
所以系统和网络是不能分开的
下面我们再来看这张图:
现在假设左边的主机要发送一个信息,你好,这个你好是用户发送的,但是这个你好并不是直接从应用层搞到另外一方的应用层。
这个你好信息需要向下交付,此时在应用层就有应用层对应的协议(这个报文由多长,内部的有效字节为多少)。
此时这个信息就被增加了一部分应用层的协议。也就是给这个报文添加报头。
然后继续往下这个信息必须贯穿协议栈,因为体系结构是这么规定的。
现在来到了传输层自然也要添加传输层的报头:
继续往下,在网络层增加报头:
继续往下:
此时最后的那个才是这个信息真正的数据报文。
然后通过以太网将这个信息推送给另外一端的主机。
然后另外一段主机收到了这个报文
最底层的报文它的报头一定是封装在最外侧的。
然后到了对应的层次之后不断的出栈。
对于每一层除了自身要增加的报头之外其余的都是它的有效载荷,以最底层为例,除了最外侧的那个是链路层的报头之外,里面的内容都是这一层的有效载荷。
因为报头是一个双方都认识的结果结构体字段
此时接收到这个信息的主机就可以通过这个结构体字段来进行协议处理。
进行解包之后往上交付:
然后IP层也是做类似的操作,通过报头来解包信息。
然后继续往上处理:
最后在FTP层处理完之后上层的用户就会收到你好的信息
此时在逻辑上我们就可以认为两台主机是每一层在进行通信,因为每一层发送的信息另外一台主机的对应层得到了一样的消息。
对于从上往下的贯穿协议栈的行为称之为封装报头。
把自底向上的过程叫做:解包+分用
虽然每一层的协议具体是什么我还不知道,但是宏观上我们已经理解了。
一方主机接收到报头之后,通过报头按照约定去处理信息,所以报头也就是一种协议的表现
对于每一层的信息都快可以分成两层:
然后不同层的报文,都是有自己的名称的:
最后还有一个问题:
要理解这个就要明白:
解决的方法很多。
其中的一种方法就是固定报文的大小,也就是约定。
还有一个问题:
这两个问题是未来协议的共性。并且每层协议都必须解决这两个问题。
现在我们已经知道了协议在往下传递的时候是要完成封装的,但是仅有这个是不够的,还需要让收到信息的主机能够完成对这个协议的解包。
经过之前的学习,我们已经知道了理论上每一个网卡都有自己全球唯一的mac地址,但是除了mac地址之外,还有一个ip地址,下面来认识一下这个ip地址。
ip地址
在Linux上使用ifconfig指令可以查看当前主机的ip地址,在Windows上使用ipconfig指令查看。
ip地址的格式是xxx.xxx.xxx.xxx中间的每一个数的范围都是[0,255]
这种是点分十进制IP地址,在c/c++中一般都是字符串。
实际上ip地址会被分为公网ip和内网ip,只有这两种ip地址一起才是所有的ip地址。
现在我所看到的很多ip地址都是内网ip地址,如果想要将我们写的服务给别人看到,则我们的服务必须要具备公网ip。云服务器中的公网ip地址,是由云服务厂商做的虚拟地址。
ip地址的作用:
在不加说明的情况下这个ip地址一般指的就是公网IP地址。内网IP因为本身的特殊性是有可能存在一些重复的ip的。
对于具体是怎么分的,为什么要这么分,因为这里只是网络知识的基础就暂时不说明了。
这里暂时就认为IP地址,用来表示互联网中唯一的一台主机。其实在主机自己的局域网中也是可以表示的。
现在回到点分十进制的IP地址。
因为这个IP地址的每一个区域的范围都是[0,255],所以理论上使用四个字节就能够储存这个IP地址。
也就是32个比特位就足以表示网络中的任何一个ip了。
也就是使用一个整数就能够表示所有的网络ip了。但是我们人在看IP地址的时候,不喜欢去看整数的ip。所以整型风格的ip地址和字符串风格的ip地址是可以互相转化的。如何转化呢?
首先可以写一个结构体:
在转化的时候,声明一个结构体对象
这里写一下伪代码
struct ip_struct ip;
//假设一个ip地址150.122.15.8
//以.为分割
ip.p1 = 150
ip.p2 = 122
ip.p3=
.....
//这样就将这个IP地址的各个部分转化为了1个字节大小
unint32* x = (uint32_t)(&ip);//将ip地址赋值给x
//这样使用一个4个字节就能储存一个ip地址
//使用
uint32_t ip
(ip_struct*)&ip->p1//按照这种格式就能拿到每一部分的值了
这里要知道字符串的ip地址和整数的ip地址是可以互相转化的。
那么ip地址和mac地址的区别又是什么呢?
这里使用一个例子:现在唐僧有一行人去西天取经,经过了几个地点。
当这一行人到达了女儿国,之后有人问唐僧,你从哪里来,到哪里去。
唐僧会说:
然后继续问:
你上一站从哪里来,下一站又要去哪里呢?
唐僧说:
我上一站从火焰山来的,至于下一站唐僧不知道要去哪里,女儿国的人需要告诉我,我下一站要去哪里。 然后女儿国的人根据唐僧要去西天,告诉他下一站他要去黑风岭。
此时唐僧就知道了他上一站从火焰山来,下一站要去黑风岭。
然后唐僧来到了黑风岭之后就有了两个地址。
总结就是:唐僧在西天取经的时候身上有两套地址
而终极目标一般都是永远不变的。
然后当下目标一般都是改变的,因为唐僧每经过一个地方这个地址就会发生改变。
而每一个国家就相当于一个路由器,而每一次都去问题当前国家的领导人,下一站要去哪里,这就叫做查路由表。
而这种一直不变的地址,称之为IP地址。
而一直在变的地址,为Mac地址。
所以每经过一个路由器,原Mac地址和现Mac地址是要进行重新解包和封装的。但是不管你Mac地址怎么变化,IP地址是永远不变的。
Mac地址的意义为局域网通信的时候标识主机的唯一性。
IP地址的意义是什么呢?IP地址为目标而目标给我们的最重要的意义就是路径的选择。
目的IP的作用就是用于路径选择的。
数据包跨网络转发小例子
首先来看一张图:
现在左侧的主机为A主机,右侧的主机为B主机。
因为两台主机是跨网络的,所以两台主机需要经过一个路由器。这个路由器会去完成转发等的功能。
以太网虽然是现在最常用的网络通信方式,但是并不只有以太网。还有一种网络通信方式就是上面的这种令牌环网络通信原理。
令牌环也是一种局域网通信的标准。在局域网通信的时候有一种叫做令牌的数据,拥有令牌的主机才能向局域网中发送数据,发送完毕之后,可以将令牌转递给下一台主机。
这里需要知道的就是上面的令牌就相当于局域网中的一把锁。持有锁的人才能通信。
然后就是令牌环可以理解为数据链路层的一种新的协议,这个和以太网驱动不一样,所以上面使用的是令牌环驱动。
现在假设左边的用户发送了一个你好的信息。然后这个你好的信息,就需要往下贯穿网络协议栈(添加报头完成封装)。
dang'chaun's
当TCP层完成报头的添加之后,来到了IP层。在IP层也有自己的IP报头,在这个报头中具有很多的字段,其中一定就会具有的字段,这个报头的源头是谁(谁发的),这个报文将来要去的位置又在哪里(目的地)
其实这里还有有一个查询路由表的行为只是这里不明显而已。
然后就是去到最后一层了Mac地址了,增加最后的报文了。
现在主机A和路由器是在同一个网段的所以主机A和路由器是能够通信的,至于主机A具体是怎么查询到的路由器。这些这里不说明了
现在路由器(R)也有自己的IP地址和Mac地址,所以这里的Mac地址就要这么填写:
此时这个信息就通过网络开始出发了。
此时路由器R一定能够手动这个报文,上图中的路由器左侧是一个以太网驱动程序右侧是一个令牌环驱动程序。
因为路由器是需要横跨多个网络的,所以这里的路由器能够识别多种协议的(具有多张网卡)。这里可以理解为具有两张网卡,其中一张网卡和A主机在一个局域网,另外一张网卡和B主机在一个局域网。
此时就能在路由器中完成左侧接收,右侧输出了。
所以路由器的左端就能够识别A主机所发信息的数据帧报头了。
此时路由器就要去解包这个报头了。
发现这个数据帧需要去到MacR,然后这个路由器不就是MacR吗?
此时就会将这个信息往上交付:
去到IP层,然后路由器发现这个信息需要去到IPB(没有解包但是提取了信息),然后路由器就知道这个信息接下来要去到哪了(通过目的地得到下一站)。然后路由器就发现这个IPB就是和路由器相连的一台主机,然后路由器就要来做转发了。
此时路由器就会将这个信息往下交付给令牌环驱动程序。
此时这个有效载荷的外层就要添加令牌环的报头。
这个报头中一定会包含的字段:
然后在通过网络发送这个信息,因为主机B是令牌环驱动程序,所以能够识别到这个信息。然后主机B发现这个报文是发送给自己的,就解包向上交付。
这里我们就能得到一个逻辑:同层协议要发的就是同层协议要收的。
同时:
Mac地址一直在变,ip一直不变,src可能会变,但是目的ip是不会变的。
同时还有一个结论:ip层往上的网络报文时没有差异的(src主机和des主机)。
所以IP地址最大的意义:一个是支持路径的选择,另外一个就是一切皆IP。也就是这里搭建了一层软件层,通过IP地址就能够屏蔽底层所有局域网通信的网络差异了。底层以太网驱动,令牌环驱动不一样,不影响,因为IP层往上都是一样的。
而在现实的网络通信中,距离一般不会和上面的例子一样短的。
一般都是和下图一样的(会经过多个路由器)
以上就是一个简单的示意图。
到这里网络基础(1)就完成了。
本节重点:
然后在转发的时候目的IP不会变化,而Mac地址是一直在变化的。
希望这篇博客能对阅读的您有所帮助,写的不好请见谅。如有错误欢迎指出。
小王毕业啦: 博主的“负载均衡式在线oj项目开发文档”内容非常丰富,让我对这个主题有了全新的认识。文章里的细节描写非常到位,让我感受到了博主的深厚功底和专业知识。我期待着博主未来能够持续分享更多好文,同时也希望能够得到博主的指导,共同进步。非常感谢博主的分享和支持!。
CSDN-Ada助手: 网络 技能树或许可以帮到你:https://edu.csdn.net/skill/network?utm_source=AI_act_network
希望_睿智: 支持用心之作
CSDN-Ada助手: 不知道 CS入门 技能树是否可以帮到你:https://edu.csdn.net/skill/gml?utm_source=AI_act_gml
贵物荣: 好,很有精神