本章讲的是计算机网路的应用层。
首先介绍了网络应用的两种结构体系:cs架构和P2P架构。
然后介绍了进程、IP地址、端口号等基本概念。
区分了TCP和UDP(包括SSL)并介绍了基于这两个链路层协议的应用服务。
基于上述基础,重点讲解了HTTP、SMTP、POP3、DNS(域名映射,配置个人域名时用到过该知识)。以及P2P文件传输。最后介绍了视频流的传输(涉及到DASH,基于HTTP的动态流适应)和内容分发(涉及到CDN服务器,在使用七牛云时用到过该知识)。
对于application developer来说,网络架构(Network architecture)是固定的,它能为应用提供一些列特定的服务。而应用架构(application architecture)是由应用开发者设计的,基于不同的end systems。有两种主要的架构:cs架构(client-server architecture)和P2P架构(peer-to-peer architecture)。
Web、FTP、Telnet、e-mail都是采用cs架构的应用
文件分享应用BitTorrent,迅雷下载,网络电话、视频会议Skype等都是采用P2P架构的应用。
即时通信应用(Instant messaging application)混合使用了两种架构中的元素,使用服务器追踪用户的IP地址,而用户间的消息在双方的主机间直接发送。
A network application consists of pairs of processes that send messages to each other over a network.即便是P2P架构,在通信时,我们也可以把两个进程分别标记为client和server。
标识一个进程,需要明确两部分信息:主机地址(在互联网中,主机可以被IP地址唯一标识)以及端口号(port number: 可以标识主机中的特定应用程序)。
常见的端口号:如Web服务器运行在80端口,邮件服务运行在25端口等,以后会专门总结。
许多网络都提供多种传输层协议,不同的协议提供不同的服务。我们要根据应用需要选择最适合自己的协议。我们从四个方面对传输层协议为应用程序提供的服务进行分类,分别是可靠数据传输(reliable data transfer)、吞吐量(throughput)、定时(timing)和安全性(security)。
Reliable Data Transfer
如果协议能够保证,数据能够正确且完整的传输到目的地,那么称该协议提供可靠的数据传输(Reliable Data Transfer)。电报、邮件、文件下载等都需要可靠的数据传输。而像视频会议等即使丢失少量数据,也不影响使用的可容忍丢失的应用**(loss- tolerant application**),则不需要。
throughput
因为共享带宽等原因,网络吞吐量是随时间波动的。有的协议可以提供最小传输速率的保证。像网络电话(以固定速率编码,需要以固定速率发送信息)等 **带宽敏感应用(bandwidth-sensitive application)就需要这种服务。而有的弹性应用(elastic applications)**如电子邮件、web应用等对吞吐量的要求没有那么严格。
timing
网络电话、视频会议、多人游戏等(interactive real-time applications)交互式实时应用程序对时间要求很严格,需要较低的时间延迟delay。
security
传输层协议可以提供一种或多种安全性服务。如发送方对数据进行加密(encrypt),接收方进行解密(decrypt)。除机密性confidentiality外,还有其他安全性服务,如数据完整data integrity 和端点鉴别end-point authentication。
互联网(因特网或TCP/IP网络)为应用程序提供了两种传输层协议:TCP和UDP。两种协议提供不同的服务。
TCP提供面向连接的服务以及可靠数据传输的服务。
UDP是只提供基本服务的轻量级传输协议(UDP is a no-frills, lightweight transport protocol, providing minimal services)。
UDP是 无连接(connectionless) 的,所以通信前无需进行握手。
UDP的数据传输是不可靠的(unreliable data transfer service),接收方的UDP socket可能收不到完整的/正确顺序的信息。
UDP不提供拥塞控制机制,所以发送方可以以任意速率向下层发发送数据。
注:由于很多防火墙被配置成了阻挡(大多数类型的)UDP流量,所以很多依赖UDP的应用同时也提供TCP版本的备份,如Internet telephony。
应用层协议规定了:
应用层协议有的是公开的(specified in RFCs and in the public domain),如HTTP协议。也有许多协议是专有的,如Skype使用自己专用的应用层协议。
An application-layer protocol is only one piece of a network application.
HTTP (超文本传输协议: HyperText Transfer Protocol) is the Web’s application-layer protocol.
一个网页(Web page)由object(如HTML file,JPEG image…)组成。每个object由唯一的URL标识。URL由两部分构成:存储资源的服务器主机名以及该object的路径名。如:
http://www.someSchool.edu/someDepartment/picture.gif
浏览器(Web browser)实现了HTTP的客户端(client side),在Web中,browser与client是等价的。Web server实现了HTTP的服务器端,存储Web object。常见的Web服务器有Apache和Microsoft Internet Information Server。
HTTP定义了Web client请求Web page的方式,以及server传输Web page的方式。
HTTP是基于TCP实现的,需要建立TCP连接。
Server只响应client的请求,而不会存储任何有关client的信息,所以HTTP也叫做无状态协议(stateless protocol)。
对每一次的request/response使用单独的TCP连接发送,叫做非持续连接(non-persistent connections);对所有的request/response都使用相同的TCP连接发送,叫做持续连接(persistent connections)。持续链接是HTTP的默认方式,但也可以将HTTP client和server配置为非持续连接的。
HTTP with Non-Persistent Connections
当请求带有10张图片的网页时,需要建立11个TCP连接,分别请求并响应每个文件的传输。这11个连接可以时串行(serial TCP connections)建立的,也可以是并行建立(parallel TCP connections)的(在默认设置下,大多数浏览器会开启5-10个并行的TCP连接,每个连接处理一次request-response。
缺点:每一个object都需要建立且维护一个全新的connection,对于每个连接,在client和server都要分配TCP buffer以及 TCP variables。对web server造成很大的负担。而且,每次建立TCP 都要消耗很长时间(one RTT to establish the TCP connection andd one RTT to request and receive an object)。
(RTT: round-trip time: a small package发送到server并返回client的往返时间)
HTTP with Persistent Connections
在server发送响应后,保持TCP连接open,之后相同的client发送后续请求时能够通过相同的TCP连接进行传送(带有10张图片的网页,只需要1个TCP连接)。如果连接经过一定的时间间隔(timeout interval)未被使用,则会被关闭。
首行为请求行(request line),之后的行叫首部行(header lines)。
请求行由三部分组成:the method field(GET/POST/PUT/DELETE/HEAD…), the URL field, the HTTP version field.
(HEAD与GET类似,但是服务器收到HEAD方法的请求时,会用一个HTTP message进行响应,而不是传回需要的object)
首部行指明了 (1)object所在的host(即使连接已经建立,但该字段仍是需要的,is required by Web proxy caches)。(2)Connection: close表明不想要建立持续连接,服务器在响应了client请求的object后可以直接关闭连接。(3)User-agent 指明浏览器的种类,如火狐浏览器。以便服务器发送同一object的不同版本。(4)Accept-language :表明client更想获得该语言版本的object。这只是HTTP众多content negotiation headers之一。
(cr: carriage return回车,lf: line feed换行
Entity body用于POST方法中提交的表单信息)
HTTP response message响应报文:
response message由三部分组成:status line状态行, 6行header lines首部行, entity body实体体。entity body 是主要部分,包含了所请求的object本身。
status line包含三个field:协议版本(protocol version field), 状态码(status code), 状态信息(corresponding status message)。
header lines: (1)Connection: close: 表明在发送完消息后,TCP连接关闭。(2)Date: 表明server创建并发送该response的日期和时间。(3)Server:与 User-agent类似,用来表明服务器的类型。(4)Last-Modified: 请求的object的创建时间/最近修改时间,对object caching极为重要(client or cache servers/proxy servers)。(5)Content-Length:发送的object的字节数。(6)Content-Type :表明object类型,这里是HTML text,object类型应该由该字段正式表示,而非用文件后缀名代替。
常见的状态码(status code) 即状态信息(associated phrases)
2XX 表明服务器成功处理了请求。
3XX 表明完成请求需要进一步操作,通常用来重定向。
4XX 表明请求可能出现了错误,妨碍了服务器的处理。
5XX 表明服务器处理请求时发生了内部错误。
200 OK: 请求正确处理且请求的数据成功返回
301 Moved Permanently: 表明请求的object被永久转移了,新的URL位于响应报文header的Location字段。浏览器会自动获取新URL。
400 Bad Request: 通用的error code,表明server无法理解该request。
404 Not Found: server找不到请求的document。
505 HTTP Version Not Supported: server不支持当前请求的HTTP协议版本。
HTTP是无状态协议,这简化了server的设计并且允许server处理多个并发的TCP连接。但是,这样server就无法获取client的状态并且无法根据client的状态来改变响应。HTTP使用cookies来restrict user access or serve content as a function of the user identity.
Web cache-also called a proxy server– is a network entity that satisfies HTTP requests on the behalf of an origin Web server. 浏览器与Web cache间建立TCP连接,Web cache与server建立连接。再浏览器发送请求时,Web cache会检查是否已经存有要请求的object。
Content Distribution Networks(CDNs) : 在互联网上安装了许多geographically分散的caches,实现了大量流量的本地化(localize)。
好处:
问题:
proxy server上的object可能是过时的(stale)。
解决方法:The Conditional GET
HTTP请求如果要成为Conditional GET 有两个条件:是GET请求,且首行包含If-Modified-Since字段。
An HTTP request message is a so-called conditional GET message if (1) the request message uses the GET method and (2) the request message includes an If-Modified-Since: header line.
例:
proxy cache 向Web server发送的请求:
Web server发送回proxy server的response:
proxy server本地存储该object并记录Last-Modified时间。过一段时间,client向proxy server请求该object时,proxy server会发送conditional GET到server,检查该object是否被更新。
如果object更新了Web server就发送最新的object回proxy server,否则为empty entity body。
304表示proxy server可以直接将cached copy发送回浏览器。
Internet mail system有三个主要部分:
限制了邮件body只能采用ASCII表示,传输能力不足,如果要发送图片等,需要将二进制的多媒体数据编码转化为ASCII码,使用SMTP传送后,再还原为多媒体数据。
SMTP使用的persistent connection,可以用同一个TCP连接发送多个邮件,每个message使用心得MAIL FROM: XXX开始,用独立的句点表示邮件结束。当所有的邮件发送完后才发送QUIT。(使用SMTP指令即可发送邮件,如HELO、MAIL FROM、RCPT TO、DATA、QUIT等)。
相同点:
不同点
From:必要
To: 必要
Subject等head line是可选
以前接收方需要登陆到server host并通过该server的mail reader来阅读邮件。而现在使用client-server架构,用户在自己的end system来read e-mail,enjoy a rich set of features, 包括浏览附件和多媒体信息。用户自己的end system上运行user agent,用来向mail server获取自己的邮件。
用户从自己的主机上向mail server拉取自己的邮件的过程,可以通过特定的mail access protocol实现。如Post Office Protocol-Version 3(POP3), Internet Mail Access Protocol(IMAP) 以及 HTTP。
SMTP用于将邮件从发送方的mail server发送到接收方的mail server以及将邮件从发送方的user agent发送到自己的mail server.
POP3等mail access protocol用于将邮件从接收方的mail server传送到接收者的user agent.
POP3: 很简单,功能也很有限。
IMAP: 有更多的features但实现也更复杂
POP3 access中,接收方可以将邮件下载到本地(创建文件夹并将邮件信息等保存到文件夹中),而且对下载后的邮件进行操作(删除、移动文件夹等),对邮件的操作不会同步更新到mail server。对于多主机用户来说很不方便。而IMAP将message与folder相关联,当邮件到达后,便与用户的INBOX folder相关联起来。接收者可以将这些信息移到新的folder中进行操作。这些操作都会同步更新到mail server(remote folders)。
与POP3不同,IMAP server通过IMAP session维护用户状态信息,如文件夹名,以及文件夹中关联的messages。
IMAP允许user agent获取部分信息,如只获取header of message或以部分MIME message。
(该特性在低带宽时十分有用)。
Web-Based E-Mail
有两种方式可以唯一标识一台主机(host)。分别是主机名(hostname)和IP address。
hostname可读性强,方便记忆;IP地址有层次结构,长度固定,可以被路由器处理。
DNS服务器如果是centralized design(只有一个服务器),很难scale。具体有如下问题:
由于上述问题的存在,DNS is distributed by design。
DNS服务器是分布式的、分层次的。没有一台服务器记录了所有主机的映射关系。大致有三种类型的DNS服务器。
除此外,还有local DNS server,本地DNS服务器,由ISP(如一个大学、一个系或者运营商)提供。当host发送DNS查询时,会被首先发送到本地DNS服务器,再由本地DNS服务器发送该请求,起到代理的作用。
以访问 gaia.cs.umass.edu 为例
多数时,TLD DNS Server需要通过一系列authoritative DNS server才能知道最终需要的hostname对应的ip地址,即只知道intermediate DNS server。如TLD DNS server知道Massachusetts大学的DNS server,该大学DNS server又知道各个系的server,并将该请求发送给cs专业的server,由该DNS返回最终需要的ip地址。
查询的过程利用了递归查询(recursive query)和迭代查询(iterative query)。从host到local DNS server发出的查询是递归查询。而之后Local DNS server发出的是迭代查询。
DNS Caching是DNS系统的一项重要特性。通过DNS 缓存可以提高查询的性能,减少要发送的DNS数量。在第一次发出DNS请求后,收到DNS reply的DNS server可以将获得的映射(mapping)存储到本地。之后再有对相同hostname的DNS reply,该server可以直接返回结果,而不用向其他server请求。因为hosts以及hostname与ip之间的映射可能发生变化,所以DNS server仅将cached information保留一段时间(通常设置为2天)。
DNS servers的数据库中从存储着resource records(RRs),RRs提供了hostname到IP地址的映射。每条DNS reply message都载有一条或多条resource record。
每条resource record是一个4元组,包含了4部分信息:
TTL: time to live of the resource record.决定了该resource何时应从缓存中清除。
Type有很多种,决定了Name和Value字段的含义。
Type=A,Name是hostname,Value是指向hostname的IP地址。
Type A record提供标准的hostname-to-IP address mapping。
Type A record示例:(relay1.bar.foo.com, 145.37.93.126, A)
Type=NS,Name是domain(如foo.com),Value是authoritative DNS服务器的hostname,该DNS服务器存储着该域名下的hosts的IP address。
Type NS record用于将DNS query路由到其他服务器。
Type NS record:(foo.com,dns.foo.com, NS)
Type=CNAME,Name为Value中指定的canonical hostname(规范主机名)的别名。
Type CNAME record用于查询hostname的规范主机名。
Type CNAME record:(foo.com,relay1.bar.foo.com, CNAME)
Type=MX,Name为mail server的canonical name(Value)的别名,Name为该hostname的别名。
Type MX record允许邮箱服务器有简短的别名。但是该别名可能既是邮箱服务器的别名,又是Web服务器的别名。如果请求的是邮箱服务器,client需要发送请求MX record,而请求其他服务器,则需要发送请求CNAME record。
(foo.com, mail.bar.foo.com, MX)
如果DNS server is authoritative for a particular hostname,他应该保对该hostname 的 Type A record(记录了对应的ip地址),注:即使不是该hostname 的权威服务器,也可能在cache中存储了Type A record。如果DNS server is not authoritative for a hostname,该server应该保存对该hostname 的Type NS name(路由到权威DNS服务器),同时包含一条Type A record(记录了要路由的权威服务器的ip地址)。
DNS query message和 reply message有着相同的格式。
CS结构随着peer增加成线性增长,而P2P表现出了很好的扩展性。
BitTorrent是非常流行的P2P协议,用于文件的分发。所有参与一个特定文件分发的peers的集合称为 torrent。 peers in a torrent从另一个peer下载equal-size chunks,通常为256KB。当peer累计下载了许多chunks后,他将边下载边上传。
每个torrent都有一个infrastructure node,叫做tracker。当有peer加入torrent,它将在tracker上注册,并且周期性的通知tracker是否还在torrent中。
假如Alice新加入torrent。tracker将随机选择部分peers,并将他们的IP地址发送给Alice。Alice尝试与ip list上的所有peer建立TCP连接。Alice成功建立的连接称为neighboring peers。neighboring peers随着旧peer的离开和新peer加入发生变化。
在任何时刻,每个peer都有该文件的部分chunks,不同的peer有不同的部分。Alice会周期性的通过TCP连接,向neighboring peers获取他们拥有的chunks。Alice采用rarest first技术选择要请求的chunks,请求当前neighbors拥有的最少的chunks,这样能够使得chunks能更快在torrent中平均分布。BitTorrent使用一种trading algorithm来发送chunks。首先Alice会根据目前以最高速率向他发送数据的neighbors进行给定优先级,并选择四个以最高速率发送数据的neighboring。然后她会向这4个peers发送chunks。每过10s,将重新计算速率,可能会修改这4个peers。这4个peers称为unchoked。每过30s,她将随机选择另外一个neighbor并向他发送chunks。这个neighbor称为optimistically unchoked。由于Alice向该随机选的neighbor(如Bob)发送了数据,所以她可能成为Bob的4个unchoked peers之一,反之如果Bob以高速率向Alice发送数据,Bob也可能成为Alice的unchoked peers之一。
现有的压缩算法可以将视频压缩成任何想要的比特率。比特率越高,质量越好。为了视频能连续的流畅播放,网络的平均吞吐量至少要达到压缩视频的比特率。
在HTTP streaming中,video存在HTTP服务器,有特定的URL,就像普通文件请求一样。一旦client收到的数据超过某个阈值(buffer中),就可以进行视频的播放。
HTTP streaming无法选择同一视频的不同比特率/质量的版本。所以出现了Dynamic Adaptive Streaming over HTTP(DASH)。在DASH中,同一video根据比特率/质量分为不同的版本,每个版本都存在HTTP server中,且有不同的URL。视频不同版本的URL、比特率信息存在服务器的manifest file中。client会首先请求manifest file获取该视频各个版本的信息。通过在HTTP GET请求信息中制定URL 和 byte range一次请求一个chunk。然后根据宽带,通过rate determination algorithm选择要请求的下一个chunk(包括版本url以及该chunk 的byte range)。
为了解决分发massive amounts of videos and other types of Web content, including documents, images and audio,许多公司使用了Content Distribution Networks(CDNs)。CDNs管理着分布在不同地域的server,server上存放着content的副本,用于将用户请求发送到能够提供最好用户体验的CDN server中。
CDNs通常采用以下两种不同的server placement philosophies中的一种:
服务器集群中的CDN server并不会为所有content都进行备份。而是采用类型Web caching的技术缓存热点。
如NetCinema利用第三方CDN KingCDN缓存videos。当host访问 http://video.netcinema.com/6Y7B23V 时,NetCinema权威DNS服务器在处理 video.netcinema.com 的请求时,会将该DNS查询交付给KingCDN,返回KingCDN的hostname而不是要请求的网站的IP地址。然后Local DNS server向KingCDN的DNS server发起请求,返回合适的CDN server的ip地址。
从服务器集群选择合适的CDN 服务器提供服务,有多种方法。
从服务器集群选择合适的CDN 服务器提供服务,有多种方法。