如果让你来设计网络
你是一台电脑,你的名字叫a。
曾几何时,你没有连接到任何其他计算机,你是一个人。
直到有一天,你想和另一台电脑B建立通信,于是你们各自开了一个网口,用网线连接。
怎么用网线交流呢我可以告诉你IO,中断,缓冲区,但这不是你学习网络时应该关心的
纠结的话,要么研究操作系统如何处理网络IO,要么研究数据包如何被网卡转换成电信号发出去,要么就当是电脑里的反派射击吧~
反正你们是有联系的,可以交流。
一楼,二楼
有一天,一个新的伙伴C加入了,但是你们这些聪明人很快发现,你可以打开两个互联网端口,用总共三根网线互相连接。
伴随着越来越多的人加入进来,你发现自己身上的上网端口太多,网线密密麻麻,乱七八糟。
所以你发明了一种中间设备你把所有的网线都插在这个设备上,这个设备转发,这样你们就可以互相交流了本质上和以前一样,只是减少了网络端口和网线数量,不再那么混乱
你把它命名为hub,它只是把电信号不经过任何处理就传送到所有插座,你觉得它没有智商,你就把它归结为物理层。
由于数据包会被转发到所有出口,那么四台BCDE机器如何知道该数据包是发往自己的呢。
首先,您必须命名所有连接到集线器的设备你以前叫ABCD,现在需要一个更专业,全球唯一的名字作为你的logo你把这个更高端的名字叫做MAC地址
你的MAC地址是aa—aa—aa—aa—aa—aa,你的好友B的MAC地址是BB—BB—BB—BB,以此类推,不要重复就好。
这样,当A向B发送一个数据包时,只需要在报头用这样的结构拼接数据即可。
B收到数据包后,根据报头中的目的MAC地址信息判断出该数据包确实是发给自己的,于是接受。
其他CDE收到该数据包后,根据报头中的目的MAC地址信息确定该数据包不是发给自己的,于是将其丢弃。
虽然hub让整个布局干净了很多,但是我原来发给B机的消息,现在都发给所有连接到hub的电脑,既不安全也不节省网络资源。
二楼
如果能让这个hub更智能,只发送到目标MAC地址指向的电脑就好了。
虽然只比hub多一点点区别,但是看起来很智能你把这东西叫做开关因为这个小小的智能,你把它放到了另一个层面,数据链路层
如上图,你是这样设计的。
交换机内部维护一个MAC地址表,记录每个MAC地址设备连接到哪个端口。
MAC地址端口b B— b B— b B— b B— bb1cc—cc—cc—cc—cc—cc3aa—aa—aa—aa4dd—DD—DD—DD—DD5
如果还想给B发一个数据包,构造如下数据结构,从网口出去。
到了交换机,交换机发现目标机B的MAC地址通过自己的MAC地址表映射到了端口1,于是把端口1的数据发给了B,结束~
给你这个这样一种传输方式形成的小规模网络,叫以太网。
当然,刚开始的时候,MAC地址表是空的是如何逐渐建立起来的
如果MAC地址表为空,则向b发送以下数据。
因为此数据包通过端口4进入交换机,此时交换机可以在MAC地址表中记录第一个数据:
MAC:aa—aa—aa—aa—aa—aa—aa—aa—aa
端口:4
看到交换机的目的MAC地址在地址表中没有映射关系,这个包就发往所有端口,也就是所有机器。
之后,只有机器B收到了真正发给自己的数据包,所以它做出了响应。响应数据从端口1进入交换机,因此交换机此时更新了地址表中的第二个数据:
苹果:bb—bb—bb—bb—bb—bb
端口:1
该过程如下
网络中的机器保持通信后,交换机最终建立MAC地址表~
伴随着机器数量的增加,交换机的端口不够用了,但是你足够聪明的发现,连接多个交换机就可以轻松解决这个问题~
你根本不需要设计什么额外的东西,只需要按照之前的设计和规则,按照上面的布线方式就可以完成所有电脑的互联,所以这个开关设计的规则真的很巧妙想想为什么
不过你要注意,上面的红线最后并不是MAC地址表中的记录,而是四台EFGH机和端口之间的所有映射都要记录在表中。
最后两个开关会分别记录A~H中所有机器的映射记录。
打开左边的开关
MAC地址端口bb—bb—bb—bb—bb1cc—cc—cc—cc—cc—cc3aa—aa—aa—aa4dd—DD—DD—dd5ee—ee—ee—ee 6ff—ff—ff—ff。
打开右边的开关
MAC地址端口b B— b B— b B— b B— bb1cc—cc—cc—cc—cc—cc1aa—aa—aa—aa1dd—DD—DD—dd1ee—ee—ee—ee2ff—ff—ff—ff
这在只有八台电脑的情况下没问题,即使只有几百台电脑的情况下也没问题,所以这个交换机的设计有一段时间是完全支持的。
但不幸的是,人是贪婪的动物很快,计算机的数量将增长到几千,几万,几十万
第三层
交换机无法再记录如此庞大的映射关系。
这时候你脑子就歪了,你已经发现问题的根源就在于接出去的红色网线后面不知道有多少设备在不断的接进来,从而让地址表越来越大。
我能不能把红色网线连接到一个新的设备上,像电脑一样有自己独立的MAC地址,同时还能帮我转发一次数据包。
这个设备是一个路由器它的作用是做一个独立的设备,有一个MAC地址,可以帮我转发一次包您在网络层设置它
请注意,路由器的每个端口都有自己的MAC地址。
好了,现在在交换机的MAC地址表中,只需要再多一个MAC地址ABAB和其端口的映射关系,就可以成功将数据包转发到路由器这个完成了
怎么做呢把所有发给C和D的数据包,甚至是发给DEFGH的,都先发给路由器
不难想到这样一个想法,如果电脑C和D的MAC地址有一个共同的前缀,比如
c的MAC地址:FFFF—FFFF—CCCC
d的MAC地址:FFFF—FFFF—DDDD
那么我们可以说目的MAC地址是FFFF—FFFF—开始时,都是先送到路由器
这可行吗答案是否定的
先说现实中MAC地址的结构MAC地址也叫物理地址和硬件地址,长度是48位,一般是这样表示的
3C时间2016年00月40日
是网络设备厂商生产的烧在网卡上的EPROM前24位代表网络硬件厂商的编号,后24位由厂商自行分配,一般代表序列号只要不改MAC地址,MAC地址是世界唯一的形象地说,MAC地址就像身份证上的身份证号一样是唯一的
所以如果你想如上所述指出目的MAC地址是FFFF—FFFF—刚开始的时候,如果从路由器发给某一组设备,你需要购买某一个子网下某一个厂商生产的所有设备,或者在刻录网络设备的MAC地址时,需要要求厂商根据你规划的子网结构预先设置好MAC地址,以后这个网络的结构就不能轻易改变了
这显然是不现实的。
所以你发明了一个新地址,给每台机器一个32位数字,比如:
11000000101010000000000000000001
你觉得有点不清楚,就把它分成四部分,中间用点连接起来。
11000000.10101000.00000000.00000001
你还是觉得不清楚,就换算成十进制。
192.168.0.1
最后你给这个地址起了个响亮的名字,IP地址现在每台电脑都有自己的MAC地址和自己的IP地址,但是IP地址是在软件层面,可以随时修改,而MAC地址一般是无法修改的
这样一个可以随时修改的IP地址,可以根据你规划的网络拓扑进行调整。
如上图所示,如果我要向ABCD设备中的一个发送数据包,不管是哪一个,我都可以这样描述:把所有以192.168.0开头的IP地址都发送给路由器,然后转发给它! ",聪明。
数据包交给路由器后,路由器是如何准确转发到指定设备的。
让我们慢慢来。
我们先在上面的组网模式下给每个设备添加自己的IP地址。
目前,除了数据链路层的报头之外,网络层的报头被添加到两个设备之间的传输中。
如果A向B发送数据,因为它们直接连接到交换机,A可以直接发送下面的数据包事实上,网络层并没有发挥作用
但是如果A发送数据给C,A需要先转发给路由器,然后路由器再转发给C,因为最低传输还是依靠以太网,所以数据包被分成两段。
答~路由器部分中的数据包如下:
从路由器到C的数据包如下:
好了,相信细心的读者会对上面提到的两种情况有很多疑问让我们逐一展开
发送一个数据包给一个C,怎么知道要不要通过路由器转发。
答案:子网
如果源IP与目的IP位于同一个子网,则直接通过交换机发送数据包。
如果源IP与目的IP不在同一个子网中,它将被移交给路由器。
好了,现在我们只需要解决处于子网中的问题。
92.168.0.1和192.168.0.2位于同一个子网中。
192.168.0.1和192.168.1.1位于不同的子网中。
这两个是我们人为规定的,也就是我们要表达的,对于192.168.0.1:
192.168.0.xxx,即使在一个子网,否则就是在不同的子网。
对于计算机,你如何表达这个意思于是人们发明了子网掩码的概念
假设一台机器的子网掩码设置为255.255.255.0。
这意味着源IP和目的IP分别与这个子网掩码进行and运算,如果相等,则在一个子网内,如果不相等,则在不同的子网内就这么简单
例如
答:192.168.0.1安培,255.255.255.0 = 192.168.0.0
b:电脑:192.168.0.2安培,255.255.255.0 = 192.168.0.0
C: 192.168.1.1安培,255.255.255.0 = 192.168.1.0
d:电脑:192.168.1.2安培,255.255.255.0 = 192.168.1.0
那么A和B在同一个子网,C和D在同一个子网,但是A和C不在同一个子网,以此类推。
所以如果A给C发消息,A和C的IP地址分别是amp如果发现A机配置的子网掩码不相等,那么A认为C和自己不在同一个子网,就把包发给路由器,不管之后怎么转发,A也不管。
A如何知道哪个设备是路由器。
答:在a上设置默认网关。
在上一步中,A通过与c处于同一子网来判断是否应该将数据包发送到路由器,路由器的IP是什么。
其实把包发给路由器并不准确应该说A会将数据包发送到默认网关
对于A来说,A只能直接向同一个子网下的一个IP发送数据包,所以对于A来说是发给路由器还是电脑都无所谓,只要设备有IP地址就行。
所以默认网关是A在自己的电脑上配置的IP地址,这样就可以发送到不同子网的机器上。
仅此而已!
路由器怎么知道C在哪里。
答案:路由表
现在A想给C发送一个数据包,已经可以成功发送到路由器了最后一个问题是,路由器如何知道应该从哪个端口出去,才能直接到达目的地C
路由器收到的数据包有目的IP,也就是C的IP地址,需要翻译成从哪个端口出去很容易认为应该有一个表,就像MAC地址表一样
这个表被称为路由表。
至于这个路由表是怎么出来的,路由算法很多,我就不展开这篇文章了,因为我不会哈哈~
与MAC地址表不同,路由表不是一一对应的关系让我们来看看路由表的结构
目的子网掩码的下一跳端口是192 . 168 . 0 . 0255 . 255 . 00192 . 168 . 0 . 254255 . 2550192 . 168 . 1 . 0255 . 255 . 0192。
让我们学习一种新的表示方法因为子网掩码实际上是表示子网段的前几位,比如192.168.0.0也可以缩写成192.168.0.0/24
目标下一跳端口192 . 168 . 0 . 0/240192 . 168 . 0 . 254/320192 . 168 . 1 . 0/241192 . 168 . 1 . 254/321
这个很好理解路由表意味着子网192.168.0.xxx下的所有内容都转发到端口0,子网192.168.1.xxx下的所有内容都转发到端口1下一跳列还没有值,所以我们忽略它
用结构图看图中的功放,笔误,结果应该是. 0
刚才我们谈到了IP层,但是发送数据包的数据链路层需要知道MAC地址,而我只知道IP地址我该怎么办
答案:arp
如果此时你不知道你的伙伴B的MAC地址,而你只知道它的IP地址,你怎么能准确的把数据包发给B呢。
答案很简单在网络层,我需要找到IP地址对应的MAC地址,也就是通过某种手段,找到192.168.0.2对应的MAC地址BBBB
这种方法就是arp协议,在电脑A和B中也有一个arp缓存表,记录了ip和MAC地址的对应关系。
IP MAC地址192.168.0.2BBBB
起初,这张桌子是空的为了知道计算机B的MAC地址,计算机A将广播一个arp请求电脑B收到请求后,会自带MAC地址给A一个响应此时,A更新了它的arp表
这样,通过arp请求的不断广播,最终所有的计算机都会完全更新arp缓存表。
总结
好了,总结一下,目前只有几条规则。
从每个节点的角度来看
计算机视角:
首先,我需要知道自己的IP和对方的IP。
通过子网掩码判断我们是否在同一个子网。
通过同一子网的arp获取对方的mac地址,直接扔出去。
通过arp获取默认网关的mac地址,不在同一个子网,直接扔出去。
切换视角:
我收到的数据包必须有目的MAC地址。
通过MAC地址表查找映射关系。
如果找到了,按照映射关系从我指定的端口发出去。
如果找不到,就把它发送到所有端口。
路由器视角:
我收到的数据包必须有目的IP地址。
通过路由表查找映射关系
如果找到了,按照映射关系从我指定的端口发出去。
如果找不到,则会返回一个包含不可达路由的数据包。
如果你嗅觉敏锐,应该能感觉到下面这句话:
网络层本身没有传输包的功能,包的实际传输委托给数据链路层。
涉及的三个表是
交换机中有一个MAC地址表,用于映射MAC地址及其端口。
路由器中有一个路由表来映射IP地址及其端口。
电脑和路由器中都有arp缓存表,用来缓存ip和MAC地址的映射关系。
这三款手表是怎么来的。
MAC地址表是通过交换机在以太网中节点间的通信不断完善的。
路由表是通过各种路由算法和人工配置逐步完善的。
arp缓存表是通过arp协议的要求逐步完善的。
知道了以上,目前网络上两个节点如何发送数据包的过程就可以完全解释了!
然后我们放上本章最后一张网络拓扑图。请做好战斗准备!
这个时候路由器1和路由器2相连,所以它的路由表有了下一个地址的概念,所以它的路由表就变成这样了如果和下一跳地址有匹配,就需要再次匹配,找到它的端口,找到下一跳IP的MAC地址
也就是说,搜索之后,你必须能够最后映射到一个端口号,然后从这个端口号发送数据包。
地址下一跳端口192 . 168 . 0 . 0/240192 . 168 . 0 . 254/320192 . 168 . 1 . 0/241192 . 168 . 1 . 254/321192 . 168 . 2 . 0/24192。
这时候如果A给F发一个数据包,能打通吗如果有,整个过程是什么样的
想一分钟。...
详细的流程动画描述:
详细的流程文本描述:
1.首先,A通过子网掩码计算出它与F不在同一个子网,决定将其发送到默认网关。
2.a .通过ARP找到默认网关192.168.0.254的MAC地址。
3.a将源MAC地址和网关MAC地址封装在数据链路层报头中,并将源IP地址和目的IP地址(注意,你千万不要以为这里填的是默认网关的IP地址从头到尾,这个包的两个IP地址都是不变的,只有MAC地址一直在变
4.收到数据包后,交换机1发现目的MAC地址是ABAB,并将其转发给路由器1。
5.数据包到达路由器1,发现其目的IP地址是192.168.2.2查看其路由表,发现下一跳地址是192.168.100.5
6.此时,路由器1需要做两件事第一件事是再次匹配路由表,发现端口2匹配,于是封装在数据链路层,最后从端口2发出数据包
7.这时路由器2收到了这个包,看到它的目的地址是192.168.2.2,查询它的路由表,匹配到端口号1,准备把这个包从端口1发出去。
8.但此时路由器2需要知道192.168.2.2的MAC地址,于是它查找自己的arp缓存,找到自己的MAC地址FFFF,封装在数据链路层报头中,从端口1发出数据包。
9.交换机3收到数据包,发现目的MAC地址是FFFF,查找其MAC地址表,发现它应该从其端口6发出,因此它从端口6发出数据包。
10.f终于收到数据包了!而我发现目的MAC地址是我自己,就接受了这个包。
更详细和精确的流程:
包传输的每一步都会有每一层的原始数据和专业的流程描述。
同时,在此基础上,还可以设计自己的网络拓扑,进行各种实验,加深对网络传输过程的理解。
附言
到目前为止,通过物理层,数据链路层,网络层的协议,以及根据这些协议设计的各种网络设备,理论上只要有彼此的IP地址,就已经连接了地球上任何地方的两个节点。
这篇文章经过多次修改,删除了很多影响主流程的内容,只是为了让读者能够掌握网络传播前三层真正的核心思想同时,网络相关的知识也是庞杂的,我还有很多困惑非常欢迎大家和我交流,共同进步