文章持续更新,能够微信搜一搜「golang小白成长记」第一时间阅读,回复【教程】获golang免费视频教程。本文已经收录在GitHub github.com/xiaobaiTech… , 有大厂面试完整考点和成长路线,欢迎Star。git
故事就从一个车轱辘提及吧。先来看一个车轱辘。github
辐条从车轱辘边缘,一直汇聚到 中心的轴,这个轴在英文里叫hub。golang
而咱们今天要讲到的集线器,英文里也叫hub。面试
都叫hub,多少有点关系,看下这面这个图大概能明白,其实二者有点像。shell
大概想表达的意思是,它是汇聚网线的中心,所以就叫集线器。缓存
因此能够理解,你们常逛的 Github,Docker Hub, 还有P**hub ,都是为了表达它们是某类资源的中心了吧。服务器
那么集线器是什么呢?那就要从电脑是怎么互联的这个话题提及。微信
小学的时候,有一种网吧,它实际上是不能上外网的。也就是不能打开度娘,不能搜索资料。markdown
不能上网的网吧还能叫网吧?网络
能。虽然不能上外网,但网吧老板能够把不少台机子连起来,实现网吧内互联,造成一个局域网(Local Area Network,简称LAN)。
网吧内互联以后,就能够放上各类游戏,好比CS,实现网吧内对线。
这种网吧有种好处,没有那么多键盘侠。
毕竟你不知道何时键着键着,对方就顺着网线找过来了。
对战直接从线上转移到线下了。
所以你们打游戏都很和谐,客气,场面十分感人就是了。
那么网吧内的电脑是怎么互联呢?
从最简单的场景提及,假设网吧内只有两台电脑
随便连根网线就能实现互联吗?
固然不是。
还记得网络分层吗?
数据若是要进行传输,会从A电脑通过这些网络分层把消息组装好,再到B电脑层层解包。
网线,只是代替了上面的灰色部分,实现物理层上互联。
若是想要两台电脑互联成功,还须要确保每一层所须要的步骤都要作到位,这样数据才能确保正确投送并返回。
咱们自顶向下,从细节开始说一下实现互联须要作什么。
该层的网络功能由应用自己保证。
假设两台电脑是打算用游戏进行联网,那么该应用层的功能由游戏程序保证。
绝大部分游戏用的传输层协议都是TCP,咱们能够看下TCP报头。
这里面咱们须要关注的是源和目的端口,这个能够定位到这台电脑上哪一个进程在收发数据。
这两个端口信息通常是游戏内部已经填好。
AB两台电脑,其中一台做为服务端启动,好比A,起了个服务器进程。
服务器会开放一个固定的端口,好比27015。这就是目的端口。
这时候A和B均可以搜索到这个服务器。启动一个客户端进程,链接进入A的服务器进程。
而源端口,则由A和B本身生成。
上图除了端口,咱们还看到一个192.168.0.105
,这个就是A的IP地址。
咱们看一下IP层的报文头。
这里面须要关注是源和目的IP地址。
若是两台电脑想经过一根网线进行消息通讯,那么他们须要在一个局域网内。
这意味着,他们的子网掩码须要一致。局域网内,假设子网掩码是 225.225.225.0
,会认为 192.168.0.x
这些IP都属于一个局域网。因此当A的IP地址是192.168.0.105
时,那么B的IP地址能够配成192.168.0.106
。
关于IP这一块是啥,后面会细讲,你们若是没明白我说的是啥,不要急。
组装好网络层报头后,数据包传入到数据链路据层。
以上解决了网络层的互联,而在数据链路层,数据包里须要拼接上MAC报头。先看下MAC报头长什么样子。
其中须要关心的是标红的源和目的MAC地址。MAC地址能够粗略理解是这台电脑网卡的惟一标识。大概长这样
28:f9:d3:62:7d:31
复制代码
源和目的地址,在发送消息的时候就会被填上。
可是A只知道本身的MAC地址,怎么才能知道B的MAC地址呢?
这时候须要ARP协议。
ARP(Address Resolution Protocal),即地址解析协议。用于将IP地址解析为以太网的MAC地址的协议。
在局域网中,当主机A有数据要发送给主机B时,A必须知道B的IP地址。
可是仅仅有IP地址仍是不够的,由于IP数据报文还须要在数据链路层封装成帧才能经过物理网络发送。由于发送端还必须有接收端的MAC地址,因此须要一个从IP地址到MAC地址的映射。ARP就是干这事情的协议。
A查本地ARP表发现B的IP和MAC映射关系不存在
A经过ARP广播的形式向局域网发出消息,询问某IP对应的MAC地址是多少。好比A此时知道B的IP,但并不知道B的MAC地址是多少,就会尝试在局域网内发起ARP广播,询问局域网下全部机器,哪一个机器的IP与B的IP一致。
B收到这个ARP消息,发现A要问的IP与本身的IP一致,就会把本身的MAC地址做为应答返回给A。
此时A就知道了B的MAC地址,顺便把消息记录到本地ARP表里,下次直接用表里的关系就行,不须要每次都去问。
从数据链路层到物理层,数据会被转为01比特流。
此时须要把比特流传到另外一台电脑。
经过一根网线,两段水晶头插入网口,把两台电脑连起来。
但对网线有一些要求。
这根网线两端的水晶头须要采用交叉互联法。
水晶头里有8根线,注意上图里的颜色,是有顺序的。第一、2根线起着收信号的做用,而第三、6脚发信号的做用。将一端的1号和3号线、2号和6号线互换一下位置,就可以在物理层实现一端发送的信号,另外一端能收到。
固然,如今有些网卡有自适应的功能,就算是直连互联法的线,也能有交叉互联法的效果。若是你用的是这种网卡,就当我物理层这块什么都没说吧。
此时,在确保关闭防火墙的前提下,能够尝试从A电脑中ping一下B,再从B电脑中ping一下A。如无心外,都能ping通。
A给B发个消息,从应用层到数据链路层,会分别加上A和B的各类''身份信息"。好比在传输层会加上A和B的应用端口号,在网络层加上源和目的IP,在数据链路层会加上源和目的网卡的MAC头部信息。
B收到消息后逐层解包,验证,最后顺利到达应用层。实现AB两台机器消息互通。
至此游戏就能正常联机对线,两台电脑互联成功!
两我的打cs,总会以为无聊,可是每台电脑又只有一个网线口。
想要邀请更多的人一块儿玩,怎么办?
那就要回到文章开头提到的**集线器(hub)**了。
这是个工做在物理层的设备。
有多个网口,很好的解决了电脑上只有一个网口的问题,能够作到多台电脑的网线都插入到集线器上。
同时工做原理也很是简单,会把某个端口收到的数据,输入到中继电路。
中继电路的基本功能是将输入的信号广播到集线器的全部端口上。
简单来讲就是无脑复制N份到其他N个端口上。
数据复制到N个端口后。对应转发到N台机器里。
说到这里,已经对集线器有个大概认识了。
接下来,咱们看下集线器的内部结构。
从A网口进入集线器的消息,此时仍是电信号。这里通过一个PHY模块。
要理解PHY模块的做用,首先要先了解每一个网口,均可能接着网线(
废话),而每根网线的传输的格式都是有可能不一样的。而PHY的做用,就是把这些格式转化为一个通用的格式。举个例子。PHY就比如一个翻译器,有的人说英文,有的人说日文。可是PHY,会把它统一转为普通话,给内部电路处理。内部电路处理完以后,再通过PHY模块,转为英语,或日文从对应网口里输出。
通过PHY的处理后,以电信号的形式输入到中继电路,被无脑广播,再次通过PHY模块后变成BCD网口的格式输出。
这里面的电信号,是会受噪声干扰,致使信号形变出错的。
但就算是错了,也仍是会原封不动的广播出去,这就是上面提到无脑的精髓所在。
那信号若是出错了怎么办?
只能让接收方收到消息后进行校验。
还记得上文里提到的数据链路层的MAC报头里最末尾有个FCS吗?
FCS里存放的是发送方经过循环冗余校验CRC计算获得的值。
接收方用收到的数据算一次CRC,与FCS里的值进行对比。
若是一致,那证实数据没问题。若是出错,则直接丢弃。
固然,丢弃包并不会影响数据的传输, 由于丢弃的包不会触发确认响应。所以协议栈的 TCP 模块会检测到丢包, 并对该包进行重传。
若是消息没出错,可是由于无脑广播,C也能收到A发给B的数据包。
此时 C 会在接受到数据包后一层层的"剥开"。
正常状况下,在数据链路层时,识别到目的 MAC 地址跟 C 的不一致时,也会把数据丢弃。
目前只有 ABC 三台机器,每次都是广播发消息倒还好。
若是机器愈来愈多,每台机器发一条消息,都会被广播,就有点顶不住了。
举个例子。
假设N台机器,其中两台机器A和B,A发到B和B发给A,共两条消息。
若是这N台机器,用的是集线器。仍是AB之间互发消息,每条消息都是广播的话,就是(N-1)+(N-1)条消息,差距有些大,对网络资源浪费就有些严重了。
那么,有没有可能作到,A发给B的消息,就不要转发给C呢?
能够的,把集线器换成交换机。
交换机,又叫switch,跟集线器长得很像。
可是功能更强一些,从网络分层上来讲,属于数据链路层,比集线器所在的物理层还要高一层。
全部发到交换机的数据,都会先进入交换机的缓存区。接着消息再被转发到对应机器上。
注意这里用的是转发,而不是集线器的广播,交换机是怎么作到转发的呢?
交换机内部维护了一张MAC地址表。
记录了 端口号和MAC地址的对应关系。
这个表的数据是交换机不断学习的结果。
当A发消息到交换机时,交换机发现消息是从1号端口进来的,则会在MAC地址表上,记录A的MAC地址对应1号端口。
若是A没有很长时间没发消息到这个1号端口,那这条记录就会过时并被删除。
那么,当时间足够长,ABC 都发过消息给交换机后,地址表就会有完整的关系信息。
正常流程很清楚了,看两个特殊状况:
先说结论,会直接丢弃这个包。
咱们看下,假设它不丢弃,会发生什么状况。
A只发了一次消息,B却收到两条消息,明显不对。
所以,当交换机查询地址表时,发现目标端口和源端口,是同一个端口时,会丢弃这个包。
这多是由于具备该地址的设备,尚未向交换机发送过包,或者这个设备一段时间没有工做,致使地址被从地址表中删除了。
这种状况下,交换机没法判断应该把包转发到哪一个端口,只能将包转发到除了源端口以外的全部端口上,不管该设备链接在哪一个端口上,都能收到这个包。
此时,交换机就会跟集线器同样进行广播。
发送了包以后目标设备会做出响应,只要返回了响应包,交换机就能够将它的地址写入地址表,下次也就不须要把包 发到全部端口了。
再看下交换机内部结构。
其实对比能够发现,交换机和集线器内部结构很像。
重点须要提到的是MAC模块。消息以电信号的形式从网口进入,到了PHY会被转成通用格式的电信号。而MAC模块的做用是把这个电信号转为数字信号,这样就能提取出MAC包头,并经过MAC数据帧末尾的FCS校验这个包有没有问题,若是没问题,则把数据放到内存缓冲区里,不然直接丢弃。
另外,这个MAC模块,虽然这么叫。但其实交换机MAC模块不具备 MAC 地址。所以交换机的端口不核对接收方 MAC 地址,而是直接接收全部的包并存放到缓冲区中。
放入到内存缓冲区后,还会把MAC地址和端口号记录到MAC地址表中。同时检查目的MAC地址在不在MAC地址表中,在的话则会转发到对应端口。不然广播。
网桥,本质上能够理解为两个网线口的交换机,正好能够把两台电脑给连起来,也叫桥接。而交换机,则是多网线口的网桥,能够把多台电脑给连(桥接)起来。
其余功能方面,大差不差,没必要太过纠结。
这一部分提到的交换机,其实就是二层交换机,也就是工做在第二层(数据链路层)的交换机,两者没区别。
而三层交换机,是工做在第三层(网络层)的交换机,其实就是接下来要提到的路由器。
有了交换机以后,小网吧里的电脑就均可以被连起来了。交换机网口不够?那就再接个交换机。
但世界上电脑这么多,交换机里的MAC地址表难道全都要记住吗?
显然作不到。为了解决这个问题。
因而就有了路由器,工做在网络层,比数据链路层更高一层。
网络层引入了IP的概念。
好比前面提到的 192.168.0.105
就是一个IP,同一个局域网内还可能会有一个IP是192.168.0.106
。有没有发现,它们都是192.168.0.xxx
。
像极了 上海市.黄浦区.南京东路.105号
,这样的地址。现实生活中,咱们能够经过一个地址定位到要去哪。到了 上海市.黄浦区.南京东路.105号
楼里,咱们就能够再去找某个叫身份证为xiaobaixxxxx
的人。
那互联网世界里,咱们也就能够经过IP地址,定位到某个广域网段,再经过广域网内部的局域网的MAC地址定位到具体某个电脑。
上海市.黄浦区.南京东路.105号
能够帮助咱们定位到在南京东路上的第105号楼的位置。但还有些路,好比南京西路,可能不止105号,可能要到257号。
实际上一个IP由网络号和主机号组成,共32位组成。若是拿了前面24位作网络号,那主机号就剩8位了,2的8次方=256,最多表示表示256号楼。所以为了多表示几个楼,能够向网络号多挪几位过来做为主机号。
那么具体多少位做为网络号呢?能够在IP后面加一个数字,用来代表这一点。
因而就有了 192.168.0.105/24
这种表示方法,代表前24位192.168.0.0
是网络号,105是主机号。
有了网段,就能够一次性表示一大批地址。就不须要像交换机那样苦哈哈的一条一条MAC地址记录在表里。
路由器的做用,能够帮助咱们在互联网世界里转发消息到对应的IP。
对比一下。
交换机,是经过 MAC 头部中,接收方 MAC 地址,来判断转发目标的。
路由器,则是根据 IP 头部中, IP 地址来判断的。
因为使用的地址不一样,记录转发信息的表也会不一样。
相似交换机的MAC地址表,路由器也维护了一张路由表。
而路由表,是用于告诉路由器,什么样的消息该转发到什么端口。
假设A要发消息到D。也就是192.168.0.105/24
要发消息到192.168.1.11/24
。
那么A会把消息通过交换机发到路由器。
路由器经过192.168.0.105/24
得到其网络号是 192.168.0.0
,而目的地的网络号是192.168.1.0
,两者网络号不一样,处于不一样局域网。
查路由表,发现192.168.1.0
,在e2端口,那么就会把消息从e2端口发出,到达交换机,交换机发现MAC地址是它局域网下的D机器,就把消息打过去。
固然,若是路由表里找不到,那就打到默认网关吧,也就是从e1口发出,发到IP192.0.2.1
。这个路由器的路由表不知道该去哪,说不定其余路由器知道。
路由器内部,分为控制平面和数据平面,说白了就是对应软件部分和硬件部分。
硬件部分跟交换机很像。数据从A网口进入,此时数据仍是网线上格式的电信号,会被PHY模块转为通用信号格式,再被MAC模块转为数字信号,经过FCS进行错误校验,同时校验MAC地址是不是本身,经过校验则进入内存缓冲区,不然丢弃。
再进入软件部分,由路由选择处理器,经过必定规则(软件逻辑),查询路由表判断转发目标和对应转发口,再经由硬件部分的交换结构转发出去。
若是路由表中没法找到匹配记录,路由器会丢弃这个包,并经过ICMP消息告知发送方。
路由器和交换机不一样点在于,它的每一个网口下,都有一个MAC地址和IP地址。
正由于路由器具备 MAC 地址,所以它可以成为数据链路层的的发送方和接收方。
怎么理解这句话?
前面提到交换机,是不具有MAC地址的,而MAC报头是须要填上目的MAC地址的。所以交换机历来都不是数据的目的地,它只简单转发数据帧到目的地。
但路由器,是有MAC地址的,所以MAC报头就能够写上,下一站目的地就是xx路由。
到了路由器后,路由器能够再次组装下一站的目的MAC地址是再下一个路由,经过这一点,让数据在路由和路由之间传输。
而同时由于交换机不具备MAC地址,所以也不会校验收到的数据帧的MAC地址是否是本身的,所有收下作转发。而路由器则会校验数据帧的MAC报头里的目的MAC地址是否是本身,是的话才会收入内存缓冲区,不然丢弃。
若是在路由表中没法找到匹配的记录,路由器会丢弃这个包,并经过 ICMP消息告知发送方。
而交换机在MAC地址表里找不到转发端口时会选择广播。
这里的处理方式二者是不一样的,缘由在于网络规模的大小。
交换机链接的网络最多也就是几千台设备的规模,这个规模并 不大。若是只有几千台设备,遇到不知道应该转发到哪里的包,交换机能够将包发送到全部的端口上,虽然这个方法很简单粗暴,但不会引起什么 问题。
但路由器工做的网络环境就是互联网,全世界全部的设备都链接在互联网上,规模很是大,而且这个规模还在持续扩大中。若是此时它的操做跟交换机同样,将不知道应该转发到哪里的包发送到整个网络上,那就会产生大量的网络包,形成网络拥塞。所以,路由器遇到不知道该转发到哪里的包, 就会直接丢弃。
无论是交换机仍是路由器,前面都是提到网口输入的是电信号。但如今流行的是光纤传输,传输的是光信号。
而光猫(modem),是一种调制解调器,其实就是用于光电信号转换的设备。
接收数据时,能够将光纤里的光信号转化为电信号,发给路由器,路由器内部再转成数字信号,并在此基础上作各类处理。
相反,也会把路由器传来的电信号转为光信号,发到光纤,并进入互联网。
之前整个班的同窗家里都不见得有一台电脑,都喜欢偷偷跑去网吧玩电脑。改革开放的春风,把电脑吹进了每家每户,也把网吧给吹成了网咖。
从前的我晚上偷偷上网,如今的我,接到报警,也能在大半夜爬起来网上冲浪。
没想到我以这种方式保持了当初最纯粹的质朴。
我是小白,看下右下角,你懂我意思的。
夏天快来了,咱们下期见。
网络是怎么链接的 - 户根勤
趣谈网络协议- 极客时间
关注公众号:【golang小白成长记】