机器有了IP,就能在网络和其他机器通信。
物理层
电脑连电脑时,需要配置这俩电脑的IP地址、子网掩码和默认网关。要想两台电脑能够通信,这三项必须配置成为一个网络,可以一个是192.168.0.1/24,另一个是192.168.0.2/24,否则不通。
两台电脑间的网络包,包含MAC层。IP层要封装了MAC层才能将包放入物理层。
至此两台电脑构成最小的局域网 - LAN。
怎么把三台电脑连在一起? 以前有Hub - 集线器。这种设备有多个口,可以连接多台电脑。不同于交换机,集线器没有大脑,完全工作在物理层。它会将自己收到的每一个字节,都复制到其他端口。这是物理层联通的方案。
数据链路层
Hub采取广播模式,若每一台电脑发出的包,局域网内每个电脑都能收到,那就麻烦了。必须解决如下问题(MAC层要解决的):
包发给谁?谁接收?
这里用到一个物理地址 - 链路层地址。但因该层主要解决媒体接入控制,所以常被称为MAC地址。
解决这个问题牵扯该层的网络包格式。 比如以太网,该层的最开始,就是目标MAC地址、源MAC地址。
大部分的类型是IP数据包,然后IP里面包含TCP、UDP,以及HTTP等。
有了目标MAC地址,数据包在链路上广播,MAC的网卡才能发现,这个包是给它的。MAC的网卡接收这个包,然后打开IP包,发现IP地址也是自己的,再打开TCP包,发现端口是自己,也就是80,而nginx就是监听80。
于是将请求提交给nginx,nginx返回一个网页。然后将网页需要发回请求的机器。然后层层封装,最后到MAC层。因为来时有源MAC地址,返回时,源MAC就变成目标MAC,返给请求的机器。
有无发送顺序?
MAC,Medium Access Control,媒体访问控制。就是控制在往媒体上发数据时,谁先发、谁后发。这个规则称为多路访问。比如如下方案:
- 多车道 每个车一个车道,你走你的,我走我的。这叫信道划分
- 今天单号出行,明天双号出行 这叫轮流协议
- 不管啥事,有事儿先出门,发现特堵,就回去。错过高峰再出 这叫随机接入协议,以太网就是这种。
这就解决了媒体接入控制的问题。MAC层就是用来解决多路访问的堵车问题的。
发送时出错,咋办?
对于以太网,该层的最后是CRC,计算整个包是否在发送过程出错。
当源机器知道目标机器,可将目标地址放入包,若不知道呢? 一个广播的网络里面接入了N台机器,如何知道每个MAC地址是谁?即已知IP地址,求MAC地址的协议。
即:在一个局域网里,当知道了IP地址,不知道MAC咋办。
发送一个广播包,谁是这个IP谁来回答。具体询问和回答的报文就像下面这样:
为避免每次都用ARP请求,机器本地也会进行ARP缓存。机器会不断上线下线,IP也可能会变,所以ARP的MAC地址缓存过一段时间会过期。
交换机
Hub是广播的,不管某个接口是否需要,所有Bit都会被发出去,然后让主机自行判断是否需要。 这种方式,当路上车少时没问题,但车一多,产生冲突概率就高了。把不需要的包转发过去,也属于浪费。看来Hub这种一股脑转发的设备是不行的,需要更智能的。因为每个口都只连接一台电脑,这台电脑又不怎么变更IP和MAC地址,只需记住这台电脑的MAC地址,若目标MAC地址不是这台电脑,这口就不用转发了。
所以需要知道目标MAC地址是否就是连接某个口的电脑的MAC地址。这就要一个能把MAC头拿下来,检查目标MAC地址,然后根据策略转发的设备 - 交换机。
交换机怎么知道每个口的电脑的MAC地址?
交换机会学习。
MAC1电脑将一个包发送给MAC2电脑,当这个包到达交换机,一开始交换机也不知道MAC2电脑在哪个口,它只能将包转发给除了来的那个口之外的其他所有的口。 但这时,交换机会记住,MAC1是来自一个明确的口。以后有包的目的地址是MAC1的,直接发送到这个口。
当交换机作为一个关卡一样,过了一段时间之后,就有了整个网络结构。这时,基本不用广播了,全部可准确转发。 每个机器的IP地址会变,所在口也会变,所以交换机的学习结果,称为转发表,有过期时间。