目录:
https://www.jianshu.com/p/1961df2a1336
第一层(物理层)
我们常说的路由器,是在第三层上。
网线有的是电脑连电脑,有的是电脑连网口。
对于电脑连电脑。这种方式就是一根网线,有两个头。一头插在一台电脑的网卡上,另一头插在另一台电脑的网卡上。水晶头要做交叉线,用的就是1-3、2-6 交叉接法。
水晶头的第 1、2 和第 3、6 脚,它们分别起着收、发信号的作用。将一端的 1 号和 3 号线、2 号和 6 号线互换一下位置,就能够在物理层实现一端发送的信号,另一端能收到。
电脑连电脑,除了网线要交叉,还需要配置这两台电脑的 IP 地址、子网掩码和默认网关。要想两台电脑能够通信,这三项必须配置成为一个网络,可以一个是 192.168.0.1/24,另一个是 192.168.0.2/24,否则是不通的。
两台电脑之间的网络包,包含 MAC 层,要完整。IP 层要封装了 MAC 层才能将包放入物理层。
到此为止,两台电脑已经构成了一个最小的局域网,也即LAN。
怎么把三台电脑连在一起呢?
使用集线器(Hub)。这种设备有多个口,可以将多台电脑连接起来。但是,和交换机不同,集线器没有大脑,它完全在物理层工作。它会将自己收到的每一个字节,都复制到其他端口上去。这是第一层物理层联通的方案。
第二层(数据链路层)
Hub 采取的是广播的模式,如果每一台电脑发出的包,每个电脑都能收到,这样就会很麻烦。需要解决几个问题:
- 这个包是发给谁的?谁应该接收?
- 大家都在发,会不会产生混乱?有没有谁先发、谁后发的规则?
- 如果发送的时候出现了错误,怎么办?
解决的是上面第二个问题
这几个问题,都是第二层,数据链路层,也即 MAC 层要解决的问题。MAC的全称是Medium Access Control,即媒体访问控制。就是控制在往媒体上发数据的时候,谁先发、谁后发的问题。防止发生混乱。这解决的是上面第二个问题。这个问题中的规则,学名叫多路访问。有很多算法可以解决这个问题。比如接下来这三种方式:
方式一:分多个车道。每个车一个车道,你走你的,我走我的。这在计算机网络里叫作信道划分;
方式二:今天单号出行,明天双号出行,轮着来。这在计算机网络里叫作轮流协议;
方式三:不管三七二十一,有事儿先出门,发现特堵,就回去。错过高峰再出。叫作随机接入协议。著名的以太网,用的就是这个方式。
解决的是上面第一个问题
这里用到一个物理地址,叫作链路层地址。但是因为第二层主要解决媒体接入控制的问题,所以它常被称为MAC 地址。
解决这个问题就牵扯到第二层的网络包格式。对于以太网,第二层的最开始,就是目标的 MAC 地址和源的 MAC 地址。
接下来是类型,大部分的类型是 IP 数据包,然后 IP 里面包含 TCP、UDP,以及 HTTP 等,这都是里层封装的事情。
有了目标 MAC 地址,数据包在链路上广播,MAC 的网卡才能发现,这个包是给它的。MAC 的网卡把包收进来,然后打开 IP 包,发现 IP 地址也是自己的,再打开 TCP 包,发现端口是自己,也就是 80,而 nginx 就是监听 80。于是将请求提交给 nginx,nginx 返回一个网页。然后将网页需要发回请求的机器。然后层层封装,最后到 MAC 层。因为来的时候有源 MAC 地址,返回的时候,源 MAC 就变成了目标 MAC,再返给请求的机器。
解决的是上面第三个问题
第二层的最后面是CRC,也就是循环冗余检测。通过 XOR 异或的算法,来计算整个包是否在发送的过程中出现了错误,主要解决发送错误的问题。
ARP 协议
一个广播的网络里面接入了 N 台机器, 我怎么知道每个 MAC 地址是谁呢?这就是ARP 协议, 也就是已知 IP 地址, 求 MAC 地址的协议。
在一个局域网里面,当知道了 IP 地址,不知道 MAC 怎么办呢?靠“吼”。 DHCP也是靠“吼”,新接入一个网络的机器获取分配的IP地址。
发送一个广播包,谁是这个 IP 谁来回答。具体询问和回答的报文如下:
为了避免每次都用 ARP 请求,机器本地也会进行 ARP 缓存。由于机器存在不断上线下线,IP 也可能会变,所以 ARP 的 MAC 地址缓存过一段时间就会过期。
交换机
这种使用HUB组网的方法,对少数电脑没有问题,但是一旦机器数目增多,问题就出现了。Hub 是广播的,不管某个接口是否需要,所有的 Bit 都会被发送出去,然后让主机来判断是不是需要。这种方式路上的车少就没问题,车一多,产生冲突的概率就提高了。而且把不需要的包转发过去,纯属浪费。
二层设备交换机可以很好地解决这个问题,会把 MAC头拿下来, 检查一下目标 MAC 地址, 然后根据策略转发,而不是傻傻地都转发。
交换机通过学习,知道每个口的电脑的 MAC 地址。
交换机学习过程
一台 MAC1 电脑将一个包发送给另一台 MAC2 电脑,当这个包到达交换机的时候,一开始交换机也不知道 MAC2 的电脑在哪个口,所以没办法,它只能将包转发给出了来的那个口之外的其他所有的口。但是,这个时候,交换机会记住,MAC1 是来自一个明确的口。以后有包的目的地址是 MAC1 的,直接发送到这个口就可以了。
转发表
过了一段时间之后,就有了整个网络的一个结构了,这个时候,基本上不用广播了,全部可以准确转发。由于每个机器的 IP 地址会变,所在的口也会变,因而交换机上的学习的结果(转发表),是有一个过期时间的。
小结
第一·, MAC 层是用来解决多路访问的堵车问题的;
第二·, ARP 是通过吼的方式来寻找目标 MAC 地址的, 吼完之后记住一段时间, 这个叫作缓存;
第三, 交换机是有 MAC 地址学习能力的, 学完了它就知道谁在哪儿了, 不用广播了。
参考资料:
趣谈网络协议(极客时间)链接:
http://gk.link/a/106nW
GitHub链接:
https://github.com/lichangke/LeetCode
知乎个人首页:
https://www.zhihu.com/people/lichangke/
个人首页:
https://www.jianshu.com/u/3e95c7555dc7
欢迎大家来一起交流学习