当前位置:首页 > 公众号精选 > CPP开发者
[导读]你是一台电脑,你的名字叫A很久很久之前,你不与任何其他电脑相连接,孤苦伶仃。直到有一天,你希望与另一台电脑B建立通信,于是你们各开了一个网口,用一根网线连接了起来。用一根网线连接起来怎么就能"通信"了呢?我可以给你讲IO、讲中断、讲缓冲区,但这不是研究网络时该关心的问题。如果你纠...

你是一台电脑,你的名字叫 A


很久很久之前,你不与任何其他电脑相连接,孤苦伶仃。



直到有一天,你希望与另一台电脑 B 建立通信,于是你们各开了一个网口,用一根网线连接了起来。



用一根网线连接起来怎么就能"通信"了呢?我可以给你讲 IO、讲中断、讲缓冲区,但这不是研究网络时该关心的问题。


如果你纠结,要么去研究一下操作系统是如何处理网络 IO 的,要么去研究一下包是如何被网卡转换成电信号发送出去的,要么就仅仅把它当做电脑里有个小人在开枪吧~



反正,你们就是连起来了,并且可以通信。






第一层





有一天,一个新伙伴 C 加入了,但聪明的你们很快发现,可以每个人开两个网口,用一共三根网线,彼此相连。


随着越来越多的人加入,你发现身上开的网口实在太多了,而且网线密密麻麻,混乱不堪。(而实际上一台电脑根本开不了这么多网口,所以这种连线只在理论上可行,所以连不上的我就用红色虚线表示了,就是这么严谨哈哈~)



于是你们发明了一个中间设备,你们将网线都插到这个设备上,由这个设备做转发,就可以彼此之间通信了,本质上和原来一样,只不过网口的数量和网线的数量减少了,不再那么混乱。



你给它取名叫集线器,它仅仅是无脑将电信号转发到所有出口(广播),不做任何处理,你觉得它是没有智商的,因此把人家定性在了物理层。



由于转发到了所有出口,那 BCDE 四台机器怎么知道数据包是不是发给自己的呢?


首先,你要给所有的连接到集线器的设备,都起个名字。原来你们叫 ABCD,但现在需要一个更专业的,全局唯一的名字作为标识,你把这个更高端的名字称为 MAC 地址。


你的 MAC 地址是 aa-aa-aa-aa-aa-aa,你的伙伴 b 的 MAC 地址是 bb-bb-bb-bb-bb-bb,以此类推,不重复就好。


这样,A 在发送数据包给 B 时,只要在头部拼接一个这样结构的数据,就可以了。



B 在收到数据包后,根据头部的目标 MAC 地址信息,判断这个数据包的确是发给自己的,于是便收下。


其他的 CDE 收到数据包后,根据头部的目标 MAC 地址信息,判断这个数据包并不是发给自己的,于是便丢弃。



虽然集线器使整个布局干净不少,但原来我只要发给电脑 B 的消息,现在却要发给连接到集线器中的所有电脑,这样既不安全,又不节省网络资源。






第二层


如果把这个集线器弄得更智能一些,只发给目标 MAC 地址指向的那台电脑,就好了。


虽然只比集线器多了这一点点区别,但看起来似乎有智能了,你把这东西叫做交换机。也正因为这一点点智能,你把它放在了另一个层级,数据链路层。


如上图所示,你是这样设计的。


交换机内部维护一张 MAC 地址表,记录着每一个 MAC 地址的设备,连接在其哪一个端口上。


MAC 地址 端口
bb-bb-bb-bb-bb-bb 1
cc-cc-cc-cc-cc-cc 3
aa-aa-aa-aa-aa-aa 4
dd-dd-dd-dd-dd-dd 5
假如你仍然要发给 B 一个数据包,构造了如下的数据结构从网口出去。


到达交换机时,交换机内部通过自己维护的 MAC 地址表,发现目标机器 B 的 MAC 地址 bb-bb-bb-bb-bb-bb 映射到了端口 1 上,于是把数据从 1 号端口发给了 B,完事~


你给这个通过这样传输方式而组成的小范围的网络,叫做以太网。


当然最开始的时候,MAC 地址表是空的,是怎么逐步建立起来的呢?


假如在 MAC 地址表为空是,你给 B 发送了如下数据:


由于这个包从端口 4 进入的交换机,所以此时交换机就可以在 MAC地址表记录第一条数据:


MAC:aa-aa-aa-aa-aa-aa-aa
端口:4


交换机看目标 MAC 地址(bb-bb-bb-bb-bb-bb)在地址表中并没有映射关系,于是将此包发给了所有端口,也即发给了所有机器。


之后,只有机器 B 收到了确实是发给自己的包,于是做出了响应,响应数据从端口 1 进入交换机,于是交换机此时在地址表中更新了第二条数据:


MAC:bb-bb-bb-bb-bb-bb
端口:1


过程如下:


经过该网络中的机器不断地通信,交换机最终将 MAC 地址表建立完毕~


随着机器数量越多,交换机的端口也不够了,但聪明的你发现,只要将多个交换机连接起来,这个问题就轻而易举搞定~


你完全不需要设计额外的东西,只需要按照之前的设计和规矩来,按照上述的接线方式即可完成所有电脑的互联,所以交换机设计的这种规则,真的很巧妙。你想想看为什么(比如 A 要发数据给 F)。


但是你要注意,上面那根红色的线,最终在 MAC 地址表中可不是一条记录呀,而是要把 EFGH 这四台机器与该端口(端口6)的映射全部记录在表中。


最终,两个交换机将分别记录 A ~ H 所有机器的映射记录。


左边的交换机


MAC 地址 端口
bb-bb-bb-bb-bb-bb 1
cc-cc-cc-cc-cc-cc 3
aa-aa-aa-aa-aa-aa 4
dd-dd-dd-dd-dd-dd 5
ee-ee-ee-ee-ee-ee
6
ff-ff-ff-ff-ff-ff
6
gg-gg-gg-gg-gg-gg
6
hh-hh-hh-hh-hh-hh
6
右边的交换机


MAC 地址 端口
bb-bb-bb-bb-bb-bb 1
cc-cc-cc-cc-cc-cc 1
aa-aa-aa-aa-aa-aa 1
dd-dd-dd-dd-dd-dd 1
ee-ee-ee-ee-ee-ee
2
ff-ff-ff-ff-ff-ff
3
gg-gg-gg-gg-gg-gg
4
hh-hh-hh-hh-hh-hh
6
这在只有 8 台电脑的时候还好,甚至在只有几百台电脑的时候,都还好,所以这种交换机的设计方式,已经足足支撑一阵子了。


但很遗憾,人是贪婪的动物,很快,电脑的数量就发展到几千、几万、几十万。






第三层





交换机已经无法记录如此庞大的映射关系了。


此时你动了歪脑筋,你发现了问题的根本在于,连出去的那根红色的网线,后面不知道有多少个设备不断地连接进来,从而使得地址表越来越大。


那我可不可以让那根红色的网线,接入一个新的设备,这个设备就跟电脑一样有自己独立的 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 位,一般这样来表示:


00-16-EA-AE-3C-40


它是由网络设备制造商生产时烧录在网卡的EPROM(一种闪存芯片,通常可以通过程序擦写)。其中前 24 位(00-16-EA)代表网络硬件制造商的编号,后 24 位(AE-3C-40)是该厂家自己分配的,一般表示系列号。只要不更改自己的 MAC 地址,MAC 地址在世界是唯一的。形象地说,MAC地址就如同身份证上的身份证号码,具有唯一性。


那如果你希望向上面那样将目标 MAC 地址表示为 FFFF-FFFF-?开头的,统一从路由器出去发给某一群设备(后面会提到这其实是子网的概念),那你就需要要求某一子网下统统买一个厂商制造的设备,要么你就需要要求厂商在生产网络设备烧录 MAC 地址时,提前按照你规划好的子网结构来定 MAC 地址,并且日后这个网络的结构都不能轻易改变。


这显然是不现实的。


于是你发明了一个新的地址,给每一台机器一个 32 位的编号,如:


11000000101010000000000000000001


你觉得有些不清晰,于是把它分成四个部分,中间用点相连。


11000000.10101000.00000000.00000001


你还觉得不清晰,于是把它转换成 10 进制。


192.168.0.1


最后你给了这个地址一个响亮的名字,IP 地址。现在每一台电脑,同时有自己的 MAC 地址,又有自己的 IP 地址,只不过 IP 地址是软件层面上的,可以随时修改,MAC 地址一般是无法修改的。


这样一个可以随时修改的 IP 地址,就可以根据你规划的网络拓扑结构,来调整了。


如上图所示,假如我想要发送数据包给 ABCD 其中一台设备,不论哪一台,我都可以这样描述,"将 IP 地址为 192.168.0 开头的全部发送给到路由器,之后再怎么转发,交给它!",巧妙吧。


那交给路由器之后,路由器又是怎么把数据包准确转发给指定设备的呢?


别急我们慢慢来。


我们先给上面的组网方式中的每一台设备,加上自己的 IP 地址。


现在两个设备之间传输,除了加上数据链路层的头部之外,还要再增加一个网络层的头部。


假如 A 给 B 发送数据,由于它们直接连着交换机,所以 A 直接发出如下数据包即可,其实网络层没有体现出作用。



但假如 A 给 C 发送数据,A 就需要先转交给路由器,然后再由路由器转交给 C。由于最底层的传输仍然需要依赖以太网,所以数据包是分成两段的。


A ~ 路由器这段的包如下:



路由器到 C 这段的包如下:



好了,上面说的两种情况(A->B,A->C),相信细心的读者应该会有不少疑问,下面我们一个个来展开。



A 给 C 发数据包,怎么知道是否要通过路由器转发呢?


答案:子网


如果源 IP 与目的 IP 处于一个子网,直接将包通过交换机发出去。


如果源 IP 与目的 IP 不处于一个子网,就交给路由器去处理。


好,那现在只需要解决,什么叫处于一个子网就好了。


  • 192.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 分别同这个子网掩码进行与运算,相等则是在一个子网,不相等就是在不同子网,就这么简单。


比如:


  • A电脑:192.168.0.1
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

据CNMO了解,有韩媒报道称,韩国将在下个月公布下一代网络战略,为6G移动通信的商业化做准备。据悉,战略中除了6G网络的智能化、融合和空间扩展的技术战略外,还将提出公私合营的合作方式。

关键字: 6G 网络 战略

前不久,一位意大利女航天员在网络上走红,因为她在海外社交平台上发布了一组太空摄影作品,并配上了中国著名书法家王羲之所著《兰亭集序》中一句描绘宇宙景观的古文。“仰观宇宙之大,俯察品类之盛,所以游目骋怀,足以极视...

关键字: 卫星 航天器 网络 MIDDOT

这两年来Wi-Fi 6无线网络得到了大家的认可,现在的手机及路由器几乎都支持了这一标准,速度超过家里的千兆带宽没问题,在下一代的无线就是Wi-Fi 7了,高通日前首次演示了Wi-Fi 7的实际速度,达到了5Gbps。

关键字: 5G 网络 高通Wi-Fi 7

工厂运用创新的工业4.0技术和循环经济能力,加速可持续的先进制造实践 上海2022年10月17日 /美通社/ -- 近日,伟创力宣布其位于巴西索罗卡巴(Sorocaba)的工厂已获准加入世界经济论坛全球灯塔网络(GLN...

关键字: 伟创力 网络 工业4.0 可持续发展

量子网络是一类遵循量子力学规律进行高速数学和逻辑运算、存储及处理量子信息的物理装置。当某个装置处理和计算的是量子信息,运行的是量子算法时,它就是量子网络。量子网络的概念源于对可逆计算机的研究。研究可逆计算机的目的是为了解...

关键字: 欧洲 量子计算机 网络

北京2022年10月14日 /美通社/ -- 近年来,WiFi技术在医疗场景中得到广泛应用,无论是无线查房、无线护理、无线输液,还是医护人员定位管理、特殊患者定位看护、婴儿防盗等医疗服务,无线网络都承担至关重要的角色。近...

关键字: 网络 联网 智慧医疗 智慧医院

北京2022年10月14日 /美通社/ -- 2022年10月14日,亚马逊云科技举办一年一度的中国合作伙伴峰会。本届峰会以"价值成就 探索无限"为主题,面向合作伙伴推出"3+3价值成就体系...

关键字: 亚马逊 网络 AC MARKET

北京——2022年10月14日,亚马逊云科技举办一年一度的中国合作伙伴峰会。本届峰会以“价值成就 探索无限”为主题,面向合作伙伴推出“3+3价值成就体系”,将通过核心能力建设、深度行业赋能和全域覆盖三大有力举措,以及技术...

关键字: 亚马逊云科技 网络

北京2022年10月11日 /美通社/ -- 在四川大凉山深处,有一只"凉山黑鹰"少年篮球队:队员平均年龄12岁,平均身高1米3,球队刚成立时,连个像样的球场都没有。然而,凭着一腔热情和惊人天赋,这只...

关键字: 网络 BSP 内核 腾讯

据中国铁道建筑报消息,由中铁十四局承建的上海机场联络线2标单月推进288环,进尺达到576米,平均日进尺19.2米,创造了全预制大直径泥水盾构国内最快纪录。据了解,上海机场联络线是上海市首条市域铁路,正线全长68.6公里...

关键字: 铁路 网络 控制工程

CPP开发者

233 篇文章

关注

发布文章

编辑精选

技术子站

关闭