协议众多,互相交织,还是换一种风格…
互联网的本质是互联,最简单的大概是几台电脑插上网线一连就完事.那么问题来了,电脑直接怎么区分谁是谁呢?
起到这个作用的网卡的 mac 地址,mac 地址 48 位,6 个子节,每个网卡都不一样.有了地址还不行,还得有个交流的协议吧?总不能你说英语我说土著方言吧.这个协议目前在局域网最多的是以太网协议.
以太网协议有个特点是,网内每个电脑都有个大喇叭,传输数据就喊一声那个谁谁谁(广播)…,其他人都能听到,但是只有被喊道的人才回答.闲的时候还好,忙起来谁都听不见,这里就需要处理这种嘈杂,但是这是另一个话题了.
以太网有个问题,只能适用于同一个广场组网,相聚很远的地方就没办法用了,而且受制于以太网的通信方式,太远的地方效率太低.你能想象纽约时代广场喊话北京天安门,就为了问苹果几毛钱一斤?且不说为了能传到提升功率要覆盖全地球,就是问个价钱让地球人都知道,这一点就不安全.因此在广域网上还需要另外一套协议,这里实际上指的是 ip 协议,常见是ipv4 还有近些年逐渐普及的 ipv6.下文还是 ipv4 为例.
ip 协议的规则很简单,就是给互联网中的每个主机分配一个网络地址,大家按照网络地址互相投递邮件.
先从小的来说,互联网是由众多局域网互联组成的,广域网用的是 ip 协议,局域网用的是以太网,怎么把 ip 协议和以太网统一起来?用到了软件工程最好用的做法–分层.为了统一,我们局域网也用 ip 协议,但是我们把 ip 协议定义在以太网的上一层.具体来说以太网属于互联网分层的链路层,ip 协议是网络层(也称 ip 层).这样 ip 协议统一了,以太网也不需要改动.
ipv4 的地址是 32 个二进制数字,习惯上我们将其分为 4 段,一个典型的 v4 地址: 127.0.0.1
.地址前部分标识网络,后部分标识子网(局域网),但问题就在这个分界点怎么界定?不同规模的局域网需要的分界点也不一样.这里就需要子网掩码,例:如果子网的长度是 8 ,正好是最后一个十进制标识.那其对应的子网掩码是 11111111.11111111.11111111.00000000
十进制 255.225.225.0
.192.168.3.66
和 192.168.3.254
要怎么判断它们是不是一个子网呢?与 子网掩码 255.225.255.0
分别做 AND 运算,结果相同就是同一子网.但是子网掩码有时还是麻烦,就有更加简化的无类别域间路由(CIDR).例子中那段子网就可以表示成: 192.168.3.0/8
.
好,局域网适配 ip 协议改动完了,那还有个问题,局域网通信在链路层(以太网)靠 mac 地址区分计算机.而在网络层(ip 协议)是依靠 ip 地址区分.通常在分层中上层依靠下层实现.那就意味着在局域网中,网络层的 ip 地址应该与链路层的 mac 地址存在关联,这样整个局域网模型才能正常工作.事实也确实如此,起到这个关联的就是 ARP 协议.
想象一个局域网的传输场景,网络层已经知道了目的地的 ip 地址,但是链路层要进行通信,还需要目的地 ip 对应的 mac 地址,这就需要 arp 协议了,主机会向网关发起 arp 请求,包含网关的 ip 地址,广播目的地为 FF:FF:FF:FF,网关会维护一个 ip 地址和 mac 地址的关系表,返回 arp 应答.主机收到了目的地的 mac 地址,正常通信就行了.
来看一下局域网->广域网的过程.一般而言一个局域网里都有一个与广域网连接的入口,称为网关.局域网所有与广域网有关的请求都在网关进出.网关一般有两个 ip 地址,一个广域网的 ip 一个是局域网的 ip ,当局域网的请求发出去比较简单,但是要怎么接收广域网的回复呢?广域网看不到网关背后局域网的成员,这时涉及了 NAT(网址转换协议)
在实际传输中,向外的请求到达网关时,网关会进行源地址转换,将向外请求的 源ip地址替换成网关的广域网ip,使得这些请求可以进入广域网.同时网关会记录并维护一个 NAT 表,标识 内网ip:端口 —外网ip:端口.当收到广域网的回复时,网关又会把这些向内请求的目的地 ip 替换成局域网内的 ip,这样这些请求就能进入局域网内部了.
聊完了局域网,来看一下广域网,首先如果要构建广域网,我们不可能直接将所有不同规模的局域网对等相连.受限于地理和国家因素,首先是较小规模的局域网相连,然后是较大的局域网相连,最后才算这些实体之间互联互通,形成广域网.从上到下一点一点看.
讨论到此需要涉及一个新的概念 AS(自治系统),AS: 维基的定义是一个或多个实体管理下所有 ip 和路由器的组合.在 AS 内执行共同的路由策略.每一个 AS 都有一个唯一编号 ASN,这个编号是在申请建立 AS 时候就确立的,申请 AS 时会分派到对应的 ip地址,不会重复.可以将 AS 理解成广域网上一个大的围城,围城内部执行相同的规则(路由),外界现要访问围城内部,必须经过围城这个边界.
互联网发展早期是一个运行商对应一个 AS,之后随着规模剧增,遍不再有对应的关系,一个 ISP 可能拥有多个 AS,同时不止 ISP 大型的互联网公司为了更快的访问速度也申请了 N 多的 AS 以服务不同地区的客户.广域网就建立在这些 AS 互联互通的基础上.
理想情况下各个 AS 应该对流量一视同仁,拥塞调度路由选择等都交给统一的算法,就像 AS 不存在一样.但是现实并不是美好的,运营商有盈利压力,不同地区网络设施建设费用也千差万别.统一的调度根本是奢望,这也是 AS 存在的意义,AS 之间互联互通遵循 BGP (边界网关协议),AS 可以定义互联的规则,例如可以不让其他 AS 的流量通过等.要注意 BGP 协议仅仅是寻找到比较好的路由而不是最佳的路由.每个 AS 都必须配置 BGP,BGP 使用 tcp 进行通信.
说完了 AS 之间,我们来看看 AS 内部,我们可以把 AS 内部近似看作是平等的,没有流量的歧视.AS 内部最大的问题就是如果在组成 AS 的众多路由中,迅速找到一条最快到目的地的路.AS 内部的路由选择有 RIP(路由信息协议) 和 OSPF(开放式最短路径优先),现在一般都是 OSPF.OSPF 的基本原理是图论中的 Dijkstra 算法.