注意路由器的每个端口都有独立的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 位。一般是这样表达的
00-16-EA-AE-3C-40
它是网络设备制造商生产时烧录到网卡中的EPROM(通常可以通过程序擦除的闪存芯片)。其中(00-16-EA)前24位代表网络硬件制造商编号,后24位(AE-3C-40)由制造商自行分配,一般表示网络硬件制造商的编号。序列号。 只要你不改变你的MAC地址,MAC地址在全球都是唯一的。形象地说,MAC地址就像身份证上的身份证号码一样,具有唯一性。
如果要将目标MAC地址表示为上面的FFFF-FFFF-怎么办?开头的是从路由器发出去给某一组设备(后面会提到这个其实就是子网的概念),那么就需要要求某个子网内的所有设备都去购买制造的设备一个厂家生产的MAC地址,或者您可以在生产网络设备和烧录MAC地址时,需要要求厂家按照您规划的子网结构提前设置好MAC地址,并且以后这个网络的结构不能轻易改变。
这显然是不现实的。
于是你发明了一个新的地址,并给每台机器一个32位的数字,如:
11000000101010000000000000000001
你觉得有点不清楚,就分成四部分,中间用点连接起来。
11000000.10101000.00000000.00000001
你还是觉得不太清楚,那就转成十进制吧。
192.168.0.1
最后你给这个地址起了一个朗朗上口的名字,IP地址。现在每台计算机都有自己的MAC地址和IP地址。但是,IP 地址位于软件级别,可以随时修改。 MAC地址一般不能修改。
这样一个可以随时修改的IP地址,可以根据你规划的网络拓扑进行调整。
如上图所示,如果我要向其中一台ABCD设备发送数据包,无论是哪一台,我都可以这样描述,“发送所有以192.168开头的IP地址。 0到Router,以后怎么转发,交给它吧!”,聪明点。
交给路由器后,路由器如何将数据包准确转发到指定设备呢?
别担心,我们慢慢来。
我们先为上述组网方式中的各个设备添加自己的IP地址
现在两个设备之间传输时,除了添加数据链路层的报头外,还必须添加网络层的报头。
如果A向B发送数据,由于它们是直连交换机的,所以A可以直接发送下面的数据包。事实上,网络层并没有体现出效果。
但是如果A向C发送数据,A需要先传输给路由器,然后路由器再传输给C。由于最底层的传输仍然依赖以太网,所以数据包被分成两段。
A ~ 路由器部分的数据包如下:
从路由器到C的数据包如下:
好啦,对于上面提到的两种情况(A->B,A->C),相信细心的读者会有很多疑问。让我们一一展开。
A向C发送了一个数据包,它如何知道是否需要通过路由器转发?
答案:子网
如果源IP和目的IP在同一子网,则直接通过交换机发送数据包。
如果源IP和目的IP不在同一子网,则让路由器处理。
好吧,现在我们只需要弄清楚在子网中意味着什么。
这两个是我们人为指定的,即对于192.168.0.1我们要表达的是:
如果以www.sychzs.cn开头,则认为在同一个子网中,否则认为在不同子网中。
如何将其表达给计算机?于是人们发明了子网掩码
的概念
如果某台机器的子网掩码设置为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不在同一个子网,D也不在同一个子网,以此类推。
所以如果A向C发送消息,并且A和C的IP地址不等于A机器上配置的子网掩码,则A认为C和自己不在同一子网中,所以它发送数据包到路由器。我不在乎,之后怎么转发,A不在乎。
A 如何知道哪个设备是路由器?
答案:在A
上设置默认网关
上一步A通过检查是否与C在同一子网来确定应该将数据包发送到路由器。路由器的IP是多少?
其实说是发送到路由器并不准确。应该说A会将数据包发送到默认网关。
对于A来说,A只能直接将数据包发送到同一子网中的IP,所以无论是发送到路由器还是发送到某台计算机,对于A来说都没有关系,因为只要设备有 IP 地址。
所以默认网关是A在自己电脑上配置的一个IP地址,这样他发送到不同子网的机器时就可以发送到这个IP地址。
就这样!
路由器如何知道C在哪里?
答案:路由表
现在A想要向C发送一个数据包,并且可以成功发送到路由器。最后一个问题是,路由器如何知道接收到的数据包应该从自己的哪个端口出去,最终能否直接(或间接)到达目的地C。
路由器收到的数据包有一个目的IP,就是C的IP地址,需要转换成从哪个端口出去。人们很容易想到应该有一个表,就像MAC地址表一样。
此表称为 路由表。
至于这个路由表是怎么出来的,有很多种路由算法。本文就不展开了,因为我也不知道怎么做哈哈~
与MAC地址表不同,路由表没有明确的一对一关系。让我们看一下路由表的结构。
目的地址 | 子网掩码 | 下一跳 | 端口 |
192.168.0.0 |
255.255.255.0 |
|
0 |
192.168.0.254 |
255.255.255.255 |
|
0 |
192.168.1.0 |
255.255.255.0 |
|
1 |
192.168.1.254 |
255.255.255.255 |
|
1 |
我们学习了一种新的表示方法。由于子网掩码实际上表示的是表示子网网段的前几位数字,所以192.168.0.0(255.255.255.0)也可以缩写为192.168.0.0/24
目的地址 | 下一跳 | 端口 |
192.168.0.0/24 |
|
0 |
192.168.0.254/32 |
|
0 |
192.168.1.0/24 |
|
1 |
192.168.1.254/32 |
|
1 |
这个很容易理解。路由表显示子网 www.sychzs.cn 下的所有内容都转发到端口 0,子网 www.sychzs.cn 下的所有内容都转发到端口 0.端口 1。下一跳列还没有值,我们暂时忽略它
看结构图(子网掩码和默认网关都在这里完成了)
刚才讲的是IP层,但是发送数据包的数据链路层需要知道MAC地址,但是如果只知道IP地址怎么办?
答案:arp
如果您 (A) 不知道 您伙伴 B 的 MAC 地址(您实际上不知道,我们只是假设它已知),并且您只知道其 IP 地址,你应该如何准确的将数据包传输给B呢?
答案很简单。在网络层,需要找到IP地址对应的MAC地址,即通过某种方式找到192.168.0.2对应的MAC地址BBBB 。
这个方法就是arp协议。同时,计算机A和B也会有一个arp缓存表,记录着IP和MAC地址对应关系。
IP 地址 | MAC 地址 |
192.168.0.2 |
BBBB |
一开始,这张桌子是空的。为了知道计算机B的MAC地址(192.168.0.2),计算机A将广播一个ARP请求。请求后,带上你的MAC地址,给A一个回复。这时,A更新了它的arp表。
这样,大家不断地广播arp请求,最终所有计算机都会彻底更新arp缓存表。
总结一下
好吧,总结一下,到目前为止只有一些规则
从各个节点来看
电脑视角:
切换视角:
-
我收到的数据包必须有目标MAC地址
-
通过MAC地址表查看映射关系
一旦找到就会按照映射关系从我指定的端口发送
-
找不到的话,所有端口都会发出来
路由器视角:
如果你的嗅觉够敏锐,应该能感觉到下面这句话:
网络层(IP协议)本身没有传输数据包的功能。数据包的实际传输委托给数据链路层(以太网中的交换机)。
涉及的三个表分别是
-
交换机中有一个 MAC 地址 表,用于映射 MAC 地址及其端口
-
路由器中有一个 路由表 用于映射 IP 地址(网段)及其端口
-
电脑和路由器都有 arp缓存表用于缓存IP和MAC地址的映射关系
这三张桌子是从哪里来的
知道了以上,就可以完整解释当前网络上两个节点如何发送数据包的过程了!
2 {IMG_22:Ahr0Chm6ly9pbwcymdiWLMNUYMXVZ3MUY2JSB2CVMTA5NjewMDIXMDEVMTA5NJEWMDIXMDEXMZE2MTCZOTE1MY0XOTI5odi2mdiw Lnbuzw ==/}
那就放本章最后一张 网络拓扑图,请做好战斗!
2 {IMG_23:Ahr0chm6ly9pbwcymdiWLMNUYMXVZ3MUY2JSB2CVMTA5NJEWMYMDIXMDEVMTA5NJEWMDIXMZEXMDE4MY0XMZY5ODK3MJYU CG5N/}
此时,路由器1连接到了路由器2,所以它的路由表就有了下一个地址的概念,所以它的路由表就变成这样了。如果匹配到有下一跳地址的项,则需要再次匹配,找到其端口,找到下一跳IP的MAC地址。
也就是说,找了一圈之后,一定要映射到一个端口号,然后数据包就从这个端口号发出去。
目的地址 | 下一跳 | 端口 |
192.168.0.0/24 |
|
0 |
192.168.0.254/32 |
|
0 |
192.168.1.0/24 |
|
1 |
192.168.1.254/32 |
|
1 |
192.168.2.0/24 |
192.168.100.5 |
|
192.168.100.0/24 |
|
2 |
192.168.100.4/32 |
|
2 |
此时,如果A向F发送数据包,能通过吗?如果是的话,整个过程是怎样的?
想一想...
详细流程动画说明:
详细流程文字说明:
? .0.254)
2. A通过ARP查找到默认网关192.168.0.254的MAC地址。
3.A 将源 MAC 地址(AAAA)和网关 MAC 地址(ABAB)封装在数据链路层报文头中,然后封装源 IP 地址(192.168.0.1)和目的 IP 地址(192.168.1)。 2.2 ) (注意,千万不要以为这里填写的是默认网关的IP地址,这个数据包的两个IP地址自始至终都没有变化,只有MAC地址在不断变化。)封装在网络层头部,然后Dispatch
2 {IMG_26:Ahr0Chm6ly9pbwcymdiWLMNUYMXVZ3MUY2JSB2CVMTA5NJEWMYMDIXMDEVMTA5NJEWMDIXMZEXMDA3NJA4MDI5NJCU CG5N/}
4. 交换机1收到数据包后,发现目标MAC地址为ABAB,转发给路由器1
?
6. 所以此时Router 1需要做两件事。首先是重新匹配路由表。发现匹配的端口为2,于是将其封装到数据链路层,最后将数据包从2号发出。
7. 此时,Router 2 收到数据包,发现其目的地址为 192.168.2.2。查询路由表发现端口号为1,准备将数据包从端口1发送出去。
8.但此时Router 2需要知道192.168.2.2的MAC地址,于是检查其arp缓存,发现其MAC地址为FFFF,将其封装在数据链路层报头中,从 1 开始 端口号用于将数据包发送出去。
9. 交换机3收到数据包,发现目的MAC地址为FFFF。它检查了自己的MAC地址表,发现自己应该从6号端口出去,于是就将数据包从6号端口发出去。
10. F 终于收到包裹了! 并且发现目的地MAC地址是自己,于是他收下了包裹
更细致、更精准的流程:
相信大家看完这篇都累了。了解了上面的流程就基本上清楚了网络层以下的一些主要流程。如果想要更专业的这个过程的流程描述,可以公众号低并发编程后台回复网络,获取我模拟这个过程的Cisco Packet Tracer源文件。
2 {IMG_27:Ahr0Chm6ly9pbwcymdiWLMNUYMXVZ3MUY2JSB2CVMTA5NjewMDixmDevMTA5NjewyMDixmzemjCZEWOTUXMTGU CG5N/}
数据包传输的每一步都会有每一层的原始数据和专业的流程描述
同时,在此基础上,你还可以设计自己的网络拓扑,并进行各种实验,加深对网络传输过程的理解。
后记
至此,经过物理层、数据链路层、网络层这前三层的协议,以及根据这些协议设计的各种网络设备(网线、集线器、交换机、路由器),理论上只要拥有对方的 IP 地址,就已经将地球上任意位置的两个节点连通了。
本文经过了很多次的修改,删减了不少影响主流程的内容,就是为了让读者能抓住网络传输前三层的真正核心思想。同时网络相关的知识也是多且杂,我也还有很多搞不清楚的地方,非常欢迎大家与我交流,共同进步。