Githubgit
本系列文章旨在向程序员分享一些网络基本知识,让程序员具有基本的网络常识,以便与网络工程师沟通。本系列文章不会涉及如何配置交换机、路由器等网络设备的内容,因此不适合想考CCNA/HCNA证书的人士。程序员
相信全部的程序员都据说过网络分层模型,那咱们说说最常提到的OSI参考模型与TCP/IP模型。github
不少人常说的7层网络就是指OSI参考模型,其模型一共分为7层,自下而上分别是:物理链接层、数据链路层、网络层、传输层、会话层、表现层、应用层。服务器
而TCP/IP模型能够被认为是对OSI参考模型的简化,其一共有4层,自下而上分别是:网络接入层、网际互联层、传输层、应用层。网络
下图对这两种模型作了一个比较:学习
下面简单讲一下2-4层PDU所包含的关键信息(不是全部信息):spa
用于建网的网络设备通常有交换机(Switch)和路由器(Router)。其中交换机工做在OSI模型第二层,因此也被称为二层设备(L2 Device),路由器工做在OSI模型第三层,因此也称为三层设备(L3 Device)。操作系统
回顾上图,L2有一个用途是MAC Addressing,所谓MAC Addressing即MAC寻地,每一块网卡(NIC)都有一个MAC地址,好比在Linux运行ifconfig
可以看到NIC的MAC地址,注意看下面的HWaddr:3d
ens33 Link encap:Ethernet HWaddr 00:0b:29:2b:25:10 inet addr:192.168.1.246 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe2b:2510/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:5253258 errors:0 dropped:0 overruns:0 frame:0 TX packets:6680389 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2384306523 (2.3 GB) TX bytes:9150388800 (9.1 GB)
MAC地址是网卡的物理地址,该地址理论上是全世界惟一的,不过现实生活中只须要保证在同一个LAN(局域网,或称二层网络)中惟一便可。code
交换机是一个工做在L2的设备,即它是依靠MAC地址来使处于同一个LAN中的两个NIC相互通讯的。
交换机是一个有不少端口(Port)的设备,每一个NIC经过网线链接到其中的一个端口,好比PC-1(假设只有一个网卡)链接在Port-一、PC-2(假设只有一个网卡)链接在Port-2。交换机内部会维护一张“MAC地址表”,它存储来MAC地址->Port的对应关系。
交换机在某个端口收到数据后,会查看Frame(上图中Data Link层的PDU)中的目的地MAC地址,而后根据“MAC地址表”找到对应端口,而后将数据转发到这个端口。
可是咱们在现实生活中历来没有使用MAC地址来通讯对不对?咱们都是使用IP来通讯的,好比:ping 192.168.1.20
。这是由于操做系统会使用ARP协议来获知192.168.1.20
的MAC地址,而交换机在此过程当中会学习到这个信息,而且记录到“MAC地址表”中(具体过程本文不作详述)。
关于ARP协议、以及交换机的其余功能细节本文不作详述,读者朋友只需知道交换机是一个二层设备,它维护了一张“MAC地址表”并运用此表让处于同一个二层网络的两个网卡通讯就能够了。
交换机只能让处于同一个二层网络的两个网卡进行通讯,如何让处于不一样二层网络的设备是通讯呢?
答案是使用路由器(Router),路由器是一个三层设备(L3 Device),它的做用是将两个二层网络链接起来,使其可以互相通讯。
下图是一个将两个二层网络链接起来的例子:
在这张图中能够看到有两个子网——192.168.1.0/24和192.168.2.0/24(若是你不知道这是什么,没关系张,咱们会在子网分割章节详细讲解),它们是两个独立的二层网络。路由器1有两个端口,一个端口链接在交换机1上,IP是192.168.1.1;另外一个端口链接在交换机2上,IP是192.168.2.1。
当PC1要和PC3通讯的时候,好比ping 192.168.2.10
,它会发现PC3和本身不在同一个子网中(到底是如何知道的你如今不用关心,咱们会在子网分割章节中详细讲解),那它数据交给路由器1,路由器1它会读取Packet(Network层的PDU)中的目的地IP地址,发现是192.168.2.10,结合其内部的路由表(关于路由表本文不作讲解)决定将其转发到交换机2,交换机2再转发到PC3.
咱们再考虑一个更贴近现实的问题,咱们的电脑是如何访问到baidu.com
的呢?
实际上当访问baidu.com
的时候你的数据是通过多层路由器,最终到达baidu服务器的,以下图:
你也许会问,路由器是一个L3设备,它是经过IP来转发数据的,那它是怎么知道baidu.com
的IP地址呢?实际上路由器并不知道baidu.com
的IP地址,操做系统在发送请求的时候会将baidu.com
转化为IP地址放到Packet中传递给路由器。关于这个咱们会在DNS章节中作详细说明。
实际上这个问题自己存在一个错误的假设,咱们已经知道在同一个二层网络中是直接经过MAC地址来通讯的,在这种状况下咱们是能够得到MAC地址的。但这只是极少的一种状况,由于大部分时候咱们都必须通过路由器才能访问网络的。
咱们再来看这张图:
在列出详细步骤前先补充一个知识:路由器的每一个端口都是一个独立的网卡,有独立的MAC地址。
若是PC1要和PC3通讯,其详细步骤是这样的:
PC1发送数据
路由器1转发数据
因此当PC3收到数据的时候,它收到的Frame已经不是PC1当初发出的Frame了,可是Packet仍是PC1发出的Frame。所以PC3是不可能获取PC1的MAC地址的,它能收到的只是路由器1右侧端口的MAC地址。