第一章 计算机网络和因特网

什么是因特网

因特网的描述:

  1. 描述因特网具体构成:构成因特网的硬件和软件。
  2. 分布式应用提供服务的网络基础设施。

构成描述

因特网是一个世界范围的计算机网络,即它是互联了遍及全世界的数以亿计的计算设备的网络。

  1. 连入因特网中的格式各样的设备。(网络边缘

    • 主机(host)或端系统(end system)
  2. 通信链路(communication link)。(接入网

    • 媒介:同轴电缆、铜线、光纤、无线电频谱
    • 传输速率:带宽 bps
  3. 分组交换机(packet switch)两种类型。(网络核心

    • 路由器(router)和 链路层交换机(link-layer switch)
  4. ISP: internet sercice provider ISP 因特网服务提供商。端系统通过ISP接入因特网。

  5. 协议(protocol):协议控制因特网中信息的接收和发送。一个协议定义了在两个或多个通信实体之间交换的报文格式和次序,以及报文发送/或接收的一条报文或其他事件所采用的动作。

    • TCP(Transmission Control protocol 传输控制协议)
    • IP (Internet Protocol 网际协议)
  6. 因特网标准(internet standard)由因特网工程任务组(Internet Engineering Task Force, IETF)研发。IETF的标准文档称为请求评论(Request for Commment)。RFC定义了TCP、IP、HTTP(Web)、SMTP(电子邮件)等协议。目前有将近6000个RFC。IEEE 802 LAN/MAN标准化委员会制定了以太网和无线WIFI的标准。

    • 因特网工程任务组(IETF): 制定网络标准的组织
    • 请求评论(RFC):IETF的标准文档

服务描述

  1. 为应用程序提供服务的基础设施—即用户使用应用。

  2. 应用程序编程接口—即编写应用。

分布式应用程序:比如视频会议这些应用涉及多个相互交换数据的端系统。

因特网的一些部件

网络边缘

与因特网相接的计算机及其他设备位于因特网的边缘,称为端系统

端系统是计算机网络从具体构成描述因特网中设备的用语,而主机是从服务去描述这些设备。这两个术语是通用的,即主机=端系统。

主机有时候分为两类:客户(client)和服务器(server)。

  • 客户(client):桌面PC、移动PC和只能手机
  • 服务器(server):用于发布Web页面,流视频的主机,现在常常依托于大型数据中心

接入网(access network)

将端系统连接到边缘路由器(edge router)的物理链路。

家庭接入

家庭接入:DSL、电缆、FTTH、拨号和卫星

  1. 数字用户线(digital subscriber line,DSL

    利用电话线路接入网络。其中 ADSL是非对称的数字用户线,基本都用ADSL,因为一般下行的数据量都远大于上行的数据量,所以要设计成非平衡的链路。

    采用独占频分多路复用来传输。因为利用的是原有的电话线路,所以需要将DSL传输的网络信号(上行、下行)和电话信号通过频分多路复用来区分开来。

    技术:主要用于家庭或小型办公室接入。

    特点:通过编码不同的频率来使家庭电话线同时承担电话和上网的两个功能。

  2. 电缆因特网接入(cable Internet access)

    利用有线电视网接入网络。结构上,通过粗的同轴电缆接入社区,再用细的同轴电缆接入每家每户。

    采用共享频分多路复用来传输。

  3. 混合光纤同轴电缆(HFC)

    同轴电缆光纤节点相连再接入边缘路由器。

  4. 光纤到户(FTTH, fiber to the home)

企业接入

  • 以太网:使用双绞铜线与一台以太网交换机相连,速率可达到100Mbps、1Gbps、10Gbps。

  • WiFi:IEEE802.11技术无线LAN,范围在几十米内。

  • 345G:一种广域接入技术。

物理媒体

分为两类:

  1. 导引型媒体(guided media):电波随着固体媒体前行,如光缆、双绞铜线和同轴电缆。

  2. 非导引型媒体(unguided media):电波在空气或外层空间中传播:例如在无线局域网或数字卫星频道里。

网络核心

网络核心:由端系统的分组交换机和链路构成的网状网络。

分组交换

端系统之间彼此传输报文,分组交换中,将长报文划分为分组,分组再通过通信链路和分组交换机(分为路由器和链路层交换机)传送。

  1. 分组 (packet):其实大家更常见喜闻乐见的说法是“包”。打游戏时候说的丢包应该指的就是分组。源将长报文划分成小的数据块,就称之为分组了。
  2. 在源和目的之间,每个分组通过通信链路和分组交换机(packet switch)。交换器有两类:路由器链路层交换机
  3. 在传输速率为 R bits / s 的链路上,传输一个 L bits 的分组时间是 L / R 秒。
  4. 存储转发传输(store-and-forward transmission):交换机能够开始向输出链路传输该分组的第一个比特之前,必须接收到整个分组。
  5. N条速率均为R,长度为L的链路构成的路径(所以再源和目的地之间有N-1台路由器),端到端的时延是:$d_{end\ to\ end} = N\frac LR$
  6. 输出缓存(output buffer)(也成为输出队列 output queue): 当分组需要经过的那条链路繁忙时(传输其他分组中),那么该分组可以在输出缓存上等待。
  7. 排队时延(queue delay): 在输出缓存等待的时延;除此之外,还有之前提到的存储转发时延。
  8. 分组丢失(丢包)(packet lost):到达的分组可能发现缓存已经被其他等待的分组完全充满了,这种情况下就会出现丢包。
  9. 在因特网中,每个端系统具有一个称为IP地址的地址。源在分组的首部包含了目的地的IP地址。路由器会检查目的地址的一部分,并向相邻的路由器转发该分组。
  10. 转发表(Forwarding Table)和路由选择协议(Routing Protocol)
    • 路由:分组中包括IP地址。
    • 转发:路由器中将目的地址映射为输出链路。

电路交换

  1. 电路交换(circuit switching)网络必须在发送发和接受方之间的交换机需要为该连接维护为连接状态。该连接用电话的术语被称为一条电路。

  2. 电路交换的复用技术:指的是如何复用链路服务于多个连接,构建电路的技术。主要有频分复用(Frequency-Division Multiplexing, FDM)和时分复用(Time-Division Multiplexing, TDM)。简单来说,在不同频率上连接多个电路的称为FDM,而基于一定时间间隔为所有连接打开通路的被称为时分复用。

分组交换与电路交换比较

  1. 分组交换的性能优于电路交换,适用于随机数据,可以满足更多用户。

  2. 电路交换需要预留带宽,相当于固定了链路用户的数量。而分组交换不需要预留带宽,用户使用网络是有一定概率的,在一个时刻较多人使用的概率其实相对较低,所以一条链路可以给更多的用户使用。

  3. 电路交换适用于特殊情况,比如要保障传输数据能力。

网络结构

网络结构是网中之网,具有层次结构。

  • ISP:ISP分为许多层级,比如第一层ISP(tier-1 ISP)、区域ISP(regional ISP)、接入ISP(access ISP)。端系统通过接入ISP与因特网相连,全球的ISP通过各个层级相连,形成了互联网的互联。
  • 因特网交换点(Internet Exchange Point,IXP):由第三方公司创建,IXP是一个汇合点,多个ISP在此处对等。

关键词:

  • 区域ISP(regional ISP):区域中的接入ISP与之互联(例如一个城市)。区域ISP再与第一层ISP互联。区域ISP和第一层ISP可能是多对多的客户-提供商关系。
  • 存在点(Popint of Presence, PoP): Pop存在于等级结构的所有层次。提供商网络中的一台或多肽路由器(在相同位置)的群组,其中客户ISP能够与提供商ISP连接。
  • 多宿(multi-home):任何ISP(除了第一层ISP)可以与两个或更多ISP连接。
  • 对等(peer):将相同等级结构的邻近一对网络连接到一起,使他们之间网络不通过上游ISP。通常对等的互相连接是不会结算的。
  • 因特网交换点(Internet Exchange Point, IXP):IXP是一个汇合点,多个ISP都能够在这里共同对等。
  • 内容提供商网络(content provider network): 独立于公共互联网却跨越全球的网络。例如谷歌的服务器主机。

分组交换网中的时延、丢包和吞吐量

常见时延分类

  • 处理时延(nodal processsing delay): 检查分组首部和决定将该分组导向何处所需要的时间。

  • 排队时延(queueing delay):在队列中,当分组在链路上等待运输时,它经受排队时延。

  • 传输时延(transmission delay):在链路上传播的时延,分组大小L/传输速率R

  • 传播时延(propogation delay): 距离d / 速度s,在广域网中一般也为毫秒级

    他们总和累加出来称为:结点总时延(total nodal delay)

    $d{proc},d{queue},d{trans},d{prop}$分别表示处理时延、排队时延、传输时延和传播时延,

    则节点的总时延由下式给定:

    $d{nodal} = d{proc}+d{queue}+d{trans}+d_{prop}$

丢包

丢包: 队列并不能容纳无限多的分组。若没有地方存储,则会丢弃(drop)这个分组,该分组会丢失(lost)。

流量强度(traffic intensity):a 表示分组到达队列的平均速率(分组/秒,pkt/s);R 是传输速率(从队列中输出比特的速率);假设分组长度都为L:则比特到达队列的平均速率是 La bps;流量强度为比例 La/R。

若流量强度>1, 则比特 到达队列的平均速度超过从该队列传输出去的速率。所以,流量工程中一条金科玉律是:设计系统时流量强度不能大于1。

吞吐量

  • 瞬间吞吐量(instantaneous throughput):在任何时间瞬间接收到文件的速率(参考物理学中速度的定义)。

  • 平均吞吐量(average throughput):一段时间,接受 F bits 花费了 T 秒,则平均吞吐量为 F/T bps。

  • 瓶颈链路(bottleneck link):一条路径上,限制吞吐量的链路(参考图论中关键路径的定义)。

协议层次及其服务模型

五层因特网协议栈

因特网协议栈由5个层次组成:物理层、链路层、网络层、传输层和应用层。因特网协议栈是一个理想模型。

下层为上层提供服务。越下面的层,越靠近硬件;越上面的层,越靠近用户。

  1. 应用层(Application Layer):支持网络应用,应用协议仅仅是网络应用的一个组成部分,运行在不同主机上的进程则使用应用层协议进行通信。
  2. 传输层(Transport Layer): 负责为信源和信宿提供应用程序进程间的数据传输服务,这一层上主要定义了两个传输协议,传输控制协议即TCP和用户数据报协议UDP。
  3. 网络层(Network Layer):负责将数据报独立地从信源发送到信宿,主要解决路由选择、拥塞控制和网络互联等问题。
  4. 链路层(Link Layer):负责将IP数据报封装成合适在物理网络上传输的格式并传输,或将从物理网络接收到的帧解封,取出IP数据报交给网络层。
  5. 物理层(Physical Layer):负责将比特流在结点间传输,即负责物理传输。该层的协议既与链路有关也与传输介质有关。

OSI模型

OSI模型由国际标准化组织(ISO)制定,实际并没有应用,只有理论。

OSI模型由7层组成:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。

应用层常见协议

应用层常见协议:HTTP(web),SMTP(电子邮件),FTP(两个端系统间的文件传输),域名系统(DNS)。

封装(encapsulation)

应用层报文(application-layer meesage)-> 运输层报文段(transport-layer segment)-> 网络层数据报(network-layer datagram)-> 链路层帧(link-layer frame)。

面对攻击的网络

  1. 病毒(virus):是一种需要某种形式的用户交互来感染用户设备的恶意软件。

  2. 蠕虫(worm):是一种无需任何明显用户交互就能进入设备的恶意软件。

  3. 拒绝服务攻击(Denial-of-Service (Dos) attack):攻击使得网络不能被合法用户所使用。分为:弱点攻击、带宽洪泛、连接洪泛。

  4. 分布式DoS(Distributed Dos, DDoS):攻击者控制多个源并让每个源向目标猛烈发送流量。

  5. 分组嗅探器(packet sniffer)、IP哄骗(IP spoofing)都是计算机网络安全存在的问题。

  6. 描述一个僵尸网络形成的过程

    • 僵尸网络来源于某些应用或者系统的弱点
    • 在找到弱点之后,攻击者需要判断主机是否属于脆弱的状态
    • 其次,充分利用弱点对僵尸网络进行传播。
    • 攻击者可能可以使用一条命令控制所有的受感染结点。
    • 攻击者可以依据控制权限进行攻击。

第二章 应用层

应用层协议原理

  • 应用层协议:每个应用层协议都是为了解决一类应用问题,而解决问题需要通过位于不同主机的多个应用进程之间的通信和协同来完成,应用层的具体内容就是定义这些通信规则。
  • 研发网络应用程序的核心是写出能够运行在不同的端系统和通过网络彼此通信的程序

网络应用程序体系结构

两种主流体系结构:

  • 客户-服务器体系结构
  • 对等(P2P)体系结构

客户-服务器体系结构

  • 区分处理请求的服务器和发送请求的客户机
  • 服务器往往在数据中心,通过多台服务器进行扩展。
  • 服务器具有固定的、周知的IP地址
  • 客户能够通过向该服务器的IP地址发送分组来与其联系。
  • 客户之间不直接通信

对等(P2P)体系结构

  • 每台端系统既是服务器也是客户。
  • 任意间断连接的主机对——称为对等方,直接通信。
  • P2P协议最突出的特性之一是它的自扩展性。

某些应用具有混合的体系结构,由客户机/服务器和P2P元素结合而成,往往服务器场用于跟踪用户的IP地址,但用户到用户的报文在用户主机之间直接发送。

进程通信

  • 同一个端系统上的进程通过操作系统上的进程间通信机制相互通信。

  • 不同端系统上的进程通过跨越计算机网络交换报文(message)而相互通信。

客户和服务器进程

进程:一台主机上运行的程序。

客户机进程:发起通信的进程。

服务器进程:等待连接的进程。

(P2P结构下一个进程既可以使服务器也可以是客户机)。

套接字(Sockets)

套接字:进程与计算机网络之间的接口(应用程序编程接口)

进程通过一个称为套接字(socket)的软件接口向网络发送报文和从网络接收报文

应用程序开发者可以控制套接字在应用层端的所以东西,但是对套接字的运输层端几乎没有控制。

应用程序开发者对于应用层端的控制仅限于:

  1. 选择运输协议。
  2. 设定部分运输层参数,如最大缓存、最大报文长度等。

进程寻址

如果两个主机之间的进程进行通信,发送端不仅要知道接收端的IP地址还需要知道进程相应的端口号

  • IP地址:IPv4中32位IP,负责找到接收端主机。
  • 端口号(port number):每台主机都可能运行着多个进程,每个进程对应一个端口号。比如,HTTP服务端口号80、邮件服务端口号25。

可供应用程序使用的运输服务

可靠数据传输

如果一个协议能够确保由应用程序的一端发送的数据正确地、完全地交付给该应用程序的另一端,那么该协议提供了可靠数据传输服务(reliable data transfer)。

吞吐量

两个进程在一条网络路径上进行通信会话时,可用吞吐量就是发送进程能够向接收进程交付比特的速率。因为其它会话将共享沿着该网络路径上的带宽,并且这些其它会话将会到达和离开,所以可用吞吐量将随时间波动。因此有了另一种服务,即运输层协议能够以某种特定的速率提供确保的可用吞吐量。

定时

运输层协议也能提供定时保证,如同吞吐量保证一样,定时保证可以以多种形式实现。

例如,可以设置发送方注入进套接字的每个比特到达接收方的套接字不迟于100ms。这种服务对交互式实时应用程序非常适用。

安全性

在发送主机中,运输层协议能够加密由发送进程传输的所有数据;在接收主机中,运输层协议能够在数据交付给接收进程之前解密这些数据。

因特网提供的运输服务

TCP服务

  • 面向连接服务: 使用TCP协议时,在应用层数据报文开始流动之前,其客户机程序和服务器程序之间相互交换运输层控制信息(握手过程)。握手阶段后,两个进程的套接字之间建立一个TCP连接,连接双方可以在此连接上同时进行报文收发。报文收发结束之后,该连接将被拆除。

  • 可靠数据传输服务:进行通信的进程依靠TCP协议,无差错、按适当顺序交付发送的数据。

  • 拥塞控制机制:发送方和接收方之间的网络出现拥塞时,TCP协议的拥塞机制会抑制发送进程。TCP协议的拥塞控制试图限制每个TCP连接,使它们达到公平共享网络带宽的目的。

UDP服务

  • UDP是一种不提供不必要服务的轻量级运输层协议。

  • 它是无连接的,两个进程通信前没有握手过程。

  • UDP协议提供的是不可靠数据传输服务,也就是说,当进程通过UDP套接字发送报文时,UDP协议不保证该报文能够被接收进程收到。
  • 接收进程收到报文的顺序也可能是乱序的。
  • UDP协议没有拥塞控制机制。

TCP和UDP的安全

  • 安全原因:TCP和UDP都没有提供任何加密机制,发送进程传送至套接字的数据与经过网络传送到目的进程的数据相同。如果某个进程以明文方式将一个口令传送至它的套接字,该明文口令将经过发送方和接收方之间的所有链路传送,这就可能在任何中间链路被嗅探和发现。

  • 解决方案:人们研制了TCP的加强版本,称为安全套接字层(Secure Socket Layer, SSL)。SSL不是独立于TCP和UDP的第三种协议,而只是对TCP的增强。这种增强是在应用层上实现的。如果一个应用程序要使用SSL的服务,它需要在其客户机和服务器中都包括SSL的代码。

应用层协议

应用层协议定义了运行在不同端系统上的应用程序进程如何相互传递报文。其主要定义了如下内容:

  1. 交换的报文类型,如请求报文和响应报文。
  2. 各种类型的语法,如报文中的各个字段及其详细描述。
  3. 字段的语义,即包含在字段中的信息含义。
  4. 进程何时、如何发送报文以及对报文响应的规则。

网络应用和应用层协议的区别:应用层协议只是网络应用的一部分,只是定义了应用程序之间沟通的协议。

选则的网络应用的要求

应用 应用层协议 运输层协议
电子邮件 SMTP TCP
远程终端访问 Telnet TCP
Web HTTP TCP
文件传输 FTP TCP
流媒体 HTTP、RTP TCP或UDP
因特网电话 SIP、RTP或专用(如Skype) 通常用UDP

Web和HTTP

HTTP概况

  • web的应用层协议是产文本传输协议(HyperText Transfer Protocol, HTTP)。
  • HTTP协议由两部分程序实现:一个客户机程序和一个服务器程序,它们运行在不同的端系统中,通过交换HTTP报文进行会话。HTTP定义了这些报文的格式以及客户机和服务器是如何进行报文交换的。
  • HTTP使用TCP作为它的支撑运输层协议。客户机发起一个与服务器的TCP连接,一旦连接建立,浏览器和服务器进程就可以通过套接字接口访问TCP。
  • HTTP是一个无状态协议(stateless protocol),一个HTTP服务器并不保存关于客户机的任何信息。

非持续链接和持续链接

非持续链接步骤

  1. TCP连接开启

  2. 通过这个TCP连接最多传输一个对象

  3. TCP连接关闭

    如果要加载多个对象时,需要多次非持久性HTTP连接。

RTT:往返时间, 一个很小的数据包(处理文件的时间可忽略)从客户机传到服务器再传回来的时间。

HTTP响应时间(一个对象):

  • 1个RTT:建立TCP连接的时间

  • 1个RTT:HTTP请求以及收到HTTP响应的前几个字符的时间

  • 对象/文件传输的时间

    对一个对象来说,非持久性HTTP响应时间为: $2*RTT + html文件传输时间$

    例题:如果一个网页包含1个HTML和10个对象,则非持久性HTTP响应需要多少时间?

    $2RTT×(1+10) + 总文件传输时间$

非持续链接优缺点:

  • 每传输一个对象都需要耗费 2RTT
  • 每建立一个TCP连接都会对操作系统(OS)产生负荷
  • 并行抓取:浏览器常常开多个并行的TCP连接去抓取对象

持续链接步骤

  1. 开启TCP连接
  2. 通过这一个TCP连接可以传多个对象
  3. TCP连接关闭

持续链接优缺点(HTTP1.1)

  • 服务器在发送响应后保持连接开启状态
  • 后续这个客户机\服务器的HTTP消息都通过该开启的连接发送
  • 两种发送对象方式:HTTP1.1采用流水的方式发送:一次性把对象全发了;另一种是客户机接收到一个对象后接着发下一个对象的请求
  • 至少需要1个RTT发完所有对象

HTTP报文格式

HTTP有两种报文:请求报文和响应报文

请求报文

下面是一个典型的请求报文:

1
2
3
4
5
GET /somedir/page.html HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/4.0
Accept-language: fr

HTTP请求第一行叫做请求行,其后继的行叫做首部行。请求行有三个字段:方法字段、URL字段和HTTP协议版本字段。方法字段可以取值GET、POST、HEAD、PUT和DELETE。

首部行Host:www.someschool.edu定义了目标所在主机。

Connection:close首部行,告诉服务器不希望麻烦的使用持久连接,要求服务器发送完请求的对象后就关闭连接。

User-agent:首部行用来定义用户代理,即向服务器发送请求的浏览器类型。

Accept-language表示用户想要得到该对象的语法版本。

Accept-language:是可选内容协商首部之一。

  • GET:浏览器请求一个对象,在URL字段带有请求对象的标识,实体体(entity body)为空。
  • POST:用户可以向server请求一个web页面,内容依赖于用户在实体体表单字段中的输入值。
  • HEAD:server会用HTTP报文进行响应,但是不返回请求对象,常用来调试跟踪。
  • PUT:允许用户上传对象到指定的web server上指定的路径。
  • DELETE:允许用户或应用程序删除web server上的对象。

HTTP响应报文

典型响应报文格式:

1
2
3
4
5
6
7
8
9
HTTP/1.1 200 OK
Connection: close
Date: THu,03 Jul 2003 12:00:15 GMT
Server: Apache/1.3.0(Unix)
Last-Modified: Sun,6 May 2007 09:23:24 GMT
Connect-Length: 6821
Content-Type: text/html

(data data ...)

响应分三部分:一个初始状态行首部行和实体主体。实体主体是报文的主体,它包含一个所请求对象本身。状态行有三个字段:协议版本、状态码和相应状态信息。

  • Connection:close首部行告诉客户机发送完毕后关闭连接。
  • Date首部行指示服务器产生并发送该响应报文的日期和时间。时间是指服务器从它的文件系统中检索到该对象,插入到响应报文的时间。
  • Server报文指示服务器类型,类似与请求报文中User-agent首部行。
  • Last_Modified首部行指示了对象穿件或最后修改的日期和时间。
  • Content_Length表明被发送对象的字节数。
  • Content_Type指示了实体主体原本的类型(HTML还是图片等)。

一些常见的状态码:

200 OK 请求成功
301 Moved Permanently 请求的对象已经被永久转移了,新的URL定义在响应报文的Location:首部行中。客户机软件自动用新的URL获取该对象。
400 Bad REquest 一个通过错误代码,指示请求不能被服务器理解。
404 NOT Found 请求的文档不在服务器上。
505 HTTP version not supported 服务器不支持请求报文使用的HTTP协议版本。

用于与服务器的交互:cookie

HTTP是无状态的,然而一个Web站点通常希望能够识别用户,即可能是为了服务器限制用户访问,也可能是它想把内容与用户身份联系起来。为此,HTTP使用了cookie,它允许站点跟踪用户。

如上图所示,cookie由四部分组成:

  1. 在HTTP响应报文中有一个cookie首部行;
  2. 在HTTP请求报文中有一个cookie首部行;
  3. 在用户端系统保留一个cookie文件,由用户的浏览器管理;
  4. 在Web站点有一个后端数据库。

cookie可以在无状态的HTTP上建立一个用户层会话。例如,基于Web的电子邮件系统,浏览器向服务器发送一个cookie信息,运行该服务器通过用户与应用程序之间的会话对用户进行验证。

Web缓存

Web缓存器(Web cache)也叫代理服务器(proxy server),它是能够初始Web服务器来满足HTTP请求的网络实体。Web缓冲器有自己的磁盘存储空间,并在该存储空间中保存最近请求的对象的拷贝。

一旦配置了浏览器,每个浏览器对对象的请求首先被定向到Web缓存器。其请求所经历流程大致如下:

  1. 浏览器建立一个到Web缓存器的TCP连接,并发送请求。
  2. Web缓存器检测本地是否存储了该对象的拷贝。如果有,Web缓存器就用HTTP响应报文回复。
  3. 如果Web缓存器没有该对象,它就与该对象的初始服务器打开一个TCP连接,并发送请求。
  4. 当Web缓存器接收到该对象时,在本地存储一份拷贝,并用HTTP响应报文向客户端发送报文。

Web缓存器的好处:

  1. 大大减少客户机请求响应时间,尤其在客户机与初始服务器之间的瓶颈带宽远低于客户机与Web服务器瓶颈带宽时。
  2. 可以大大减少一个机构内部网与因特网接入链路上的通信量,降低费用。
  3. 整体上大大降低因特网上的Web流量,从而改善所有应用的性能。

条件GET方法

条件GET方法是一种机制,允许缓存器证实它的对象是最新的。如果(1)请求报文使用GET方法;(2)请求报文包含一个if-modified-since首部行,那么这个HTTP请求报文就是一个条件GET请求报文。

缓存器发送一个条件GET,执行最新检查,例如:

1
2
3
GET /fruit/kiwi.gif HTTP/1.1
Host: www.somesite.com
If-modified-since: Wed,4 Jul 2007 09:23:24

该条件GET报文告诉服务器,仅当自指定日期之后修改过该对象才发送该对象。如果未改动过该对象,初始服务器响应报文可能是:

1
2
3
4
HTTP/1.1 304 Not Modified
Date: Sat,14 Jul 2007 15:39:29
Server: Apache/1.3.0(Unix)
(实体主体为空)

状态行中为304 Not Modified,它告诉缓存器可以使用该对象,能向请求的浏览器转发它(该代理缓存器)缓存的该对象副本。

因特网中的电子邮件

因特网电子邮件主要由三部分组成:用户代理(user agent)、邮件服务器(mail server)和简单邮件传输协议(Smiple Mail Transfer Protocol,SMTP)。

  • 用户代理允许用户阅读、回复、转发、保存和撰写报文(用户代理也叫邮件阅读器)。
  • 邮件代理向其邮件服务器发送邮件,并且该邮件被放在邮件服务器发送报文列中。
  • 当用户想要获取邮件时,其邮件代理从他的位于邮件服务器的邮箱中获取该报文。

邮件发送过程为:

从发送方的用户代理开始,传输到发送方的邮件服务器,再传输到接收方的邮件服务器,然后在这里被分发到接收方的邮箱中。在传递到接收方的邮件服务器时,发送方邮件服务器还要处理接收方服务器故障的问题:当发送方发送失败时,发送方邮件服务器在一个报文列表中保持该报文并在以后尝试再次发送,一般半个小时尝试一次,如果几天依然不能成功,会删除该报文并通知发送方。在接收方查看邮件时,接收方服务器会首先鉴别其身份。

SMTP是因特网电子邮件中主要的应用层协议。它使用TCP可靠传输服务。

SMTP

SMTP用于从发送方的邮件服务器发送报文到接收方的邮件服务器。SMTP邮件的主体部分(不止其首部)只能采用简单的7位ASCII码表示。

当A给B发送一封简单的ASCII报文时,其流程如下:

  1. A调用他的邮件代理程序并提供B的邮件地址,撰写邮件,然后通过用户代理发送该邮件。
  2. A的用户代理把报文发送给A的邮件服务器,在那里该报文被放在报文发送队列中。
  3. 运行在A邮件服务器上的SMTP客户机端发现报文队列中这个报文,就创建一个到运行在B的邮件服务器上的STMP服务器的TCP连接。
  4. 在经过一些初始SMTP握手后,SMTP客户机通过该TCP连接发送A的报文。
  5. 在B的邮件服务器上,SMTP的服务器端接收该报文,B的邮件服务器然后将该报文放入B的邮箱中。
  6. 在B方便的时候,调用用户代理阅读报文。

SMTP一般不使用中间邮件服务器发送邮件。

SMTP客户机(运行在发送方邮件服务器上)在25号端口建立一个到SMTP服务器的TCP连接。一但建立连接,服务器和客户机就执行一些应用层的握手,在握手阶段,SMTP客户机指定发送方的邮件地址和接收方的邮件地址。之后发送报文。

下面是SMTP服务器(S,主机名是server)和SMTP客户机(C,主机名是client)之间交换报文脚本的例子,一旦创建了TCP连接,就开始下列过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
S: 220 server
C: HELO client
S: 250 Hello client pleased to meet you
C: MALL FROM: <alice@crepes.fr>
S: 250 alice@crepes.fr ... Sender ok
C: RCPR TO: <bob@hamburger.edu>
S: 250 bob@hamburger.edu ... Recipient ok
C: DATA
S: 345 Enter mail, end with "." on a line by itself
C: Do you like ketchup?
C: How about pickles?
C: .
S: 250 Messgae accepted for delivery
C: QUIT
S: 221 server closing conncetion

上例中,客户机程序从邮箱服务器client向邮箱服务器server发送了一个报文(Do you like ketchup?How about pickles?)。客户机发送了五条命令:HELO(hello的缩写)、MALL FROM、RCPT TO、DATA以及QUIT。这些命令是自解释的。客户机通过发送一个只包含句点的行,告诉服务器该报文结束了。(按照ASCII码,每个报文以CRLF.CRLF结束,其中CRLF分别表示回车和换行)。应达250表示正常。SMTP使用持久连接:如果发送邮件服务器有几个报文发往同一个接收服务器,可以通过一个TCP连接发送所有这些报文。对每个报文,客户机都用一个新的MALL FROM开始,仅当所以邮件全部发送完全才发送QUIT。

SMTP与HTTP的对比

相同点:都是使用了持久连接。

不同点:

  1. HTTP是一个拉协议,即人们可以在方便的时候装载Web信息,即用户使用HTTP从该服务器拉取信息。TCP连接是由想获取文件的机器发起的。
  2. SMTP是一个推协议,即发送邮件服务器把文件推到接收邮件服务器,TCP连接是由要发送的机器发起的。
  3. SMTP要求每个报文使用7位ASCII格式。如果某报文包含了非7位ASCII字符或二进制数据,则该报文必须按照7位ASCII进行编码。

邮件报文格式和MIME

邮件报文要包含环境信息,这些环境信息包含在首部行中。每个首部行包含一个From首部行和一个To首部行,可以包含一个Subject首部行或其他可选的首部行。这些首部行不同于在之前所学的SMTP命令,之前的命令是SMTP握手协议的一部分,而首部行是邮件报文的一部分。但是邮件发给谁和从哪里来不是由首部行决定的,而是由SMTP命令决定的。下面展示了一个典型的报文首部:

1
2
3
From: a
To: b
Subject: Searching for the meaning oof file

在报文首部之后,紧接着是空白行,然后是以ACSII格式表示的报文主体。

非ASCII码数据的MIME扩展

为发送非ASCII文本的内容,发送方必须在报文中使用附加的首部行。多用途因特网邮件扩展(Multipurpose Internet Mail Extension,MIME)。支持多媒体的量关键字MIME首部为Content-Type:和Content-Transfer-Encoding:。前者允许接收用户代理采取适当的动作,后者提示接收用户代理该报文已经使用了ASCII编码,并指出了使用的编码类型。当用户代理接收到包含这两个首部行的报文时,会根据Content-Transfer-Encoding的值将报文编码为非ASCII格式,然后根据Content-Type首部行决定它应该采取何种动作来处理报文。

接收的报文

接收器一旦接收到具有RFC 822和MIME的首部行,就在该报文的顶端添加一个Received:首部行。该首部行定义了发送该报文的SMTP服务器的名称,接收该报文的SMTP服务器名称和接收时间。例如:Received: from server by client; 12 Oct 98

邮件访问协议

之前我们只考虑了邮件服务器之间使用SMTP进行传输报文,现在考虑用户代理与邮箱服务器之间如何传递报文。在发件方来看,从用户代理到邮箱服务器是一个推过程,需要推协议,SMTP刚好可以按照,因此,在发送方这两者使用SMTP协议。在来看接收方,接收方是在有时间的时候去读邮件,因此是一个拉过程,需要拉协议来支持,因此不能使用SMTP。与之对应的,可以使用的协议有三种:第三版邮局协议(Post Office Protocol-Version 3,POP3)、因特网邮件访问协议(Internet Mail Access Protocol,IMAP)以及HTTP。

POP3

当用户代理(客户机)打开一个到邮件服务器(服务器)端口110上的TCP连接后,POP3就开始工作了。POP3按照三个阶段进行工作:特许(authorization)、事物处理以及更新。

第一阶段(特许):用户代理发送(以明文形式)用户名和口令以鉴别用户。

第二阶段(事务处理):用户代理取回报文。同时还可以进行:对报文做删除标记,取消报文删除标记,以及获取邮件的统计信息。

第三阶段(更新):出现在客户机发出了quit命令后,目的是结束该POP3会话,这时,邮件服务器删除那些被标记为删除的报文。

在POP3事物处理阶段,用户代理发送一些命令,服务器对每个命令做出回答。回答有两种:+OK(有时后面会有说明文字),服务器用它来指示前面的命令是正常的;-ERR,服务器用它来指示前面的命令出现错误。

例子:

特许阶段有两个主要的命令:user < user name >和pass < password > o为了举例说明这两个命令,我们建议你直接用Telnet登录到POP3服务器的110端口,然后发岀这两个命令。假设邮件服务器的名字为mailServer,那么你将看到类似的过程:

事物处理过程中。POP3用户代理发出的命令通常由用户配置为“下载并删除”或者“下载并保留”。主要有四个命令list、retr、delete和quit。命令的语法在RFC 1939中定义。大概使用如下图:

IMAP

IMAP服务器把每个报文与一个文件夹联系起来,当报文第一次到达服务器时,它被放到收件箱文件夹中。收件人可以把邮件移到一个新的、用户创建的文件夹中,或阅读邮件、删除邮件等。IMAP为用户提供了创建文件夹以及在文件夹中移动邮件的命令。IMAP还为用户提供了在远程文件夹中查询邮件的命令,按指定条件去查询匹配的邮件。IMAP服务器维护了IMAP会话的用户状态信息。

IMAP运行用户代理获取报文组件的命令。

优点:

  • 提供远程文件夹
  • 用户可以通过手机、办公室PC、家庭PC来访问邮件。
  • IMAP服务器维护了IMAP会话的用户状态信息。

DNS:因特网的目录服务

主机使用IP地址进行标识。一个IP地址由4个字节组成,并有着严格的层次结构。如想127.7.106.83这样,每个字节都被句点分隔开,表示了0~255的二进制数。IP地址具有层次结构是因为我们从左向右扫描时,会得到越来越细的关于主机位于因特网何处的信息。

主机也可以使用主机名进行标识。不过主机名只有在DNS中注册才有用,别人才能通过DNS获得主机名,因此在DNS中,主机名一定是互异的。

DNS提供的服务

域名系统(Domain Name System,DNS)提供进行主机名到IP地址转换的目录服务。

DNS是:

  1. 一个由分层的DNS服务器实现的分布式数据库。
  2. 一个运行主机查询分布式数据库的应用层协议。DNS协议运行在UDP之上。

DNS通常由其他应用层协议(如HTTP、SMTP和FTP)所使用,用于将用户提供的主机名解析为IP地址。例如,当请求URL www.someschool.edu/index.html页面时,为了使用户的主机能够将一个HTTP请求发送到Web服务器www.someschool.ed,该用户主机必须获得www.someschool.edu的IP地址。其做法为:

  1. 同一台用户主机上运行着DNS应用的客户机端。
  2. 该浏览器从上述URL中抽取出主机名www.someschool.edu,并将这个主机名传给DNS应用的客户机端。
  3. 该DNS客户机向DNS服务器发送一个包含主机名的请求。
  4. 该DNS客户机最终会收到一份回答报文,包含对于主机名的IP地址。
  5. 一旦浏览器接收到来自DNS的IP地址,它就可以向该IP地址定位的HTTP服务器发起一个TCP连接。

除了进行主机名到IP地址的转换外,DNS还提供了一些重要服务:

  1. 主机别名(host aliasing):有着复杂主机名的主机可以用于一个或者多个别名。原始主机名叫做规范主机名(canonical hostname)。应用程序可以调用DNS来获得主机别名对于的规范主机名已经主机的IP地址。
  2. 邮件服务器别名(mail server aliasing):电子邮件应用程序调用DNS,对提供的邮件服务器别名进行解析,以获得该主机的规范主机名以及IP地址。事实上,MX记录允许一个公司的邮件服务器和Web服务器使用相同的(别名化的)主机名。
  3. 负载分配(load distribution):DNS也用于在冗余的服务器之间进行负载分配。繁忙的站点被冗余分别在多台服务器上,每台服务器均运行在不同的端系统上,有着不同的IP地址。对于这些冗余的服务器,一个IP地址集合对应于同一个规范主机名。DNS数据库存储着这些IP地址集合。当客户机为映射到这个IP地址集合的名字发出一个DNS请求时,该服务器用包含全部这些地址的报文进行回答,但每个回答中旋转这些地址的顺序。客户机通常总是向IP地址排在最前面的服务器发送请求,所以DNS就在所有冗余的服务器之间旋转分配负载。
  • IP地址和域名的转换
  • 主机的别名
  • 邮件服务的别名
  • 负荷分配:有些Web可能有多个服务器,即会有多个IP地址对应一个域名,可调整IP地址的顺序以分配负荷。

DNS作为一个网络核心功能,为什么要放在应用层?
  与网络结构设计理念有关,网络中主机很多映射很复杂,希望将复杂度留在端系统中,而不是在网络核心。

DNS工作机理

应用程序调用DNS的客户机端,并指明要转换的主机名,用户主机上的DNS接收到后,向网络中发送一个DNS查询报文。所有DNS请求和回答报文使用UDP数据报经端口53发送。经过若干毫秒时延后,用户主机上的DNS接收到一个DNS回答报文,这个结果被递送到调用DNS查询的应用程序中。

DNS的一种简单设计方式是在因特网上只使用一个DNS服务器,该服务器包含所有映射。但是这样会有很多问题:

  1. 单点故障:如果该服务器崩溃,整个因特网随之瘫痪。
  2. 通信容量:单个DNS服务器不得不处理所有DNS查询。
  3. 远距离的集中式分布:单个服务器不可能接近所有查询的客户机,因此会造成严重的时延。
  4. 维护:单个服务器将不得不为所以的因特网主机保留记录。使得整个中央数据库非常庞大,而且不得不解决为每个新添加的主机而频繁更新。

为此,DNS采用了分布式设计方案,DNS是因特网上实现分布式数据库的典范。

分布式、层次数据库

一个客户机得到www.amazon.com的IP地址的步骤:

  1. 客户机先查询根域名服务器,得到顶级域名服务器.com DNS server的地址;
  2. 客户机查询顶级域名服务器.com DNS server,得到权威域名服务器amazon.com DNS server的地址;
  3. 客户机查询权威域名服务器amazon.com DNS server,得到www.amazon.com的IP地址

根服务器:因特网上存在13个根服务器(标号A到M)。尽管我们将这13个每个视为单独的服务器,但每台“服务器”实际上是冗余服务器集群,以提供安全性和可靠性。

顶级域服务器:这些服务器负责顶级域名如(com、org、net、edu和gov)和所有国家的顶级域名。

权威域名服务器:

  • 组织自己的DNS服务器,用来提供组织内部的域名到IP地址的映射
  • 由组织自己或者服务提供商来维护

本地域名服务器:

  • 严格来说不属于层级结构
  • 每个ISP都会有一个本地域名服务器,也叫做默认域名服务器(default name server)
  • 当主机要进行DNS查询时,查询会被直接送到本地的DNS服务器。
  • 作用:
    • 缓存:可以缓存最近收到的域名到IP地址的映射(缓存有时效,会过期)
    • 代理:可以作为代理,代替主机在层级结构中进行查询

DNS查询方法

1. 迭代查询:

  被联系到的服务器会将后一个服务器的名字反馈回来,即“我不认识这个域名,但是你可以去问另一台服务器。

  下面的迭代查询过程,利用本地域名服务器作为代理迭代查询域名对于的IP地址。

2. 递归查询:

​ 把域名解析的负担交给了联系到的域名服务器,这种方法对于高级的负担增加,所以一般采用迭代查询而不采用递归查询。

DNS缓存

  • 一旦域名服务器学习到了一个映射,它就会缓存这个映射。缓存往往在本地域名服务器里,这样可以减轻根域名服务器的压力。
  • 缓存有效时间TTL,过了有效时间该缓存就会被删除。
  • 更新/通知机制:由IETF制定的 RFC2136 标准。
      如果中途域名主机改变IP地址,整个网络可能都不知道真正的IP地址,直到TTL到时,所以需要更新/通知机制。

DNS记录和报文

实现DNS分布式数据库的所有DNS服务器共同存储着资源记录(Resource Record,RR),RR提供了主机名到IP地址的映射。每个DNS回答报文包含了一条或多条资源记录。

资源记录是一个包含了下列字段的4元组:

1
(Name, Value, Type, TTL)

TTL是该记录生存时间,它决定了资源记录应当从缓存中删除的时间。Name和Value的值取决于Type:

Type Name含义 Value含义
A 主机名 IP地址。
NS 域(如foo.com 知道如何获得该域中主机IP地址的权威DNS服务器主机名。
CNAME 别名 规范主机名
MX 别名 邮件服务器的规范主机名

为了获得邮件服务器的规范主机名,应该请求一条MX记录,为了获得其他服务器主机名应该请求一条CNAME记录。

如果一台DNS服务器是指定某特定主机的权威DNS服务器,那么该DNS服务会有一条包含该主机名的A记录。如果DNS服务器不是某个主机名的权威DNS服务器,那么该服务器包含一条NS记录(我觉得NS记录应该不是在服务器中存储的,应该是更具请求生成的),该记录对应于包含主机名的域;还有一条A记录,该记录提供了在NS记录中的Value字段中DNS服务器的IP地址。

type可以是以下这些类型:

type 类型
A 地址记录
AAAA 地址记录
AFSDB Andrew文件系统数据库服务器记录
ATMA ATM地址记录
CNAME 别名记录
HINFO 硬件配置记录,包括CPU、操作系统信息
ISDN 域名对应的ISDN号码
MB 存放指定邮箱的服务器
MG 邮件组记录
MINFO 邮件组和邮箱的信息记录
MR 改名的邮箱记录
MX 邮件服务器记录
NS 名字服务器记录
PTR 反向记录
RP 负责人记录
RT 路由穿透记录
SRV TCP服务器信息记录
TXT 域名对应的文本信息
X25 域名对应的X.25地址记录

DNS报文

DNS只有两种报文,并且查询和回复有着相同的格式,如下图:

DNS报文中各字段语义如下

  1. 前12个字节是首部区域,其中有几个字段。第一个字段是16比特的数,用于标识该查询。这个标识符会被复制到对查询的回答的报文中,以便让客户机用它来匹配发送的请求和接收到的回答。标识字段中有多个标志。1比特的“查询/回答”标识位指出是查询报文(0)还是回答报文(1)。当某DNS服务器正好是被请求主机的权威DNS服务器时,1比特的“权威的”标识位被置位在回答报文中。如果客户机(主机或者DNS服务器)希望DNS服务支持递归查询,将设置1比特的“希望递归”标志位。如果该DNS服务器支持递归查询,则回答报文中会对1比特的“递归可以”标志位置位。在该首部还有4个“数量”字段,指出在首部后四类数据区出现的数量。
  2. 问题区域包含着正在进行的查询信息。该区域包括:1.名字字段,用于指出正在被查询的主机名字。2.问题字段,用于指出正被查询的问题类型(A、MX等)。
  3. 来自DNS服务器的回答报文中,回答区域包含了对最初请求的名字的资源记录(RR)。一个回答报文的回答区域可能有多条RR,因为一个主机名可能对应多个IP地址。
  4. 权威区域包含了其他权威DNS服务器的记录。
  5. 附加区域包含了一些有帮助的信息。

可以使用nsloopup程序来进行DNS查询。该程序的使用命令是:

1
2
3
nslookup -qt=type domain [DNS-server];
//例如
nslookup -qt=mx baidu.com 8.8.8.8

在DNS数据库中插入记录

当向某些注册登记机构注册域名networkutopia.com时,需要向该机构提供基本权威DNS服务器和辅助权威DNS服务器的名字和IP地址(不是域名本身的IP地址)。假定该名字和IP地址是dns1.networkuptopai.comdns2.networkuptopai.com已经212.212.212.1212.212.212.2。对这两个权威DNS服务器的每一个,该注册机构确保将一个类型NS和一个类型A的记录输入到TLD com服务器。如:

1
2
(networkuptopia.com,dns1.networkuptopai.com,NS)
(dns1.networkuptopai.com, 212.212.212.1, A)

此时查询时,首先TLD com回复本地DNS一个NS信息,而后本地DNS再次查询TLD com获取含义networkuptopia.com的权威服务器地址,这里是212.212.212.1。而后查询权威DNS服务器来获取IP地址。

P2P文件分发

在P2P文件分发中,每个对等方都能够重新分发其所有的该文件的任何部分,从而协助服务器进行分发。

P2P体系结构的扩展性

下图展示了文件分发的示意图,其中所有字母的含义如图所示:

如果选用客户机-服务器结构

  • 服务器上传:需要上传这份文件 N次,上传速度为 us,则需要的上传时间为 NF/us

  • 客户机下载:每个客户机都需要下载文件,dmin 是客户机最小下载速度,则客户机下载的最大时间为 F/dmin

      客户机-服务器结构的分发时间

      此处的N导致耗费的时间随要下载的节点的数量线性增长,当要下载的节点数目大时,要耗费相当多的时间。

      不需要先上传完再下载,以分组为单位发送,可以忽略上传到下载的时间。

如果选用P2P结构

  • 服务器上传:服务器至少要上传1次文件,上传时间为 F/us

  • 客户机下载:每个客户机都要下载文件,客户机最大下载时间为F/dmin

  • 客户机上传:每个下载了文件的客户机都可以上传文件,此时总上传速率可以达到

      P2P结构的分发时间

客户机-服务器结构和P2P分发时间对比

BitTorrent

  • 文件分为大小为 256Kb的块(chunk)
  • 每个节点负责上传和下载的文件块
  • 追踪器(tracker):追踪参加洪流的节点
  • 洪流(torrent):有一组节点相互交换文件块
  • 新的节点想下载文件,先询问追踪器参加的节点,再从相近的节点处下载文件块

  • 节点加入洪流:
    • 本身没有文件块,但是随着时间的推移会从其他节点获取文件块
    • 需要在追踪器进行登记,并且一般连接临近的节点
  • 下载时,节点会上传文件块到其他节点
  • 节点可以更改交换文件块的节点
  • 节点随时会上线和下线
  • 一旦节点有了完整的文件,它可以离开或者留在洪流中

请求文件块

  • 在给定的时间,不同的节点拥有不同的文件块
  • 一定周期,新的节点会问每个节点有哪些块
  • 新节点会从其他节点处下载缺失的文件块
    最稀缺优先(rarest first):如果有10个节点都有第1、2块,只有一个节点有第3块,则先下载第3块。

发送文件块

  发送文件块遵守一报还一报原则(tit-for-tat)

  • 节点会给目前给它发送文件块速率最高的四个节点发送文件块,其他节点就不发送了,每隔 10s 会选出新的top4

  • 每隔 30s 会随机选择其他节点发送文件块,这样这个随机节点可能就会成为新的top4

    tit-for-tat原则:上传速率快的节点相应地得到高下载速率的回报。

视频流和内容分发网

因特网视频

视频是一系列的图像,通常以一种恒定的速率来展示。视频能够被压缩。可用比特率来衡量视频质量。比特率越高,质量越好。

HTTP和DASH

在HTTP流中,视频只是存储在HTTP服务器中作为一个普通文件,每个文件有一个特定的URL。当用户看视频时,客户与服务器创建一个TCP连接并发送对该URL的HTTP GET请求。服务器以底层网络协议和流量条件允许的尽可能快的速率,在一个HTTP响应报文中发送该视频文件。客户端,字节被收集在应用缓存中,一旦该缓存中的字节数量超过预先设定的门限,客户端应用程序就开始播放。特别的,流式视屏应用程序周期性的从客户应用程序缓存中抓取帧,解压缩并在屏幕上展示。

在不同客户与不同时间,客户的可用带宽不同,这导致了一个新型基于HTTP的流的研发,被称为经HTTP的动态适应流(Dynamic Adaptive Streaming over HTTP,DASH)。在DASH中,视频编码为几个不同版本,其中每个版本具有不同的比特率,对应于不同质量水平。客户动态请求来自不同版本且长度为几秒的视频段数据块。当可用带宽较高时,客户自然地选择来自高速率版本的块,当可用带宽较低时,客户自然的选择来自较低速率版本的块。

使用DASH后,每个视频版本存储在HTTP服务器中,每个版本都有一个不同的URL。HTTP服务器也有一个告示文件(manifest file),为每个版本提供了一个URL及其比特率。客户请求告示文件,获得不同版本。然后客户通过在HTTP GET请求报文中对每块指定一个URL和一个字节范围,一次选择一块。在下载块的同时,客户端也测量接受带宽并运行一个速率决定算法来选择下次请求的块。

内容分发网

建立单点服务器是最简单的方法,但存在二个弊端:

  1. 若客户远离数据中心,服务器到客户从分组将跨越许多通信链路,会造成严重时延。
  2. 视频可能经过相同的通信链路发送多次,这造成了网络带宽的浪费,视频公司也要向因特网发送相同字节而向其ISP运营商支付费用。

因此,主要视频流公司都利用内容分发网(Content Distribution Network,CDN)。CDN管理分布在多个地理位置上的服务器,在它的服务器中存储视频(和其他类型的Web内容,包括文档、图片和音频)的副本,并且所有试图将每个用户请求定向到一个提供最好用户体验的CDN位置。CDN可以是专业CDN,也可以是第三方CDN。

CDN通常采用两种不同的服务器安置原则:

  1. 深入:通过在遍及全球的接入ISP中部署服务器集群来深入到ISP接入网中。
  2. 邀请做客:通过在少量关键位置建造大集群来邀请到ISP做客。不是将集群放在接入ISP中,这些CDN通常将他们的集群放置在因特网交换点(IXP)。

一旦CDN的集群准备就绪,就可以跨集群复制。而一般采取的是拉策略:如果一个客户向未存储该视频的集群请求某视频时,该集群检索该视频(从某中心仓库或者另一个集群),向客户端流式传输视频的同时在本地存储一个副本。

CDN操作

当用户主机中的一个浏览器指令检索一个特定视频(URL)时,CDN必须截获请求,以便能够:

  1. 确定此时适用于该客户的CDN服务器集群;
  2. 将客户请求重定向到该集群的某台服务器。

大多数CDN利用DNS来截获和重定向请求。考虑一个简单的例子来说明通常是如何涉及DNS的。假定一个内容提供商netcinema雇佣了第三方CDN公司kingcdn来向客户分发视频。在netcinema的web网页上,它的每个视频被指派了一个URL,该URL包含一个字符串“video”以及该视频本身的独特标识符,如转化器7可以指派为http://video.netcinema.com/6Y7B23V。接下来出现下图的步骤:

  1. 用户访问位于netcinema的Web网页。
  2. 当用户访问http://video.netcinema.com/6Y7B23V时,该用户主机发送一个对于video.netcinema.com的DNS请求。
  3. 用户的本地DNS服务器(LDNS)将该DNS请求中继到一台用于netcinema的权威DNS服务器,该服务器观察到主机名video.netcinema.com中的字符串“vedio”。为了将DNS请求移交给kingcdn,netcinema权威DNS服务器并不返回一个IP地址,而是向LDNS返回一个kingcdn域的主机名,如a1105.kingcdn.com。
  4. 从这时起,DNS请求进入了kingcdn专用DNS基础设施。用户的LDNS发送第二个请求,此时是对a1105.kingcdn.com的DNS请求,kingcdn的DNS系统最终向LDNS返回kingcdn内容服务器的IP地址。正是在这里,在kingcdn的DNS系统中,指定了CDN服务器,客户将能够从这台服务器接收到它的内容。
  5. LDNS向客户主机转发内容服务CDN节点的IP地址。
  6. 一旦客户收到kingcdn内容服务器的IP地址,它与具有该IP地址的服务器建立一条直接的TCP连接,并且发出对该视频的HTTP GET请求。如果使用DASH,服务器将首先向客户机发送具有URL列表的告示文件,每个URL对应视频的每个版本,并且客户机动态的请求不同版本的块。

集群选择策略

任何CDN部署,其核心是集群选择策略,即动态地将客户定向到CDN中某个服务器集群或数据中心的机制。CDN一般采用专用的集群选择策略。

一种简单的策略是指派客户到地理位置的最为邻近的集群。使用商用地理位置数据库,每个LDNS IP地址都映射到一个地址位置。当从一个特殊的LDNS接收到一个DNS请求时,CDN选择地理位置上最为接近的集群。但这存在问题,即地理位置最近的集群不一定是就网络路径长度与跳数而言的最近。同时,该策略忽略了时延和可用带宽随因特网路径时间而变化,总是为特定的客户指派相同的集群。

CDN能够对其集群和客户之间的时延和丢包性能执行周期性的实时测量。

套接字

目标:建立客户机/服务器的应用中的通信运用socket

socket:相当于应用进程和点对点传输协议之间的一扇门

socket类型:对应TCP和UDP有两种socket

UDP套接字编程

UDP:客户机与服务器之间没有连接

  • 发送数据前不需要握手

  • 发送数据包附加IP地址+端口号

  • 接收方从数据包中提取处IP地址+端口号

      UDP提供的是一种不可靠的数据流传输,传输过程中可能会丢包,接收的时候顺序也可能被打乱。

UDP中的socket编程示例

UDP服务器代码

1
2
3
4
5
6
7
8
9
10
11
12
13
UDPServer.ipynb
from socket import * #引入socket库

serverPort = 12000 #服务器端口号
serverSocket = socket(AF_INET, SOCK_DGRAM) #创建服务器套接字
serverSocket.bind(('', serverPort)) #给套接字绑定端口号
print('The server is ready to receive.')

while True: #服务器要一直在线等待,所以给一个死循环
message, clientAddress = serverSocket.recvfrom(2048) #从服务器套接字中读取信息(发送的消息和客户机IP地址+端口号)
modifiedMessage = message.decode().upper() #对消息进行处理(此处是改大写)

serverSocket.sendto(modifiedMessage.encode(), clientAddress) #将处理后的消息发回给客户机

UDP客户机代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
UDPClient.ipynb
from socket import * #引入socket库

serverName = gethostname() #由于没得服务器,服务器主机用本机来当
serverPort = 12000 #服务器端口号
clientSocket = socket(AF_INET, SOCK_DGRAM) #创建客户机套接字

message = input('Input lowercase sentence:') #得到输入字符串
clientSocket.sendto(message.encode(),(serverName, serverPort)) #发送数据到相应主机名+端口号的服务器进程

modifiedMessage, serverAddress = clientSocket.recvfrom(2048) #接收服务器发回的消息
print(modifiedMessage.decode()) #显示接收的字符串

clientSocket.close() #关闭客户机socket

  1. 先运行UDPServer.ipynb,启动服务器运行。
  1. 先运行UDPClient.ipynb,进行客户机访问。

TCP中的socket编程

  • 服务器的先行准备

    • 服务器必须先运行
    • 服务器需要创建socket来连接客户机
  • 客户机连接服务器

    • 客户机需要创建自己的socket,明确服务器进程的IP地址和端口号
    • 客户机创建socket时,客户机和服务器之间需建立TCP连接
  • 服务器接收客户机消息

    • 服务器需创建一个新的socket,为了服务器进程能够和客户机进行通信
      • 要运行服务器与多个客户机进行通信
      • 用源的端口号来区分不同的客户机

      TCP提供的是一种可靠的字节流(byte-stream)传输(pipe)。

TCP中的socket编程示例

TCP服务器代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
TCPServer.ipynb
from socket import * #引入socket库

serverPort = 12000 #服务器端口号
serverSocket = socket(AF_INET, SOCK_STREAM) #创建服务器套接字(前台)
serverSocket.bind(('', serverPort)) #给套接字绑定端口号
serverSocket.listen(1)
print('The server is ready to receive.')

while True: #服务器要一直在线等待,所以给一个死循环
connectionSocket, addr = serverSocket.accept() #前台套接字接收到请求后,创建一个新的套接字(窗口)

sentence = connectionSocket.recv(1024).decode() #窗口套接字读取信息
capitalizedSentence = sentence.upper() #对消息进行处理(此处是改大写)

connectionSocket.send(capitalizedSentence.encode()) #将处理后的信息发回给客户机

connectionSocket.close() #关闭窗口套接字,前台套接字保持开放

TCP客户机代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
TCPClient.ipynb
from socket import * #引入socket库

serverName = gethostname() #由于没得服务器,服务器主机用本机来当
serverPort = 12000 #服务器端口号
clientSocket = socket(AF_INET, SOCK_STREAM) #创建客户机套接字(类型为字节流SOCK_STREAM)
clientSocket.connect((serverName, serverPort)) #TCP连接

sentence = input('Input lowercase sentence:') #得到输入字符串
clientSocket.send(sentence.encode()) #发送数据到服务器

modifiedSentence = clientSocket.recv(1024) #接收服务器发回的消息
print('From server:', modifiedSentence.decode()) #显示接收的字符串

clientSocket.close() #关闭客户机socket

  1. 先运行TCPServer.ipynb,启动服务器运行。

  2. 先运行TCPClient.ipynb,进行客户机访问。

100 -》 113