跳转至

网络通信模型

互联网早期,为了把不同的网络链接起来,1983年推出了互联网协议套件(IPS):TCP/IP协议族

在TCP/IP协议族的基础之上,1984年ISO又推出了开放式系统互联模型:OSI,总共分为七层,每一层明确了编号,描述的网络更加完整。

TCP/IP和OSI都只是参考模型,并不是标准

网络分层模型

  • L7 应用层,为应用软件提供接口,用于跟其他应用软件相互通信
  • L6 表达层,把数据转换为能与接收者的系统格式兼容并适合传输的格式
  • L5 会话层,负责在数据传输中设置和维护计算机网络中两台计算机之间的通信连接
  • L4 传输层,把传输表头加至数据以形成数据包
  • L3 网络层,决定数据的传输路径选择和转发
  • L2 数据链路层,负责点对点的网络寻址、错误侦测和纠错。wireshark和tcpdump等抓包工具工作在这一层
  • L1 物理层,在物理网络上传送数据帧,它负责管理电脑通信设备和网络媒体之间的互通

物理层

早期以太网使用总线型拓扑(Bus,下图右),通过同轴电缆和集线器(Hub)连接网络(半双工,不能同时双向传输数据,每次只能单向传输数据)。

目前的快速以太网(100Mbps以上)实际所使用的主要是星型拓扑(Star,下图左)。通过双绞线和玻璃/塑料光纤线缆等,以及路由器和交换机(SWITCH)来连接设备(全双工,可同时双向传输数据)。

20210725191255

交换机越来越多,会造成环路和安全问题,STP协议用来解决环路问题,VLAN(虚拟局域网)用来解决广播和安全问题

数据链路层

  • 逻辑链路控制(LLC):为网络提供统一的接口,以便数据在设备之间传输
  • 介质访问控制(MAC):分配网卡地址,以标识网络设备

  • CSMA/CA(载波监听多点接入/碰撞避免):主要应用于早期以太网半双工有线通信中
  • CSMA/CD(载波监听多点接入/碰撞检测):主要应用于无线网络中,可选择与RTS/CTS协议搭配使用

网络层

判断目标地址是本地IP还是公网IP,如果是公网,则通过ARP协议(也就是已知IP地址,求MAC地址)获取网关MAC地址交给网关

操作系统启动的时候,DHCP协议会配置本机IP和默认网关的IP(192.168.1.1)

域名解析

  • URI 统一资源标识符,任何访问目标的统称:URL、文件名、CGI程序等
  • URL 统一资源定位符

域名系统 DNS(Domain Name System),是域名与IP地址相互映射的一个分布式数据库,域名地址有不同的记录类型,比如:A、CNAME、MX等,每种类型可以包含多条记录。

浏览器通过URL解析出域名后,首先会查询本地DNS缓存(/etc/hosts),判断是否有该域名的地址记录,如果没有就会去查询本地DNS服务器。

本地DNS缓存超过存活时间(TTL)后才会主动更新

本地DNS服务器部署在网络服务商(ISP)的某个数据中心,到达这里也会先查询本地缓存

本地DNS服务器是配置在本机操作系统中的,可以由用户手工设置,也可以DHCP(Dynamic Host Configuration Protocol 动态主机配置协议)自动分配,或者在拨号时从PPP服务器中自动获取。

本地DNS服务器如果也没有,则会进行递归查询:根域名服务器、顶级域名服务器、权威域名服务器。

基于UDP的DNS的分级查询意味着每一级都有可能受到中间人攻击的威胁,产生被劫持的风险。新出的基于HTTPS的HTTPDNS相对更加高效与安全。

权威域名服务器根据访问者所处的不同地区(如华北、华南、东北等)、不同服务商(如电信、移动、联通等)等因素智能选择出某种记录类型对应的最合适的记录,返回给客户端。

内容分发网络

CDN(Content Distribution Network) 内容分发网络

内容分发,指的就是获取源站资源的过程,主要有两种方式:

  • 主动分发

将内容从源站或者其他资源库推送到用户边缘的各个CDN缓存节点上,特别常用的资源甚至会直接缓存到手机APP的存储空间或者浏览器的localStorage中。

  • 被动回源

由用户访问所触发全自动、双向透明的资源缓存过程,如果不是自建CDN,而是购买阿里云、腾讯云的CDN服务的站点,多数采用的就是这种方式。

CDN最初是为了快速分发静态资源而设计的,而如今CDN所能做的事情已经远远不止于此,比如:安全防御、协议升级、状态缓存、修改资源、访问控制等等

仅从网络传输的角度看,一个互联网系统的传输速度取决于以下四点因素:

  1. 用户客户端接入网络运营商的链路所能提供的入口带宽
  2. 网站服务器接入网络运营商的链路所能提供的出口带宽
  3. 从网站到用户之间经过的不同运营商之间互联节点的带宽(一般来说两个运营商之间只有固定的若干个点是互通的,所有跨运营商之间的交互都要经过这些点)
  4. 从网站到用户之间的物理链路传输时延(爱打游戏的同学应该都清楚,延迟(Ping 值)比带宽更重要)

以上四个网络问题,除了第一个只能通过换一个更好的宽带才能解决之外,其余三个都能通过内容分发网络来显著改善。

负载均衡

调度后方的多台机器,以统一的接口对外提供服务,承担此职责的技术组件被称为负载均衡(Load Balancing)

无论在网关内部建立了多少级的负载均衡,从形式上来说都可以分为两种:

  • 四层负载均衡,性能高
  • 七层负载均衡,功能强

四层负载均衡其实是多种均衡器工作模式的统称,四层是指这些工作模式的共同特点是维持着同一个TCP连接,而不是说它只工作在第四层,实际主要都是工作在二层(数据链路层,改写 MAC 地址)和三层(网络层,改写 IP 地址)上,出于习惯和方便,统称为四层负载均衡。

从实现角度来看,负载均衡器的实现分为硬件均衡器和软件均衡器两类,而软件均衡器又分为:

  • 直接建设在操作系统内核的均衡器:LVS(Linux Virtual Server)
  • 应用程序形式的均衡器:Nginx、HAProxy、KeepAlived等

负载均衡的两大职责:

  • 选择谁来处理用户请求,即均衡策略,涉及各种均衡算法
  • 将用户请求转发或者代理出去

OSI 的下三层是媒体层(Media Layers),负载均衡主要是做转发,上四层是主机层(Host Layers),负载均衡主要是做代理

数据链路层负载均衡

数据链路层负载均衡所做的工作,是修改请求的数据帧中的MAC目标地址,让用户原本是发送给负载均衡器的请求的数据帧,被二层交换机根据新的 MAC 目标地址转发到服务器集群中对应的服务器的网卡上,这样真实服务器就获得了一个原本目标并不是发送给它的数据帧。

20220102232120

三角传输模式,也叫单臂模式,或者直接路由

使用这种负载均衡模式时,需要把真实物理服务器集群所有机器的虚拟IP地址配置成与负载均衡器的虚拟IP一样,这样经均衡器转发后的数据包就能在真实服务器中顺利地使用。

网络层负载均衡

20220102232159

IP 隧道模式,新创建一个数据包,把原来数据包的 Headers 和 Payload 整体作为另一个新的数据包的 Payload,在这个新数据包的 Headers 中写入真实服务器的 IP 作为目标地址,然后把它发送出去。经过三层交换机的转发,真实服务器收到数据包后,必须在接收入口处设计一个针对性的拆包机制,把由负载均衡器自动添加的那层 Headers 扔掉,还原出原来的数据包来进行使用。这样,真实服务器就同样拿到了一个原本不是发给它(目标 IP 不是它)的数据包,达到了流量转发的目的

这种模式要求真实服务器必须支持IP隧道协议,而且必须保证所有的真实服务器与均衡器有着相同的虚拟 IP 地址,因为回复该数据包时,需要使用这个虚拟 IP 作为响应数据包的源地址,这样客户端收到这个数据包时才能正确解析。

20220102232210

NAT(Network Address Translation 网络地址转换)模式,直接把数据包 Headers 中的目标地址改掉,修改后原本由用户发给均衡器的数据包,也会被三层交换机转发送到真实服务器的网卡上。这种模式比较简单,但在流量压力比较大的时候,负载均衡会带来较大的性能损失。

应用层负载均衡

七层负载均衡器属于反向代理中的一种

代理,根据哪一方能感知到的原则,可以分为:

  • 正向代理:代表客户端与服务器通信的代理服务
  • 反向代理:代表真实服务器来与客户端通信的代理服务
  • 透明代理:透明即指两端都意识不到,配置在网络中间设备上的代理服务(比如架设在路由器上的透明翻墙代理)

安全传输

参考:七次握手,九倍往返时延(RTT,Round-Trip Time)


最后更新: 2022-01-10