网络协议

维基百科1

网际网路协议套组

应用层

传输层

网路层

连结层

网络分层的真实含义是什么?2

  1. 始终想象自己是一个处理网络包的程序:
    • 如何拿到网络包,如何根据规则进行处理,如何发出去;
  2. 始终牢记一个原则:
    • 只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。

对 TCP 协议来说,三次握手也好,重试也好,只要想发出去包,就要有 IP 层和 MAC 层,不然 是发不出去的。

ifconfig

  • Windows
    • ifconfig
  • Linux
    • net-tools
      • ifconfig
    • iproute2
      • ip addr

IP 地址 是一个网卡在网络世界的 通讯地址,相当于我们现实世界的门牌号码。

无类型域间选路(CIDR)

于是有了一个折中的方式叫作无类型域间选路,简称 CIDR。

这种方式打破了原来设计的几类地址的做法,将 32 位的 IP 地址一分为二,前面是网络号,后面是主机号。

10.100.122.2/24,这个 IP 地址中有一个 斜杠,斜杠后面有个数字 24。这种地址表示形式,就是 CIDR。后面 24 的意思是,32 位中,前 24 位是网络号,后 8 位是主机号。

MAC 地址更像是 身份证,是一个唯一的标识。

公有 IP 地址和私有 IP 地址

排队规则(qdisc, queueing discipline)

  • pfifo
    • 不对进入的数据包做任何的处理,数据包采用先入先出的方式通过队列
  • pfifo_fast
    • 三个波段(band)
    • 每个波段里面,使用先进先出规则
    • band 0 的优先级最高

数据包是按照服务类型(Type of Service,TOS)被分配多三个波段(band)里面的。TOS 是 IP 头里 面的一个字段,代表了当前的包是高优先级的,还是低优先级的。

  • IP 是地址,有定位功能
  • MAC 是身份证,无定位功能
  • CIDR 可以用来判断是不是本地人
  • IP 分公有的 IP 和私有的 IP

网络设备的状态标识(net_device flags)

  • UP:网卡处于启动的状态
  • BROADCAST:网卡有广播地址,可以发送广播包
  • MULTICAST:发送多播包
  • LOWER_UP: 网线插着,L1 是启动的
  • MTU (二层 MAC 层)1500:最大传输单元 MTU 为 1500,这是以太网的默认值

DHCP与PXE

如何配置 IP 地址

net-tools

1
2
sudo ifconfig eth1 10.0.0.1/24 
sudo ifconfig eth1 up

iproute2

1
2
sudo ip addr add 10.0.0.1/24 dev eth1
sudo ip link set up eth1

Linux 默认的逻辑是,如果这是一个跨网段的调用,它便不会直接将包发送到网络上,而是企图将包发 送到网关。

配置文件

  1. CIDR(IP地址)
  2. 子网掩码
  3. 广播地址
  4. 网关地址

动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)

  1. DHCP Discover
  2. DHCP Offer
  3. DHCP Request
  4. DHCP Ack

dhcp_protocol3

预启动执行环境(Preboot Execution Environment / PXE)

操作系统启动

  1. BIOS(Basic Input output System)
  2. 读取 MBR(Master Boot Record, 主引导记录)
  3. 启动 GRUB(GRand Unified Bootloader,多重操作系统启动管理器)
  4. GRUB 加载内核,根文件系统 initramfs
  5. 启动内核

从二层到三层

第一层:物理层

最小的局域网(LAN)

2 台电脑相连

  • 网线
    • 水晶头
    • 1,2 收
    • 3,6 发
    • 需要 1和3,2和6 交换位置

集线器 / Hub (广播模式)

  • 多台电脑相连
  • 完全复制

第二层:数据链路层(MAC)层 (Medium Access Control,媒体访问控制)

  1. 信道化分
  2. 轮流协议
  3. 随机接入协议
    • 以太网

第二层的网络包格式

ARP

已知 IP 地址,求 MAC 地址的协议

报文

交换机

  • 转发表
  1. MAC 层是用来解决多路访问的堵车问题的;
  2. ARP 是通过吼的方式来寻找目标 MAC 地址的,吼完之后记住一段时间,这个叫作缓存;
  3. 交换机是有MAC 地址学习能力的,学完了它就知道谁在哪儿了,不用广播了。

交换机与VLAN

拓扑结构

环路问题

STP 协议

在数据结构中,有一个方法叫做 最小生成树。有环的我们常称为 。将图中的环破了,就生成了树。在计算机网络中,生成树的算法叫作 STP,全称 Spanning Tree Protocol

  • Root Bridge,也就是根交换机。这个比较容易理解,可以比喻为“掌门”交换机,是某棵树的老大,是掌门,最大的大哥。
  • Designated Bridges,有的翻译为指定交换机。这个比较难理解,可以想像成一个“小弟”,对于树来说,就是一棵树的树枝。所谓“指定”的意思是,我拜谁做大哥,其他交换机通过这个交换机到达根交换机,也就相当于拜他做了大哥。这里注意是树枝,不是叶子,因为叶子往往是主机。
  • Bridge Protocol Data Units (BPDU) ,网桥协议数据单元。可以比喻为“相互比较实力”的协议。行走江湖,比的就是武功,拼的就是实力。当两个交换机碰见的时候,也就是相连的时候,就需要互相比一比内力了。BPDU 只有掌门能发,已经隶属于某个掌门的交换机只能传达掌门的指示。
  • Priority Vector,优先级向量。可以比喻为实力 (值越小越牛)。实力是啥?就是一组 ID 数目,[Root Bridge ID, Root Path Cost, Bridge ID, and Port ID]。为什么这样设计呢?这是因为要看怎么来比实力。先看 Root Bridge ID。拿出老大的 ID 看看,发现掌门一样,那就是师兄弟;再比 Root Path Cost,也即我距离我的老大的距离,也就是拿和掌门关系比,看同一个门派内谁和老大关系铁;最后比 Bridge ID,比我自己的 ID,拿自己的本事比。

虚拟局域网 (VLAN)

当交换机的数目越来越多的时候,会遭遇环路问题,让网络包迷路,这就需要使用 STP 协议,通过华山论剑比武的方式,将有环路的图变成没有环路的树,从而解决环路问题。

交换机数目多会面临隔离问题,可以通过 VLAN 形成虚拟局域网,从而解决广播问题和安全问题。

ICMP 与 ping

ping 是基于 ICMP 协议工作的(查询报文)。

ICMP 全称 Internet Control Message Protocol,就是互联网控制报文协议。

网络包在异常复杂的网络环境中传输时,常常会遇到各种各样的问题。

查询报文

常用的 ping 就是 查询报文,是一种主动请求,并且获得主动应答的 ICMP 协议。

  • 对 ping 的主动请求,进行网络抓包,称为 ICMP ECHO REQUEST。
  • 主动请求的回复,称为 ICMP ECHO REPLY。

比起原生的 ICMP,这里面多了两个字段:

  • 一个是标识符
  • 另一个是序号

在选项数据中,ping 还会存放发送请求的时间值,来计算往返时间,说明路程的长短。

差错报文

  1. 终点不可达
    • 网络不可达
    • 主机不可达
    • 协议不可达
    • 端口不可达
    • 需要进行分片但设置了不分片位
  2. 源站抑制
    • 让源站放慢发送速度
  3. 时间超时
    • 超过网络包的生存时间还是没到
  4. 路由重定向
    • 让下次发给另一个路由器

差错报文的结构相对复杂一些。除了前面还是 IP,ICMP 的前 8 字节不变,后面则跟上出错的那个 IP 包的 IP 头和 IP 正文的前 8 个字节。

而且这类侦查兵特别恪尽职守,不但自己返回来报信,还把一部分遗物也带回来。

ping:查询报文类型的使用

Traceroute:差错报文类型的使用

traceroute,现代 Linux系统 称为 tracepath,Windows系统称为 tracert,是一种电脑网络工具。它可显示封包在 IP 网络经过的路由器的 IP 地址。

它会使用 ICMP 的规则,故意制造一些能够产生错误的场景。

Traceroute 的第一个作用就是故意设置特殊的 TTL,来追踪去往目的地时沿途经过的路由器。

Traceroute 的参数指向某个目的 IP 地址,它会发送一个 UDP 的数据包。将 TTL 设置成 1,也就是说一旦遇到一个路由器或者一个关卡,就表示它“牺牲”了。

Traceroute 还有一个作用是故意设置不分片,从而确定路径的 MTU。

ICMP 相当于网络世界的侦察兵。

两种类型的 ICMP 报文,一种是主动探查的查询报文,一种异常报告的差错报文

  1. ping 使用查询报文
  2. Traceroute 使用差错报文

网关

出入门

路由器会有内网网口和外网网口。

配置网卡

当然 DHCP 是可以默认配置的。在进行网卡配置的时候,除了 IP 地址,还需要配置一个 Gateway 的东西,这个就是 网关

MAC 头和 IP 头

MAC 头

  1. 目标 MAC 地址
  2. 源 MAC 地址
  3. 协议类型
    1. IP 协议
      IP 头
  4. 版本号: IPv4
  5. 服务类型 TOS (Type of Service)
  6. TTL
  7. 协议
    1. TCP
    2. UDP
  8. 源 IP
  9. 目标 IP
    1. CIDR 和子网掩码
    2. 判断是否在同一网段
      1. 同一个网段
        1. 通过 ARP 获得 MAC 地址
      2. 不是同一网段
        1. 需要发往默认网关 Gateway

网关往往是一个 路由器,是一个 三层 转发的设备。

一个路由器往往有多个网口,如果是一台服务器做这个事情,则就有多个网卡,其中一个网卡是和源 IP 同网段的。

很多情况下,人们把网关就叫作路由器。

其实不完全准确。

路由器是一台设备。

静态路由

MAC 地址是一个局域网内才有效的地址。

因而,MAC 地址只要过网关,就必定会改变,因为已经换了局域网。

两者主要的区别在于 IP 地址是否改变。

  • 不改变 IP 地址的网关,称为 转发网关

“欧洲十国游”型

  • 改变 IP 地址的网关,称为 NAT 网关

Network Address Translation 地址转换,简称 NAT。
网络地址端口转换NAPT(Network Address Port Translation)有端口号。

“玄奘西行”型

Source Network Address Translation 源地址转换,简称 SNAT。
Destination Network Address Translation 目标地址转换,简称 SNAT。

路由表

  1. 如果离开本局域网,就需要经过网关,网关是路由器的一个网口;
  2. 路由器是一个三层设备,里面有如何寻找下一跳的规则;
  3. 经过路由器之后 MAC 头要变,如果 IP 不变,相当于不换护照的欧洲旅游,如果 IP 变,相当于换护照的玄奘西行。

动态路由

  • 距离矢量路由算法

第一大类的算法称为距离矢量路由(distance vector routing)。它是基于 Bellman-Ford 算法的。

这种算法的基本思路是,每个路由器都保存一个路由表,包含多行,每行对应网络中的一个路由器,每

一行包含两部分信息,一个是要到目标路由器,从那条线出去,另一个是到目标路由器的距离。

  • 链路状态路由算法

第二大类算法是链路状态路由(link state routing),基于 Dijkstra 算法。

这种算法的基本思路是:当一个路由器启动的时候,首先是发现邻居,向邻居 say hello,邻居都回复。

然后计算和邻居的距离,发送一个 echo,要求马上返回,除以二就是距离。然后将自己和邻居之间的链

路状态包广播出去,发送到整个网络的每个路由器。这样每个路由器都能够收到它和邻居之间的关系的信息。

每个路由器都能在自己本地构建一个完整的图,然后针对这个图使用 Dijkstra 算法,找到

两点之间的最短路径。

动态路由协议

  • 基于链路状态路由算法的 OSPF
    OSPF(Open Shortest Path First,开放式最短路径优先)就是这样一个基于链路状态路由协议,广泛

应用在数据中心中的协议。由于主要用在数据中心内部,用于路由决策,因而称为内部网关协议

(Interior Gateway Protocol,简称IGP)。

  • 基于距离矢量路由算法的 BGP

但是外网的路由协议,也即国家之间的,又有所不同。我们称为外网路由协议(Border Gateway Protocol,简称BGP)。

在一个国家内部,有路当然选近的走。但是国家之间,不光远近的问题,还有政策的问题。

路由分静态路由和动态路由,静态路由可以配置复杂的策略路由,控制转发策略;

动态路由主流算法有两种,距离矢量算法和链路状态算法。基于两种算法产生两种协议,BGP 协议和 OSPF 协议。

最重要的传输层

MAC 层定义本地局域网传输。
IP 层定义了整个网络端到端的传输行为

这两层基本定义了这样的基因

网络传输是以包为单位的,二层叫帧,网络层叫包,传输层叫段。 我们笼统地称为包。

包单独传输,自行选路,在不同的设备封装解封装,不保证到达。基于这个基因, 生下来的孩子 UDP 完全继承了这些特性,几乎没有自己的思想。

UDP

UDP 包头

UDP 的三大特点:

  1. 沟通简单
  2. 轻信他人
  3. 愣头青,做事不懂权变

UDP 的三大使用场景

  1. 需要资源少,在网络情况比较好的内网,或者对于丢包不敏感的应用。
  2. 不需要一对一沟通,建立连接,而是可以广播的应用。
  3. 需要处理速度快,时延低,可以容忍少数丢包,但是要求即便网络拥塞,也毫不退缩,一往无前的时候。

基于 UDP 定制化的五个例子

  1. 网页或者 APP 的访问
    1. QUIC(全称Quick UDP Internet Connections,快速 UDP 互联网连接)是 Google 提出的一种基于 UDP 改进的通信协议,其目的是降低网络通信的延迟,提供更好的用户互动体验。
  2. 流媒体的协议
  3. 实时游戏
  4. IoT 物联网
  5. 移动通信领域

如果将 TCP 比作成熟的社会人,UDP 则是头脑简单的小朋友。TCP 复杂,UDP 简单;
TCP 维护连接,UDP 谁都相信;
TCP 会坚持知进退;UDP 愣头青一个,勇往直前;
UDP 虽然简单,但它有简单的用法。它可以用在环境简单、需要多播、应用层自己控制传输的地方。例如 DHCP、VXLAN、QUIC 等。

TCP

TCP 包头格式

  • 顺序问题,稳重不乱;
  • 丢包问题,承诺靠谱;
  • 连接维护,有始有终;
  • 流量控制,把握分寸;
  • 拥塞控制,知进知退。

TCP 的三次握手

SYN (Synchronize Sequence Number,同步序列编号)
ACK (Acknokedgement)用于回复
RST (Reset)

TCP 四次挥手

FIN (finish)

TCP 状态机

TCP 包头很复杂,但是主要关注五个问题,顺序问题,丢包问题,连接维护,流量控制,拥塞控制;

连接的建立是经过三次握手,断开的时候四次挥手。

顺序问题、丢包问题、流量控制都是通过滑动窗口来解决的,这其实就相当于你领导和你的工作备忘 录,布置过的工作要有编号,干完了有反馈,活不能派太多,也不能太少;

拥塞控制是通过拥塞窗口来解决的,相当于往管道里面倒水,快了容易溢出,慢了浪费带宽,要摸着 石头过河,找到最优值。

Socket

Socket 这个名字很有意思,可以作插口或者插槽讲。虽然我们是写软件程序,但是你可以想象为弄一根

网线,一头插在客户端,一头插在服务端,然后进行通信。所以在通信之前,双方都要建立一个 Socket。

Socket 函数需要指定到底是 IPv4 还是 IPv6,分别对应设置为 AF_INET 和 AF_INET6。

另外,还要指定到底是 TCP 还是 UDP。还记得咱们前面讲过的,TCP 协议是基于数据流的,所以设置为 SOCK_STREAM,而 UDP 是基于数据报的,因而设置为 SOCK_DGRAM。

基于 TCP 协议的 Socket 程序函数调用过程

TCP 的 Socket 就是一个文件流,是非常准确的。因为,Socket 在 Linux 中就是以文件的形式存在的。

除此之外,还存在文件描述符。写入和读出,也是通过文件描述符。

文件描述符是一个整数,是这个数组的下标。

基于 UDP 协议的 Socket 程序函数调用过程

服务器如何接更多的项目?

系统会用一个四元组来标识一个 TCP 连接。

{本机 IP, 本机端口, 对端 IP, 对端端口}

  • 多进程

  • 多线程

  • IO 多路复用,一个线程维护多个 Socket
  • IO 多路复用,从“派人盯着”到“有事通知” epoll

epoll 被称为解决C10K 问题的利器。

记住 TCP 和 UDP 的 Socket 的编程中,客户端和服务端都需要调用哪些函数;

写一个能够支撑大量连接的高并发的服务端不容易,需要多进程、多线程,而 epoll 机制能解决。

最常用的应用层

HTTP 协议

HTTP 的报文大概分为三大部分。

  1. 请求行
    1. GET 获取 R
    2. POST 创建 C
    3. PUT 修改 U
    4. DELETE 删除 D
  2. 请求的首部
    1. Accept-Charset:客户端可以接受的字符集
    2. Content-Type:正文的格式
  3. 请求的正文实体

HTTP 2.0

QUIC 协议

机制一:自定义连接机制
机制二:自定义重传机制

机制三:无阻塞的多路复用
机制四:自定义流量控制

HTTP 协议虽然很常用,也很复杂,重点记住 GET、POST、 PUT、DELETE 这几个方法,以及重要的首部字段;

HTTP 2.0 通过头压缩、分帧、二进制编码、多路复用等技术提升性能;

QUIC 协议通过基于 UDP 自定义的类似 TCP 的连接、重试、多路复用、流量控制技术,进一步提升性能。

HTTPS协议

加密

  1. 对称加密
  2. 非对称加密

这个证书是怎么生成的呢?会不会有人假冒权威机构颁发证书呢?就像有假身份证、假户口本一样。

生成证书需要发起一个证书请求,然后将这个请求发给一个权威机构去认证,这个权威机构我们称为 CA( Certifcate Authority)。

流媒体协议

压缩

  1. 空间冗余
  2. 时间冗余
  3. 视觉冗余
  4. 编码冗余

视频编码的两大流派

  1. ITU(International Telecommunications Union)的 VECG(Video Coding Experts Group),这个称为国际电联下的 VECG。
    • H.261、 H.262、H.263、H.264、H.265
  2. ISO(International Standards Organization)的 MPEG(Moving Picture Experts Group),这个是ISO 旗下的 MPEG,本来是做视频存储的。例如,编码后保存在 VCD 和 DVD 中。当然后来也慢慢侧重视频传输了。
    • MPEG-1、MPEG-2、MPEG-4、MPEG-7

ITU-T(国际电信联盟电信标准化部门,ITU Telecommunication Standardization Sector)与 MPEG 联合制定了 H.264/MPEG-4 AVC

编码:如何将丰富多彩的图片变成二进制流?

I 帧,也称关键帧。里面是完整的图片,只需要本帧数据,就可以完成解码。

P 帧,前向预测编码帧。P 帧表示的是这一帧跟之前的一个关键帧(或 P 帧)的差别,解码时需要用之前缓存的画面,叠加上和本帧定义的差别,生成最终画面。

B 帧,双向预测内插编码帧。B 帧记录的是本帧与前后帧的差别。要解码 B 帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的数据与本帧数据的叠加,取得最终的画面。

可以看出,I 帧最完整,B 帧压缩率最高,而压缩后帧的序列,应该是在 IBBP 的间隔出现的。这就是通过时序进行编码。

在一帧中,分成多个片,每个片中分成多个宏块,每个宏块分成多个子块,这样将一张大的图分解成一个个小块,可以方便进行空间上的编码。

尽管时空非常立体的组成了一个序列,但是总归还是要压缩成一个二进制流。这个流是有结构的,是一个个的网络提取层单元(NALU,Network Abstraction Layer Unit)。变成这种格式就是为了传输,因为网络上的传输,默认的是一个个的包,因而这里也就分成了一个个的单元。

每一个 NALU 首先是一个起始标识符,用于标识 NALU 之间的间隔;然后是 NALU 的头,里面主要配置了 NALU 的类型;最终 Payload 里面是 NALU 承载的数据。

在 NALU 头里面,主要的内容是类型 NAL Type。

0x07 表示 SPS,是序列参数集, 包括一个图像序列的所有信息,如图像尺寸、视频格式等。

0x08 表示 PPS,是图像参数集,包括一个图像的所有分片的所有相关信息,包括图像类型、序列号等。

推流:如何把数据流打包传输到对端?

RTMP 是基于 TCP 的,因而肯定需要双方建立一个 TCP 的连接。

在有 TCP 的连接的基础上,还需要建立一个 RTMP 的连接,也即在程序里面,你需要调用 RTMP 类库的 Connect 函数,显示创建一个连接。

一开始双方就要知道对方的时间戳。

未来沟通这些事情,需要发送六条消息:客户端发送 C0、C1、 C2,服务器发送 S0、 S1、 S2。

RTMP Packet 包 Message 的格式

流媒体服务器,整个过程就

分发网络

客户端通过 RTMP 拉流的过程

视频名词比较多,编码两大流派达成了一致,都是通过时间、空间的各种算法来压缩数据;

压缩好的数据,为了传输组成一系列 NALU,按照帧和片依次排列;

排列好的 NALU,在网络传输的时候,要按照 RTMP 包的格式进行包装,RTMP 的包会拆分成

Chunk 进行传输;

推送到流媒体集群的视频流经过转码和分发,可以被客户端通过 RTMP 协议拉取,然后组合为

NALU,解码成视频格式进行播放。

P2P协议

下载

  1. HTTP
  2. FTP 文件传输协议
    1. 主动模式(PORT)
    2. 被动模式(PASV
  3. P2P (peer-to-peer)

种子(.torrent)文件

  1. announce(tracker URL)
  2. 文件信息
    1. info 区
    2. Name 字段
    3. 每个段的大小
    4. 段哈希值

去中心化网络(DHT)

DHT 网络是如何查找朋友的?

下载一个文件可以使用 HTTP 或 FTP,这两种都是集中下载的方式,而 P2P 则换了一种思路,采取非中心化下载的方式;

P2P 也是有两种,一种是依赖于 tracker 的,也即元数据集中,文件数据分散;另一种是基于分布式的哈希算法,元数据和文件数据全部分散。

陌生的数据中心

DNS协议

DNS(Domain Name System,域名系统)_协议(DNS)是一种分布式网络目录服务,主要用于域名与 IP 地址的相互转换,以及控制因特网的电子邮件的发送。

  1. 根 DNS 服务器 :返回顶级域 DNS 服务器的 IP 地址
  2. 顶级域 DNS 服务器:返回权威 DNS 服务器的 IP 地址
  3. 权威 DNS 服务器 :返回相应主机的 IP 地址

DNS 解析流程

负载均衡

DNS 是网络世界的地址簿,可以通过域名查地址,因为域名服务器是按照树状结构组织的,因而域名查找是使用递归的方法,并通过缓存的方式增强性能;

在域名和 IP 的映射过程中,给了应用基于域名做负载均衡的机会,可以是简单的负载均衡,也可以根据地址和运营商做全局的负载均衡。

HTTPDNS

HTTPDNS 服务器的工作模式

HTTPDNS 服务器的调度设计

CDN

Content Delivery Network,即内容分发网络。

分布在各个地方的各个数据中心的节点,就称为 边缘节点

  1. 根据用户 IP 地址,判断哪一台服务器距用户最近;
  2. 用户所处的运营商;
  3. 根据用户所请求的 URL 中携带的内容名称,判断哪一台服务器上有用户所需的内容;
  4. 查询各个服务器当前的负载情况,判断哪一台服务器尚有服务能力。

接入层缓存的架构

防盗链

  1. refer 机制
  2. 时间戳防盗链

CDN 和电商系统的分布式仓储系统一样,分为中心节点、区域节点、边缘节点,而数据缓存在离用户最近的位置。

CDN 最擅长的是缓存静态数据,除此之外还可以缓存流媒体数据,这时候要注意使用防盗链。它也支持动态数据的缓存,一种是边缘计算的生鲜超市模式,另一种是链路优化的冷链运输模式。

数据中心

数据中心分为三层。

服务器连接到接入层,然后是汇聚层,再然后是核心层,最外面是边界路由器和安全设备。

数据中心的所有链路都需要高可用性。服务器需要绑定网卡,交换机需要堆叠,三层设备可以通过等价路由,二层设备可以通过TRILL协议。

随着云和大数据的发展,东西流量相对于南北流量越来越重要,因而演化为叶脊网络结构。

VPN

VPN,全名 Virtual Private Network,虚拟专用网,就是利用开放的公众网络,建立专用数据传输通道,将远程的分支机构、移动办公人员等连接起来。

VPN是如何工作的?

VPN通过隧道技术在公众网络上仿真一条点到点的专线,是通过利用一种协议来传输另外一种协议的技术,这里面涉及三种协议:乘客协议、隧道协议和承载协议。

我们以 IPsec 协议为例来说明。

一种十分安全的VPN,IPsec VPN。这是基于IP协议的安全隧道协议,为了保证在公网上面信息的安全,因而采取了一定的机制保证安全性。

  • 机制一:私密性
  • 机制二:完整性
  • 机制三:真实性

协议簇

  • 两种协议的区别在于封装网络包的格式不一样
    • AH(Authentication Header),只能进行数据摘要 ,不能实现数据加密。
    • ESP(Encapsulating Security Payload),能够进行数据加密和数据摘要
  • 两类算法
    • 加密算法
    • 摘要算法
  • 两大组件
    • 用于VPN的双方要进行对称密钥的交换的IKE组件
    • VPN的双方要对连接进行维护的SA(Security Association)组件

IPsec VPN的建立过程

  1. 第一个阶段,建立IKE自己的SA
  2. 建立IPsec SA

比较

  • IP 协议:
    • 不是面向连接的,是尽力而为的协议,每个 IP 包自由选择路径,依赖于上一层 TCP 的重发来保证可靠性
    • 优点:一条道路崩溃时,可以自动换其他路
    • 缺点:不断的路由查找,效率低下
  • IPSec VPN 的缺点:
    • 由于 IPSec VPN 是基于 IP 协议的,所以速度慢
  • ATM 协议:
    • 这种协议是面向连接的,并且和 IP 是同一个层次,ATM 是在传输之前先建立一个连接,形成一个虚拟的通路
    • 优点:速度快,因为按照指定路径传输
    • 缺点:当某个节点故障,连接就会中断,无法传输数据
  • 多协议标签交换「MPLS,Multi-Protocol Label Switching」
    • 结合了 IP 和 ATM 协议的优点
    • 需要标签交换路由器「LSR,Label Switching Router」的支持
    • 如何动态生成标签 LDP「Label Distribution Protocol」
  • 将 MPLS 和 VPN 结合起来可以提高 VPN 的效率
    • 需要解决的问题有:
      • BGP 协议如何处理地址空间重叠的 VPN 的路由
      • 路由表怎么区分重复的网段

IPsec VPN的协议簇

VPN可以将一个机构的多个数据中心通过隧道的方式连接起来,让机构感觉在一个数据中心里面,就像自驾游通过琼州海峡一样;

完全基于软件的 IPsec VPN 可以保证私密性、完整性、真实性、简单便宜,但是性能稍微差一些;

MPLS-VPN 综合和IP转发模式和 ATM 的标签转发模式的优势,性能较好,但是需要从运营商购买。

移动网络

  • 2G:txt
  • 3G:jpg
  • 4G:avi

2G 网络

手机是通过收发无线信号来通信的,专业名称是 Mobile Station,简称 MS,需要嵌入 SIM

手机是客户端,而无线信号的服务端,就是基站子系统(BSS,Base Station SubsystemBSS)。

基站子系统分两部分

  • 一部分对外提供无线通信,叫作基站收发信台(BTS,Base Transceiver Station)
  • 另一部分对内连接有线网络,叫作基站控制器(BSC,Base Station Controller)

基站收发信台通过无线收到数据后,转发给基站控制器。

这部分属于无线的部分,统称为无线接入网(RAN,Radio Access Network)。

基站控制器通过有线网络,连接到提供手机业务的运营商的数据中心,这部分称为核心网(CN,Core Network)。

核心网还没有真的进入互联网,这部分还是主要提供手机业务,是手机业务的有线部分。

首先接待基站来的数据的是移动业务交换中心(MSC,Mobile Service Switching Center),它是进入核心网的入口,但是它不会让你直接连接到互联网上。

因而2G时代的上网如图所示,我们总结一下,有这几个核心点:

  • 手机通过无线信号连接基站;
  • 基站一面朝前接无线,一面朝后接核心网;
  • 核心网一面朝前接到基站请求,一是判断你是否合法,二是判断你是不是本地号,还有没有钱,一面通过网关连接电话网络。

2.5G 网络

后来从2G到了2.5G,也即在原来电路交换的基础上,加入了分组交换业务,支持Packet的转发,从而支持IP网络。 在上述网络的基础上,基站一面朝前接无线,一面朝后接核心网。在朝后的组件中,多了一个分组控制单元(PCU,Packet Control Unit),用以提供分组交换通道。 在核心网里面,有个朝前的接待员(SGSN,Service GPRS Supported Node)和朝后连接IP网络的网关型GPRS支持节点(GGSN,Gateway GPRS Supported Node)。

3G 网络

到了3G时代,主要是无线通信技术有了改进,大大增加了无线的带宽。

以W-CDMA为例,理论最高2M的下行速度,因而基站改变了,一面朝外的是Node B,一面朝内连接核心网的是无线网络控制器(RNC,Radio Network Controller)。核心网以及连接的IP网 络没有什么变化。

4G 网络

然后就到了今天的 4G网络,基站为 eNodeB,包含了原来Node B 和 RNC 的功能,下行速度向百兆级别迈进。另外,核心网实现了控制面和数据面的分离,这个怎么理解呢?

在前面的核心网里面,有接待员 MSC 或者 SGSN,你会发现检查是否合法是它负责,转发数据也是它负责,也即控制面和数据面是合二为一的,这样灵活性比较差,因为控制面主要是指令,多是 小包,往往需要高的及时性;数据面主要是流量,多是大包,往往需要吞吐量。

于是有了下面这个架构。

HSS 用于存储用户签约信息的数据库,其实就是你这个号码归属地是哪里的,以及一些认证信息。

MME 是核心控制网元,是控制面的核心,当手机通过 eNodeB 连上的时候,MME 会根据 HSS 的信息,判断你是否合法。如果允许连上来,MME 不负责具体的数据的流量,而是MME会选择数据 面的 SGW 和 PGW ,然后告诉 eNodeB,我允许你连上来了,你连接它们吧。

于是手机直接通过 eNodeB 连接 SGW ,连上核心网, SGW 相当于数据面的接待员,并通过 PGW 连到 IP网络。 PGW 就是出口网关。在出口网关,有一个组件 PCRF,称为策略和计费控制单元,用 来控制上网策略和流量的计费。

4G 网络协议解析

我们来仔细看一下4G网络的协议,真的非常复杂。我们将几个关键组件放大来看。

控制面协议

其中虚线部分是控制面的协议。当一个手机想上网的时候,先要连接 eNodeB,并通过 S1-MME 接口,请求 MME 对这个手机进行认证和鉴权。

S1-MME 协议栈如下图所示。

UE就是你的手机,eNodeB还是两面派,朝前对接无线网络,朝后对接核心网络,在控制面对接的是MME。

eNodeB和MME之间的连接就是很正常的IP网络,但是这里面在IP层之上,却既不是TCP,也不是UDP,而是SCTP。这也是传输层的协议,也是面向连接的,但是更加适合移动网络。 它继承了 TCP 较为完善的拥塞控制并改进TCP的一些不足之处。

  • SCTP 的第一个特点是 多宿主

一台机器可以有多个网卡,而对于TCP连接来讲,虽然服务端可以监听0.0.0.0,也就是从哪个网卡来的连接都能接受,但是一旦建立了连接,就建立了四元组,也就选定了某个网卡。

SCTP 引入了联合(association)的概念,将多个接口、多条路径放到一个联合中来。当检测到一条路径失效时,协议就会通过另外一条路径来发送通信数据。应用程序甚至都不必知道发生了故障、恢复,从而提供更高的可用性和可靠性。

  • SCTP 的第二个特点是将一个联合分成多个流。

一个联合中的所有流都是独立的,但均与该联合相关。每个流都给定了一个流编号,它被编码到 SCTP 报文中,通过联合在网络上传送。在 TCP 的机制中,由于强制顺序,导致前一个不到达,后一个就得等待,SCTP 的多个流不会相互阻塞。

  • SCTP 的第三个特点是四次握手,防止 SYN 攻击。

在TCP中是三次握手,当服务端收到客户的 SYN 之后,返回一个SYN-ACK 之前,就建立数据结构,并记录下状态,等待客户端发送 ACK 的 ACK。当恶意客户端使用虚假的源地址来伪造大量SYN报文时,服务端需要分配大量的资源,最终耗尽资源,无法处理新的请求。

SCTP 可以通过四次握手引入 Cookie 的概念,来有效地防止这种攻击的产生。在 SCTP 中,客户机使用一个INIT报文发起一个连接。服务器使用一个 INIT-ACK 报文进行响应,其中就包括了 Cookie。

然后客户端就使用一个 COOKIE-ECHO 报文进行响应,其中包含了服务器所发送的 Cookie。这个时候,服务器为这个连接分配资源,并通过向客户机发送一个COOKIE-ACK报文对其进行响应。

  • SCTP 的第四个特点是将消息分帧。

TCP 是面向流的,也即发送的数据没头没尾,没有明显的界限。这对于发送数据没有问题,但是对于发送一个个消息类型的数据,就不太方便。有可能客户端写入10个字节,然后再写入20个字节。服务端不是读出10个字节的一个消息,再读出20个字节的一个消息,而有可能读入25个字节,再读入5个字节,需要业务层去组合成消息。

SCTP 借鉴了 UDP 的机制,在数据传输中提供了消息分帧功能。当一端对一个套接字执行写操作时,可确保对等端读出的数据大小与此相同。

  • SCTP 的第五个特点是断开连接是三次挥手。

在 TCP 里面,断开连接是四次挥手,允许另一端处于半关闭的状态。SCTP 选择放弃这种状态,当一端关闭自己的套接字时,对等的两端全部需要关闭,将来任何一端都不允许再进行数据的移动了。

当MME通过认证鉴权,同意这个手机上网的时候,需要建立一个数据面的数据通路。建立通路的过程还是控制面的事情,因而使用的是控制面的协议 GTP-C。

建设的数据通路分两段路,其实是两个隧道。一段是从 eNodeB 到 SGW ,这个数据通路由 MME 通过 S1-MME 协议告诉 eNodeB,它是隧道的一端,通过 S11 告诉 SGW ,它是隧道的另一端。第二端是从 SGW 到 PGW , SGW 通过 S11 协议知道自己是其中一端,并主动通过S5协议,告诉 PGW 它是隧道的另一端。

GTP-C 协议是基于 UDP 的,这是 UDP 中的一个例子。如果看GTP头,我们可以看到,这里面有隧道的ID,还有序列号。

通过序列号,不用TCP,GTP-C自己就可以实现可靠性,为每个输出信令消息分配一个依次递增的序列号,以确保信令消息的按序传递,并便于检测重复包。对于每个输出信令消息启动定时器, 在定时器超时前未接收到响应消息则进行重发。

数据面协议

当两个隧道都打通,接在一起的时候, PGW 会给手机分配一个 IP地址,这个 IP地址是隧道内部的 IP地址,可以类比为IPsec协议里面的 IP地址。这个IP地址是归手机运营商管理的。然后,手机可 以使用这个 IP地址,连接 eNodeB,从 eNodeB 经过 S1-U协议,通过第一段隧道到达 SGW ,再从 SGW 经过 S8协议,通过第二段隧道到达 PGW ,然后通过 PGW 连接到互联网。

数据面的协议都是通过 GTP-U,如图所示。

手机每发出的一个包,都由 GTP-U 隧道协议封装起来,格式如下。

和 IPsec 协议很类似,分为乘客协议、隧道协议、承载协议。其中乘客协议是手机发出来的包,IP 是手机的 IP,隧道协议里面有隧道 ID,不同的手机上线会建立不同的隧道,因而需要隧道ID来标 识。承载协议的 IP 地址是 SGW 和 PGW 的IP地址。

手机上网流程

接下来,我们来看一个手机开机之后上网的流程,这个过程称为 Attach。可以看出来,移动网络还是很复杂的。因为这个过程要建立很多的隧道,分配很多的隧道ID,所以我画了一个图来详细 说明这个过程。

  1. 手机开机以后,在附近寻找基站eNodeB,找到后给eNodeB发送 Attach Request,说“我来啦,我要上网”。
  2. eNodeB 将请求发给MME,说“有个手机要上网”。
  3. MME 去请求手机,一是认证,二是鉴权,还会请求HSS看看有没有钱,看看是在哪里上网。
  4. 当 MME 通过了手机的认证之后,开始分配隧道,先告诉 SGW ,说要创建一个会话(Create Session)。在这里面,会给 SGW 分配一个隧道 ID t1,并且请求 SGW 给自己也分配一个隧道ID。
  5. SGW 转头向 PGW 请求建立一个会话,为 PGW 的控制面分配一个隧道ID t2,也给 PGW 的数据面分配一个隧道ID t3,并且请求 PGW 给自己的控制面和数据面分配隧道ID。
  6. PGW 回复 SGW 说“创建会话成功”,使用自己的控制面隧道ID t2,回复里面携带着给 SGW 控制面分配的隧道ID t4和控制面的隧道 ID t5,至此 SGW 和 PGW 直接的隧道建设完成。双方请求 对方,都要带着对方给自己分配的隧道ID,从而标志是这个手机的请求。
  7. 接下来 SGW 回复MME说“创建会话成功”,使用自己的隧道ID t1 访问 MME,回复里面有给MME分配隧道 ID t6,也有 SGW 给 eNodeB 分配的隧道 ID t7。
  8. 当MME发现后面的隧道都建设成功之后,就告诉eNodeB,“后面的隧道已经建设完毕, SGW 给你分配的隧道ID是t7,你可以开始连上来了,但是你也要给 SGW 分配一个隧道ID”。
  9. eNodeB 告诉MME自己给 SGW 分配一个隧道,ID为t8。
  10. MME 将 eNodeB 给 SGW 分配的隧道 ID t8 告知 SGW ,从而前面的隧道也建设完毕。

这样,手机就可以通过建立的隧道成功上网了。

异地上网问题

接下来我们考虑异地上网的事情。 为什么要分 SGW 和 PGW 呢,一个GW不可以吗? SGW 是你本地的运营商的设备,而 PGW 是你所属的运营商的设备。

如果你在巴塞罗那,一下飞机,手机开机,周围搜寻到的肯定是巴塞罗那的eNodeB。通过MME去查寻国内运营商的HSS,看你是否合法,是否还有钱。

如果允许上网,你的手机和巴塞罗那的 SGW 会建立一个隧道,然后巴塞罗那的 SGW 和国内运营商的 PGW 建立一个隧道,然后通过国内运营商的 PGW 上网。

这样判断你是否能上网的在国内运营商的 HSS,控制你上网策略的是国内运营商的 PCRF,给手机分配的 IP 地址也是国内运营商的 PGW 负责的,给手机分配的IP地址也是国内运营商里统计的。

运营商由于是在 PGW 里面统计的,这样你的上网流量全部通过国内运营商即可,只不过巴塞罗那运营商也要和国内运营商进行流量结算。

由于你的上网策略是由国内运营商在PCRF中控制的,因而你还是上不了脸书。

  • 移动网络的发展历程从 2G 到 3G,再到 4G,逐渐从打电话的功能为主,向上网的功能为主转变;
  • 记住 4G网络的结构,有 eNodeB、MME、 SGW 、 PGW 等,分控制面协议和数据面协议,你可以对照着结构,试着说出手机上网的流程;
  • 即便你在国外的运营商下上网,也是要通过国内运营商控制的,因而也上不了脸书。

云计算中的网络

云中网络

软件定义网络

云中的网络安全

云中的网络QoS

云中网络的隔离GRE、VXLAN

容器技术中的网络

容器网络

Flannel

Calico

微服务相关协议

RPC协议

基于 XML 的 SOAP 协议

基于 JSON 的 RESTful 接口协议

二进制类RPC协议

跨语言类RPC协议

搭建一个网络实验环境


  1. https://zh.wikipedia.org/zh-hans/网络传输协议↩︎

  2. https://time.geekbang.org/column/intro/85↩︎

  3. http://cabeggar.github.io/2016/02/21/DHCP-starvation-with-ScaPy/↩︎