入门车载以太网(3) -- 网络层
目录
1. 网络通信示例
2. IP地址类别
3. IP数据报
4. 小结
今天继续车载以太网,聊聊网络层。
1. 网络通信示例
我们首先回顾车载以太网的数据传输模型。
从7层开始(车载以太网模糊了5-7层,统称应用层),每个中间层都为上层提供功能,享受其下一层提供的服务。
而网络层位于模型的第3层,负责处理IP数据包在不同网络间的传输、路由、拥塞控制和流量控制,在该层级使用 IP 地址找到最终目的地。
为什么会出现网络层呢?我们假设以下两种网络通信场景:
- 当通信双方出现在同一局域网里,可利用交换机直接使用MAC寻址方式进行通信;
- 当通信双方出现在不同网络时,数据链路层无法直接通信(试想几万台设备通过交换机通信的成本?),因此就需要三层IP地址进寻找目标设备。
我们以Alice和Bob为例,在北京的Alice通过电脑微信客户端向身处上海的Bob的手机发送消息“Hello Bob”,很明显这2个设备没有物理连接,使用多个交换机利用MAC寻址进行数据透传也不现实,那么有没有其他办法呢?路由器就派上了用场,它作为一台拥有独立MAC地址的设备,可以对数据进行转发,承担了网关的作用。
由于MAC地址是设备制造商在出厂生成时固定烧录的,一般来说只要不人为修改,MAC地址就是固定的,就像门牌号一样具备唯一性。如果通过MAC地址想要组建自己的子网,那就必须通知厂商生产时按照你的规划来设置MAC地址,It's totally imTMpossible。
因此在第三层网络层出现了IP地址,常理讲这个地址是逻辑地址,可以自由设置。但我们先把其通信原理讲清楚,再讲IP地址的分类。
首先假设有两个子网段(192.168.0.1\192.168.1.1)(不要纠结怎么来的,先记住它),网段内通过交换机进行数据透传,网段间通过路由器进行数据转发,如下:
ECU0要给ECU1发送数据,整个数据包格式如下:
这种情况下,IP地址没有起到作用,只需要交换机就可发出去。
但如果ECU0要给ECU4发送数据,就需要先把数据发给路由器,再由路由器转发给ECU4;
在ECU0 -> 路由器这一路径下,数据包格式如下:
在路由器 -> ECU4这一路径下,数据包格式如下:
敏锐的你想必已经发现了,在ECU0 -> ECU4这条通路下,变化的只有MAC地址,IP地址始终不变,就好像我给你写信,不管这个信是通过什么交通方式(飞机、火车、汽车)送到你手上,寄信人始终是我,收信人始终是你。
在上述通信过程中,我们深入研究下去,会发现几个问题:
- ECU0是如何知道要把数据丢给路由器?路由器IP地址怎么来的?
既然把数据丢给路由器,那ECU0肯定知道接收节点不在一个网段内,如何判断?这就引入了子网掩码概念,我们假定子网掩码为255.255.255.0,ECU0只需要“与”上掩码,如下:
源IP: 192.168.0.1 & 255.255.255.0 = 192.168.0.0
目标IP:192.168.1.1 & 255.255.255.0 = 192.168.1.0
就可发现目标IP不在一个网段,那就交给路由器处理吧。
路由器每个端口都有MAC地址,哪总得有个IP地址吧,默认网关的概念又出现了。
如上图,①代表路由器端口位于子网段0,IP地址192.168.0.254;②代码路由器端口位于子网段1,IP地址192.168.1.254。
ECU0在首先配置在该网段的默认网关IP地址为192.168.0.254,一旦发现接受方不在同一网段,它就往这个默认网关这个地址发数据。
这是网络层的部分内容,但实际上数据还是得从数据链路层->物理层发送出去,ECU0是如何知道路由器MAC地址的,这又引入了ARP(Address Resolution Protocol),ECU0广播一条ARP请求,各个节点就会带上自己MAC地址响应,通过这种方式最终实现了网段内ARP缓存表完整,如下表:
- 路由器是怎么知道从哪个端口把数据扔给ECU4?
如同交换机有自己的SAT(Source Address Table)一样,路由器要完成数据转发,也要维护自己的路由表,该路由表记录目标网段地址、子网掩码、对应端口或者下一跳。
值得一提的是,子网掩码转为二进制表现形式b11....11000,那么掩码前多少位就表示对应子网的网段,例如子网掩码255.255.255.0前24位用于网段表示,因此,这个路由表一般又按如下格式表示:
路由器从端口3接到ECU0发过的报文,发现目标IP地址处于网段1,查找路由表发现是网段1对应端口6,然后再从ARP中找到IP地址对应的MAC地址,最终在数据链路层重新添加头,经由交换机转发给ECU4。
至此,一个简单的通信示例就完成了,这里面涉及到的概念有子网、子网掩码、默认网关、ARP、路由表,每个概念都可以单独再深挖,这里暂时不表。
2. IP地址类别
在第一小节,我们给每个ECU都分配了IP地址:192.168.1.xxx,这个是怎么来的呢?
这就不得不提到IP协议,IPv4和IPv6。
IPv4规定IP地址长度为32位,因此理论上就可以表示2^32 近42亿个终端设备。为方便记录,IP地址分为了4个8位字段,每个字段用十进制表示,采用点-数记号法,例如100.100.101.111。 一般来说,前3个字段表示网络ID,后1个字段表示设备主机ID。
除此之外,IP地址考虑不同规模网络需求,定义了5类地址空间类别,A至E类,具体如下:
A类地址可用于少量的大型网络,B类地址用于中等规模,C类地址适用小型网络。 根据RFC1918"Address Allocation for Private Internets"规定,IANA还将A、B、C类地址预留一部分作为私有地址(Private Address),具体如下:
- A类:10.0.0.0 -- 10.255.255.255,1个网络--16777216(2^24)个节点
- B类:172.16.0.0 -- 172.32.255.255,16个网络--65534(2^16)个节点
- C类:192.168.0.0 -- 192.168.255.255,256个网络 -- 254个节点
因此,192这个怎么来的就不言而喻了。
3. IP数据报
在了解了IP地址类别之后,我们继续来看看IPv4数据报格式。
首先,在MAC层以太网帧Ethertype用0x0800来表示IPv4类型报文,
IPv4数据报总体如下图所示:
在IP层的数据报每个位域描述如下:
- Version:使用的IP版本号,IPv4 = 4;
- IHL: Internet Header Length,单位DWORD(32bits);
- DSCP:Differentiated Service,Traffic Management;
- ECN:Explicit Congestion Notification,扩展探测丢弃的数据包;
- Total Length:数据和头的总长度;
- ID:一帧报文的不同分片;
- Flag:是否切片,bit1(不分片)、bit2(分片)
- Fragment Offset:分片偏移;
- Time to Live:每次路由减1,如果到0,数据包就丢弃;
- Protocol:第四层的协议;
- Source IP Address:源IP地址
- Options:一般来说,这部分都为空
4.小结
本文主要通过一个简单的网络通信示例,描述了IP地址、MAC地址在通信中各自作用,分析了IPv4的数据结构,算是对网络层有一个初步印象。