网络的形成-从原始部落到现代化世界

2,867 阅读10分钟

本文正在参与 “网络协议必知必会”征文活动

网络是一个虚拟的东西,它很大意义上不是看的见摸得着的:

  • 从上到下依次包括 应用层、传输层、网络层、链路层、物理层。
  • 本文会沿着相反的方向,依次讲述物理层、链路层和网路层。

物理层

是网线,是光纤,是产生信号传输的介质,是物理介质。

net1.png

  • 计算机通过电路信号交互信息
  • 网线或光纤能产生计算机能识别的01信号

链路层

在物理层中,我们知道

  • 数据以的形式存在于通信介质中
  • 网线是双工的,A可以发送到B,B也可以发送到A,如果A一直发送,那么B就没法工作。

我们需要划分一些规范,让这个简单的网络能正常工作。

数据流和帧

首先是包的拆分,这可以让一个方向的流不会永远占据链路。

按照流发送

net6.png 这里描述的过程是这样的:

  • A先发送
  • B打算发送
  • B检测到碰撞就先等待
  • A要发送的内容特别多,一直没有停下
  • B一直检测到链路是不空闲的,就会等特别长时间

链路帧发送

所以,链路层做了一些事情,如下图: net7.png

  • A网卡将要发送的数据按照MTU拆分为一个帧

  • A先发送一个帧

  • B打算发送,B检测到碰撞就先等待

  • A发送完一个帧后,链路空闲

  • B可以发送

  • A检测到空闲之后继续发送剩余的帧

这样的话,链路层的帧解决了链路独占的问题。

以太网是使用的最广泛的一种链路层的协议。

链路层基本要素

这样,链路层基本要素如下图:

net0.png

  • 假设A给B 传输一段数据:0111001010101

  • 这段数据会被分给为一个个的frame

  • 以太网协议的链路层是现在用的最广泛的链路层协议,规定frame(MTU:最大传输单位)大小是1500字节

  • 如果一次传输的数据超过了MTU,则需要链路层分割再发送到物理层

  • 通用的网卡需要实现以太网协议,包括MTU大小设置 链路层还制定了mac地址的规范, 每一张都网卡有唯一的MAC地址标志

链路层的寻址工具-交换机

一般主机的网卡端口少,能直连的机器非常少,所以引入了交换机。

交换机本身没有MAC地址,存在的目的是帮助帧的转发。

4.png 如上图:

  • 网卡还有唯一的MAC地址标志,MAC地址是48位的
  • 交换机的端口比较多,几十个端口很常见。
  • 交换机可缓存并自动记录端口和对应的主机mac地址的关系

链路层的帧格式

链路层制定了mac地址的规范,可以看到帧格式如下:

ip7.png

  • playload是要发送的数据的内容,这里就是0111001010101,通过 dst mac转发到目的地
  • frame大小不超过MTU

链路层的网络世界构成部落

如下图交换机通过层级结构还能构成更大的网络: net5.png

A发包给C,如果当前连接的交互机没有记录这个mac地址,则会转发给其他所有的交互机,开销很大。

主机的mac地址相当于没有特殊标志的身份证,通过相连的交换机,再遍历整个网络去寻址

所以一个通过交换机相连的子网一般都不会包含太多的机器,它们就相当于一个一个的小部落

IP层

要通过链路层构成大的网络世界有些麻烦,所以网络协议的制定者又开始思考新的方案。

如果想要在很多很多的小部落里面进行通信,路由会变得非常困难,故而产生了IP层。

网络范围扩张

部落-村落

交换机组成的网络世界相当于一个个的小部落,我们人类的发展历史就是网络发展的最好的借鉴

如下图:

ip8.png

  • 多个部落(交换机的网络)构成了更大的村落
  • 村落之间可以通过路牌去识别部落
    • 两位二进制可以表示这四个部落了,分别是00011011

村落-更大区域

然而,网络还在继续发展:

ip9.png

  • 村落渐渐变多,发展成区域
  • 这里的区域同样可以用两位二进制表示包含的各个村落
  • 继续这样扩大范围发展,最终就构成了全世界的网络

IP层次划分

现在网络已经足够大了,然而现实情况的网络比这个更密集更复杂。

住址和行政层级

世界也很大,我们要找到一个人的住址,可以用行政层次来表示:

对于一个人来说,从下到上依次是: 小组-村-乡-镇-县-区-市-省-国家-星球

IP地址

和现实世界不一样的是,我们用IP地址来表示网络地址。IP有32位,这表示全世界最多有4亿个独一无二的IP地址。

上面的行政地址一共划分了10个层次,IP地址虽然没有这么形象,但是也是天然自带层次的。

ip3.png

  • IP的每个数字都是有意义的,某几个位可能就代表兴致意义上的村-县-城市,但是并不需要这么理解
  • mac地址像是身份证号码 (ID card), 这个是没有任何地址标志的
  • 所以通过IP地址就大概知道去某个范围去找对应的主机了

ipv4

如果按照8位一组来划分,则32位的IP分成了4组,所以称为ipv4

ip2.png

上面的地址就是一个ipv4的地址,01101111.01111101.11111011.11110100 也就是111.125.251.244

IP分配

当初制定IP协议规范的时候,规范制定者也对IP地址和网络做了一些划分和分配:

  • A类地址:IP地址的前8位表示网络ID,后24位表示主机ID,除去一些特殊的标记,这样的网络也就200多个,大部分都被分配给了美国的公司团体,但是因为有2^24个地址,里面的主机地址很多都没有用到,造成了很多的浪费
    • 十进制127开头的地址:环回地址,如ping自己127.0.0.1
    • 127.0.0.0:使用这个地址就像称呼自己的‘我’一样。
    • 0.0.0.0表示公共网络本身
  • B类地址:IP地址的前16位表示网络ID,后16位表示主机ID
    • 192.168.0.0: 表示当前的网络
  • C类地址:IP地址的前24位表示网络ID,后8位表示主机ID,网络内可用的主机地址250多个。
  • 全0主机ID的网络:表示网络本身,如IP地址129.152.0.0是指网络ID为129.152的B类网络
  • 全1主机ID的网络:表示广播地址

私有的网络

只是现在全世界的电脑台数应该远远不止4亿,IP地址已经不够用了,再加上上面说到的那些根据网络大小ABC划分导致的浪费,就更是IP告急了。 所以大部分时候,比如在我们国家,很多社区、公司和学校都会用到私有网络的方案。

  • 你家里的网络,你公司的网络,都很有可能是私有的局域网内的地址。

  • 在云上买的服务器,那可能是公有IP地址的。 如下面的图:

ip4.png

私有网络限制case1

因为私有网络限制,里面的主机在上网的时候,往往需要对包多进行一层处理(和公网相比还多了一层转换),如下C1A打开了QQ聊天程序,和学校外面的家人聊天,

ip6.png

  • 发送包的时候,这里内网的出口路由器可能需要将包1封装为包2(加上自己的公网ip和mac地址)
  • 接收包的时候,这里内网的出口路由器需要将包2转为包1,再转发到内网的主机上面去。

私有网络限制case2

有时候需要访问私有的地址,就像访问服务器一样。

比如P2P类型的应用,大家都是网络上的一个节点。

因为处于局域网的原因,所以我们需要用到一些网络反转技术,比如NAT。

ipv6

因为IP告急的原因,后来又制定了ipv6的规范。

这种规范的IP一共128bit,每16位划分,分成了8组。

但是现在ipv6还不是很普及。

路由

上面讲了IP层次的划分,我们可以形象的知道大概通过怎样的方式去找到网络世界上的另外一个主机

在具体实现上,实现了IP层协议的机器都维护了1张路由表,这个路由表表示了自己所能感知的网络世界

可以通过route命令查看主机或者路由器上面的路由表,

# route 
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         9.134.64.1      0.0.0.0         UG    0      0        0 eth1
9.0.0.0         9.134.64.1      255.0.0.0       UG    0      0        0 eth1
9.134.64.0      0.0.0.0         255.255.240.0   U     0      0        0 eth1
10.0.0.0        9.134.64.1      255.0.0.0       UG    0      0        0 eth1
100.64.0.0      9.134.64.1      255.192.0.0     UG    0      0        0 eth1
172.16.0.0      9.134.64.1      255.240.0.0     UG    0      0        0 eth1
192.168.0.0     9.134.64.1      255.255.0.0     UG    0      0        0 eth1
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 docker0

输出结果中各个字段的含义是:

  • Flags是表示路由的标志。可用的标志及其意义是:U表示路由在启动,H表示target是一台主机,G表示使用网关
  • Gateway表示网关使用的主机名或者是IP地址
  • 子网掩码是一个32位地址,用于屏蔽IP地址的一部分以区别网络标识和主机标识,则可说明该IP地址是在局域网上,还是在广域网上
    • 通过Genmask和数据包的IP地址进行按位"&"操作,如果和Destination相同,则转发到这个Destination的网络
  • Destination表示路由的目标网络,我们可以看到这里例子里面有这些网络可达
    • 9.0.0.0:1001000000000000000000000000是一个A类网络,可以包含很多(2^24)的主机地址,通过网关9.134.64.1可达
    • 9.134.64.0:1001100001100100000000000000是一个B类网络,当前机器的IP也位于这个网络
    • 10.0.0.0也是一个A类地址
    • 100.64.0.0也是一个B类地址,也是该网络可直达的
    • 192.168.0.0表示当前局域网
    • 192.168.10.0 表示docker环境的网络
    • 如果其他的规则都不满足,则使用默认的路由,转发到default公网。
      • 0.0.0.0表示公网
      • 路由的选择会按照最长匹配的优先处理,所以会最后处理default,最先处理255.255.255.0这个mask

总结

本文通过从下到上依次描述物理层、链路层和网络IP层,描述了世界上的计算机是怎样连接在一起的。

一步步,一层层,网络从原始的形态渐渐变成了现在这样的现代化的形态。

但是网络具体是怎么寻址的,本文还没有涉及,它对于网络是怎么形成的这个命题来说,是更细节的东西了。 目前已补充了的文章: 路由向量算法为何只能用于小型网络?