CDN & DNS & Socket

63 阅读8分钟

CDN

视频业务占据互联网流量的大部分

CDN解决了同时向大量的用户提供并发的流化的服务

视频以及编码

  • 网络视频的特点

    • 高码率:带宽是音频的10倍以上
    • 可被压缩
    • 占据互联网的大量流量
  • 编码

    • 使用图像内和图像间的冗余来降低编码的比特数

      • 空间冗余(图像内)相同的颜色不是发送N个相同的值,而是发送一个值和重复的个数N

      • 时间冗余(图像间)不是发送N+1帧的全部编码,而是发送其与N帧的区别

        • CBR:(constant bit rate) 以固定的速率编码

        • VBR:(variable bit rate) 编码速率随时间的变化而变化

DASH

dynamic adaptive streaming over HTTP

  • 服务器

    • 将视频文件分割成块
    • 块独立存储,编码于不同的码率
    • 告示文件(manifest file):提供不同块的URL
  • 客户端

    • 获取告示文件

    • 周期性地测量服务器到客户端的带宽

    • 查询告示文件,在一个时刻请求一个块

      • HTTP头部制定字节范围
      • 带宽足够选择最大码率的视频块
      • 会话中的不同时刻,可以切换不同的编码块
    • 自适应

      • 有客户端去决定请求什么时候请求
      • 请求什么编码速率的视频块
      • 去哪里请求(向自己距离近的服务器发送URL,或者用高带宽的服务器请求)
    • 优点

      • 不用全部下载完才展示
      • 一边下载一边播放
      • 大幅减少用户点击反馈时间
    •   CDN

    • content distribution Networks

      旨在解决流化服务器的播放问题

    • 单个,大的超级服务中心 “mega-server"方案

      • 服务器到用户的路径长,跳数多,瓶颈链路的带宽小导致停顿
      • ”二八规律“决定网络同时充斥着同一个视频的多个拷贝,效率低
      • 周边网络的拥堵
      • 单点故障和性能瓶颈
    • 评述:相当简单但是不可拓展

    • ”二八规律“:八成用户访问二成信息

    • CDN方案:

    • 通过CDN向全网部署缓存节点,存储服务内容的拷贝,就近为用户提供服务

      • enter deep :部署在local ISP范围内部署缓存节点

        • 跟接近用户,服务质量高,但是数量多,成本高
      • bring home : 部署在关键位置 (包括上层ISP)

        • 采用租用线路将服务器簇连接起来
      • CDN运营商预先部署内容到啊缓存节点,CDN是在网边缘应用层提供的内容加速服务 (over the top)

      • 客户端通过告示文件获取缓存节点地址

        • 1.通过manifest告示文件直接定位;
        • 2.通过域名解析(DNS)重定向到CDN;

image.png



DNS

Domain Name System 从域名到IP地址的一个转换

  • IP地址标识主机和路由器 1.1.1.1

必要性

  • IP地址不好记忆,不便人类使用(没有意义)
  • 人类倾向于使用有意义的字符串来标识Internel上的设备
  • 存在着字符串-IP地址的转换的必要性
  • 由DNS负责转换为二进制的网络地址

DNS系统需要解决的问题

如何命名

  层次化命名:DNS采用树状结构命名方法
  • Internet被分为几百个顶级域(top lever domains)

    • 通用的:.com .edu .gov .int .mil .net .org .firm .hsop .web .arts .rec
    • 国家的:.cn .us .nl .jp
  • 每个域下面可以划分若干子域,区域的划分由区域管理者自己决定

  • 每个区域都是互不相交的

  • 树叶是主机

  域名管理
  • 一个域管理其下的子域
  • 创建新的域必须征得所属域的同意

域与物理网络无关

域遵从组织界限而不是物理网络,一个域的主机可以不在一个网络,一个网络的主机不一定在一个域

域的划分是逻辑的,而非物理的

如何解析

  解决方案
  • ARPANET的解决方法

    • 用一个集中的维护站,维护一张主机名-IP地址的映射文件(Host.txt)
    • 每台主机定时从维护站取文件

ARPANET当主机数量很大时,没有层次的主机名很难分配,文件的管理,发布和查找很麻烦

  • DNS的主要思路

    • 分层的,基于域的命名机制

    • 若干分布式的数据库完成名字IP地址的转换

    • UDP之上的端口53的应用服务

    • 核心的Internet功能,但以应用层协议实现

      • 在网络边缘处理的复杂性
  DNS工作过程
  1. 应用调用 解析器 (resolver)

  2. 解析器作为用户向 Name Server 发出查询报文 (封装在UDP段中)

  3. NameServer 返回响应报文(name/ip)

    1. 本地名字服务器(Local Name Server)

      1. 并不严格属于层次结构
      2. 每个ISP(公司大学居民区)都有一个本地DNS服务器(也即Local name server)
    2. 当一个主机发起DNS查询时,查询被发送到本地DNS

      1. 起一个代理作用(可以缓存),将查询转发到层次结构中

通常Local Name Serve在同一个子网中,减少延时

  DNS记录

保存资源记录(RR)的分布式数据库

  name | value | type | ttl

Type = A : Name 为主机 Value为IP
Type = CNAME : Name为规范名字的别名 Value 为规范名字
Type = NS : Name域名 Value 为该域名的权威服务器的域名
Type = MX : Value 为name对应邮箱服务服务器的名字
  • ttl (time to live)

    • 决定了资源记录应当从缓冲中删除的时间
  解析过程
  • 目标名字在Local Name Server中

    • 情况1 : 查询名字在该区域内部
    • 情况2 : 缓存

本地找不到的时候就顺着根-TLD 一直找到权威名字服务器

  • 递归查询

    • 都走到根DNS服务器
    • 根服务器负担很大
  • 迭代查询

    • 服务器返回的不是结果而是下一个NS的地址
    • 权威名字服务器给出解析结果
    • “我不知道这个名字,你可以问问这个服务器”

如何维护

  权威DNS服务器
  • 组织机构的权威服务器,提供组织机构的权威服务器可访问的主机和IP之间的映射
  • 组织机构可以选择自己维护或者让某个服务提供商来维护
  名字服务器
  • 每个区域有一个名字服务器,维护他所管理的区域的权威信息(authoritative record)
  • 名字服务器允许被放在区域之外,以保证可靠性
  单个名字服务器具有的问题
  1. 可靠性问题:单点故障
  2. 拓展性问题:通信容量
  3. 维护性为题:远距离的集中式数据库
  顶级域服务器(TLD)
  • 负责顶级域名和所有国家级的顶级域名

    • Netword solutions 公司维护 com TLD 服务器
    • Educause 公司维护 edu TLD 服务器
  新增域
  • 在上级域的名字服务器新增: 1.指向找个新增的子域的域名 2.域名服务器的地址

  • 运行新增子域的名字服务器,负责本域名的解析

  • 到注册登记机构注册域名

    • 提供权威DNS名字和IP
    • 登记机构在com TLD服务器中插入两条RR记录

在networktopia.com的权威服务器中确保有:

用于Web服务器的类型为A的记录

用于邮件服务器的类型为MX的记录

是互联网的核心,但是运行在互联网的边缘(传输层之上)

DNS的安全性

DDos攻击
  • 对根服务器流量轰炸,发送大量ping

    • 失败:有防火墙和流量过滤,LocalDNS服务器缓存的TLD服务器的地址,无需查询根服务器
  • 向TLD服务器流量轰炸攻击

    • 效果一般,大部分DNS缓存的TLD
重定向攻击
  • 中间人攻击

    • 截获查询,伪造回答,从而攻击某个DNS回答的IP
  • DNS中毒,发送伪造应答,希望它缓存

  • 技术上难度高

利用DNS基础设置进行DDos
  • 伪造某个IP进行查询,攻击目标IP
  • 查询放大,响应报文比查询报文大
  • 效果有限

👆上面的都是CS模型的应用 下面是P2P模型的应用👇

Socket编程

Socket编程说的就是应用之间是如何实现通信的,而不是虚空传输

通过socket应用层将报文物理地向下传,目标应用进程才能物理地收到报文

  • TCP/ip :引用进程通过socket接口进行传输

image.png

套接字: 应用进程与端到端之间的传输协议(UDP ,TCP)之间的门户

TCP套接字编程

可靠的字节流 (不保证界限)

  • 标识IP地址和port捆绑关系的数据结构(标识进程的端节点)
struct sockaddr_in {
short sin_family;//地址簇
u_short sin_port;//端口号
struct in_addr sin_addr;//IP地址
char sin_zero[8];//对齐作用
}
struct hostent{
char *h_name;//主机域名
char **h_aliases;//主机一系列别名
int h_addrtype;//
int h_length;//ip地址的长度
char **h_addr_list;//ip地址列表
#define h_addr h_addr_list[0];
}

image.png

其中 *Socket() | bind() | accept() | connect | read() | write() | read() | close() *都是下层提供的接口

UDP套接字编程

不可靠的字节组服务

  • 客户端和服务器之间没有连接
  • 没有握手
  • 发送端在报文中制定目标的IP和端口号
  • 服务器从收到的分组中提取发送端的IP和端口号

image.png

笔者才疏学浅,请多多指教。