ISO七层网络模型
ISO七层网络模型大概作用如下:
- 物理层:物理层主要是用来处理光电信号的,例如网卡,光纤,网线等等,这些都是物理层需要考虑的地方;
- 链路层:由光电信号组成的数据,在数据链路层,被逻辑地划分成一帧一帧地数据以便管理,这一层是数据交换的主要层面,交换的依据是网卡MAC地址,进行数据交换需要定义信号帧格式,就有了以太网,需要在主机间交换数据,就有了交换机和集线器;因此以太网,交换机以及集线器都是这一层要考虑的;
- 网络层:网络层是比数据链路层更高一级的逻辑层,在这一层工作的主要是路由器,路由器是基于IP地址进行跨网链路的计算;
- 传输层:传输层是用来控制网络层的数据传输的,提供了TCP和UDP两种机制来确保数据网络间传输的可靠性,这样写代码的就只需要打开socket套接字,便可以在网络连接的状态下传输数据;
- 表示层:
- 会话层:
- 应用层:应用层是最高协议层,这一层主要是软件自定义的一些协议,如HTTP协议,websocket协议,远层登录SSH协议等;
二层网络和三层网络
上面写的七层网络中,物理层,数据链路层和网络层是低三层网络,其余四层是高三层网络,其中二层网络指的就是数据链路层,三层网络指的就是网络层,这两者使我们需要重点理解的地方。
在数据链路层,物理信号以帧为单位进行组织,而每帧信号都需要一个目标地址和一个源地址,该地址基本上使用的是网卡MAC地址,在一层工作的主要是集线器和交换机,集线器会将所有帧信号投放到各个端口,因此连接端口的主机会收到很多没有意义的数据帧,这将造成集线器和主机之间信道冲突剧烈,因此集线器一般情况下使用较少,而交换机具有MAC地址学习记忆功能,能够准确的将数据帧投放到指定端口,从而大大地提高了数据传输效率;而在L2层,数据只能在一个子网间进行交换,如果要跨子网传输数据,则需要借助L3层的路径规划功能,也就是路由器的工作原理;
假设现有如下网络拓扑图,ABCD四台主机属于10.0.0.0子网,网关指向路由器1的10.0.0.1,EFGH四台主机属于10.0.1.0子网,网关指向路由器2的10.0.1.1;
同一子网通信
先看同一子网内通信情况,A向C发送数据,这种情况下都是ip指定的,假设所有主机,交换机和路由器都刚刚通电,没缓存任何MAC映射和路由表。A在向C发送数据之前,是知道C的ip地址,发现它俩在同一物理子网,于是A试图在物理子网内来寻找C,但是在物理子网内寻址是通过MAC地址的,A并不知道C的MAC地址,于是A发送了一个ARP广播包,ARP广播用的地址是ff:ff:ff:ff:ff:ff,包内容如下:
源MAC | 目标MAC | 源IP | 目标IP |
---|---|---|---|
xx:xx:xx:xx:xx:aa | ff:ff:ff:ff:ff:ff | 10.0.0.2 | 10.0.04 |
交换机收到ARP广播后,首先会学习到主机A是连接到1端口的,然后缓存起来,同时在缓存中查找C的MAC地址,没找到便将这个广播包从所有端口发出去(1端口除外),交换机2收到广播包后,也会在缓存中查找C的MAC地址,没找到同样进行转发,其中B,D主机收到广播包后发现和自己无关便丢弃,而C收到广播后便会进行回应,来告知自己的身份,内容格式如下:
源MAC | 目标MAC | 源IP | 目标IP |
---|---|---|---|
xx:xx:xx:xx:xx:ac | xx:xx:xx:xx:xx:aa | 10.0.0.4 | 10.0.0.2 |
这个对于参与的交换机也是个学习的过程,在过程中记忆了主机A和主机C的ip地址和mac地址,AC找到彼此后,便可以在同一子网内依靠mac地址进行相互通信,格式如下:
源MAC | 目标MAC | 源IP | 目标IP | |
---|---|---|---|---|
C--->A | xx:xx:xx:xx:xx:ac | xx:xx:xx:xx:xx:aa | 10.0.0.4 | 10.0.0.2 |
A--->C | xx:xx:xx:xx:xx:aa | xx:xx:xx:xx:xx:ac | 10.0.0.2 | 10.0.0.4 |
跨物理子网通信
同样假设所有设备都刚刚通电,没有缓存任何信息,这时A向E发送数据,A是知道E的ip地址,发现属于同一网段,同样不知道E的mac地址,于是A同样发送ARP广播包,BCD没有响应,但是路由器1收到广播后,为了避免广播风暴,会把自己的mac地址告诉A,格式如下:
源MAC | 目标MAC | 源IP | 目标IP |
---|---|---|---|
xx:xx:xx:xx:xx:ca | xx:xx:xx:xx:xx:aa | 10.0.0.1 | 10.0.0.2 |
A等待超时后,会知道E不在当前物理子网内,于是会向路由器1发送数据包,路由器收到数据包后,发现没有缓存E的ip地址,于是路由器1开始寻找E的过程。相比较交换机的广播找人,路由器寻址的空间范围更大,很多情况下是整个internet网络,要跨很多网络运营商,因此L3层面路由器的路径寻址计算协议涉及很多,例如:RIP、OSPF、IS-IS、BGP、IGRP等协议。路由器计算路径时,是无法窥探整个互联网的,因此每台路由器都是通过路由算法找到下一跳的最优路径,这些最优路径汇集起来就是完整的寻址路径,换句话说,路由器的转发路径不是一台路由器选出来的,而是很多路由器共同选择出来的最优下一跳地址序列;在这里为了解释原理,假设路由器1直接找到了路由器2。
这样路由器1开始想路由器2发送数据包,路由器2便开始在自己的物理子网内寻找E,进过一次广播后,发现E在自己子网内,于是向前一跳,找到离自己最近的路由器1,反馈自己离E主机最近,最终经过“A->广播->路由器->路由器寻址->找到E主机所在子网”过程的A,便可以和E进行通信了。由于A和E之间经历了多个物理子网,因此需要经历多次L2的转发才能实现数据包的转达,在这个过程中,ip包外包的数据帧中的mac地址是不断变换的。在A-E-A的过程中,数据帧和IP包的地址经历了如下过程(假设A的通信端口是88,而E的是99):
去包:
源MAC | 目标MAC | 源IP | 目标IP | 源端口 | 目的端口 | 用户数据 | 帧尾 | |
---|---|---|---|---|---|---|---|---|
A--->路由1 | xx:xx:xx:xx:xx:aa | xx:xx:xx:xx:xx:ca | 10.0.0.2 | 10.0.0.6 | 88 | 99 | ..... | .... |
路由1--->路由2 | xx:xx:xx:xx:xx:cb | xx:xx:xx:xx:xx:cc | 10.0.0.2 | 10.0.0.6 | 88 | 99 | ... | ..... |
路由2--->E | xx:xx:xx:xx:xx:cd | xx:xx:xx:xx:xx:ae | 10.0.0.2 | 10.0.0.6 | 88 | 99 | ... | ..... |
回包:
源MAC | 目标MAC | 源IP | 目标IP | 源端口 | 目的端口 | 用户数据 | 帧尾 | |
---|---|---|---|---|---|---|---|---|
E--->路由2 | xx:xx:xx:xx:xx:ae | xx:xx:xx:xx:xx:cd | 10.0.0.6 | 10.0.0.2 | 99 | 88 | ... | ..... |
路由2--->路由1 | xx:xx:xx:xx:xx:cc | xx:xx:xx:xx:xx:cb | 10.0.0.6 | 10.0.0.2 | 99 | 88 | ... | ..... |
路由1--->A | xx:xx:xx:xx:xx:ca | xx:xx:xx:xx:xx:aa | 10.0.0.6 | 10.0.0.2 | 99 | 88 | ..... | .... |
数据包在路由1和2中的1,4端口中进行转发时,因为是在设备内部,因此可以直接转发,不用变换帧头,从而提高效率,另外如果A向其他子网的FGH发送数据时,过程基本上一样,只不过不会通过广播寻址,而是直接将数据包发送给路由器出口网关。