Web cache,也叫做proxy server,是络自个代替origin Web server满足HTTP request的网络实体,Web cache 有自己的磁盘存储器并在里边保存最近所请求object的copy,如图所示,用户的浏览器可以设置,让所有的HTTP requests都先通过Web cache,
虽然Web cache可以减少用户感知的response time,却产生一个新问题——cache中的拷贝也许会过时,也就是说,当cache还保存着上次的copy的时候,也许服务器里的数据已经被修改了,幸好HTTP有个机制可以让cache证实它内存中的objects are up to date ,这个机制叫做conditional GET,如果符合以下两项,一个请求就可以叫做conditional GET:1).请求方法是GET 2).请求信息包含一个行——If-Modified-Since : 咱举个栗子,proxy cache代替服务器发送请求
我们看到这个response中没有包含那个object ,因为带上那个object只会浪费带宽并且增加延迟,如果它还比较大的话更是这样 。这个回复中的络自304 Not Modified告知cache可以把自己本地的拷贝发给浏览器
到这里我们第一个协议的学习就结束了,这是我们第一个网络协议(一个应用程协议)——HTTP
典型的FTP会话中,用户想要从远端的计算机接收文件或发送文件给远端,为了用户能连接远端用户,用户必须提供用户识别和密码,提供这些授权信息之后,用户就可以从本地文件系统发送文件到远端文件系统,反之亦然, 下图是用户通过FTP user agent与FTP进行交互,用户先提供远端计算机的hostname,引发本地计算机的FTP client process与远端计算机的FTP server process建立TCP连接,然后用户提供用户身份证明和密码,这些会被当做FTP commands的一部分通过TCP连接发送出去,一旦服务器核准了这个用户,用户就可以把本地文件系统的文件复制到远端文件系统,反之亦然
HTTP和FTP都属于file transfer protocol,有很多共同点,例如,它们都运行与TCP之上,然而,这两个应用层协议之间也有些重要的不同点,最大的不同就是FTP用两个平行的TCP连接传输文件:a control connection和a data connection ,前者用来在两个host之间发送控制信息——比如用户身份证明,密码,commands to change remote directory,commands to “put”or“get“files, data connection就是用来传输文件的,因为FTP用单独的控制连接,FTP is said to send its control information out-of-hand,而HTTP,正如你想到的,所有的信息都是通过一个连接来传输,所以,HTTP is said to send its control information in-hand,我们接下来的章节还会看到,email的主要协议SMTP也是sends control information in-hand . 当用户与远端计算机开始FTP对话,client方先会与server方在服务器的21号端口建立control TCP connection,client方会通过这个连接发送用户身份证明和密码,也会通过它发送命令修改remote directory,当服务器收到一个请求文件的命令时,server方就会与client建立TCP data connection ,但是每个data connection发送一个file后就会关闭,下一个文件要发送的时候再建立新的data connection,因此,用FTP协议,这整个过程control connection一直是开着的,但是data connection每个文件都需要生成一个, 整个会话过程中,FTP服务器必须保存用户状态,特别是,服务器必须要用一个特定的用户账户来关联control connection,服务器还必须在用户浏览远端directory tree时随时追踪用户当前位置,为每个正在进行的会话追踪状态信息极大的限制了FTP可以同时支持的会话数目,我们回想HTTP,是stateless,不用追踪任何用户状态,
2.3.1 FTP Commands and Replics
我们用一些极其常用的FTP命令和回应来为这一小节作结,从client到server的命令和从server到client的回应,是以7-bit ASCII的格式通过control connection传输的,向HTTP命令一样,FTP命令也是readable by people ,每个命令由四个大写的ASCII字母组成,有些还有可选参数,下面是一些常用命令:
每个命令都会有个reply ,从server发送到client ,回应是三位数字,数字后边跟着可选的message,这种结构很像HTTP response message中的status code and phrase in the status line,下面是一些reply和可能的messages:
电子邮件是互联网发端时最受欢迎的应用,这些年来变得越来越制作精良而且功能强大,成为互联网上最重要,最有用的应用 in this section we examine the application-layer protocols that are at the heart of Internet e-mail,在这之前,我们先来大体看一下互联网邮件系统和它重要的组成部分
我们能从上图看出它的三个重要组成部分:user agents,mail servers,Simple Mail Transfer Protocol(SMTP),现在我们在发送方的立场下来讲述下这三个部分,Alice要发送邮件给Bob,user agent允许用户阅读,回复,发送,保存和写作messages,Microsoft Outlook和Apple Mail是电邮中user agent的代表,当Alice写完邮件之后,她的user agent会发送这个message到她的mail server,并把它放在mail server的发出队列中,当Bob想要读取message时,他的user agent会从他位于mail server的mailbox中提取出邮件, mail server组成了电邮基础设施的核心,每个接收者都在mail server里有一个mailbox,Bob的mailbox管理和保存别人发给他的信息,。 信息的顶向第章典型路径是从发送方的user agent开始,到达发送方的mail server,然后再到达接收方mail server,在server中信息会被保存到接收者的mailbox,当Bob想要读取信息的时候,mail server会需要对他进行验证(通过用户名和密码),Alice的mail server还必须能处理Bob的server出现故障的情况,如果第一次发送失败,那么Alice的server会重新把邮件放入队列中之后再发送,一般每30分钟尝试一次,如此往复,如果几天之后还没成功,那么server会抛弃它并发邮件通知发件人, SMTP是 Internet email最重要的应用程协议,它使用的是TCP协议在mail server间进行传输,同大多数应用层协议一样,SMTP有两个side,client side运行于发送方mail server,server side运行于接收方mail server,也就是每个mail server都会同时运行client side和server side的SMTP,When a mail server sends mail to other mail servers, it acts as an SMTP client. When a mail server receives mail from other mail servers, it acts as an SMTP server.
需要注意到的是SMTP通常不用中间的mail server来传输邮件,即使是有两个mail server在世界的两端,如果Alice的服务器在香港而Bob的服务器在圣路易斯,TCP连接就是直接连接这两个服务器的,特别的,如果Bob的服务器坏掉了,邮件就会保留在Alice的服务器中并尝试再次发送——message不会存储在什么中间的服务器 现在让我们详细看看SMTP是怎么将邮件从一个服务器发送到另一个服务器的,我们将会看到SMTP和人们面对面交互的协议有很多相似之处,首先,client SMTP会在和server SMTP在25号端口上建立TCP连接,如果server方不成功,那么client方会稍后再试,一旦TCP连接建立,client和server就会进行写应用层的握手——就像人们彼此交谈之前要先彼此自我介绍一样,SMTP clients和servers在交流之前也要自我介绍,在这个SMTP握手阶段,SMTP client会显示发件人的地址和收件人的地址,client和server自我介绍完之后,client就会发送message,SMTP可以依赖TCP协议的reliable data transfer service来保证服务器能完整无误的收到message,若果client还有message要发送给这个server的话,它还会用同一个TCP连接传输,否则的话就关闭TCP连接 下面我们看个例子,这是个在SMTP client和SMTP server间所传输消息的事例记录,client的主机名是crepes.fr ,服务器的主机名是hamburger.edu,以C打头的正是client发送它自己TCP socket里的lines,同样以S打头的就是服务器发送到它自己的socket里的lines,下面的记录在TCP连接一旦建立就会开始
上边的例子中,client从mail server crepes.fr发送给mail server hamburger.edu一条消息,client发出了五个命令,HELO ,MAIL FROM ,RCPT TO ,DATA ,QUIT .这些命令时不言自明的,The client also sends a line consisting of a single period, which indicates the end of the message to the server. (In ASCII jargon, each message ends with CRLF.CRLF, where CR and LF stand for carriage return and line feed, respectively.) 服务器为每条命令发出回复,每条回复都有个数码和一些(可选择的)英文说明,我们在这里说明SMTP用的是persistent connection ,如果发送方的mail server有好几个消息需要发送给同一个接收方的mail server的话,那么它们可以使用同一个TCP连接,对于每条信息,client会从一个新的MAIL FROM :crepes.fr命令开始重复这个过程,designates the end of message with an isolated period, and issues QUIT only after all messages have been sent.
2.4.2 Comparison with HTTP
现在我们简单的对比下SMTP和HTTP,两个协议都是用来把文件从一个计算机传输到另一个计算机,HTTP在Web server和Web client之间传输文件,SMTP在两个mail server间传输文件,传输文件时,persistent HTTP和SMTP都是用persistent connection,因此两个协议有共同点,然而,它们还有明显的不同,首先,HTTP is mainly a pull protocol——人们从服务器加载信息并且从利用HTTP从服务器拉信息,特别是,TCP是想要收到文件的机器启动的,另一个方面,SMTP is primarily a push protocol——发送方mail server把文件push给接收方的mail server ,特别是,TCP连接是由想要发送文件的一方启动的 第二个不同,我们是说早期,SMTP需要每个消息,包括消息的内容,都必须是7-bit ASCII 格式,如果消息中含有内容不是7-bit ASCII,那这个消息需要被编码成7-bit ASCII,HTTP协议不实行这种限制 第三个不同关于一个包含有文本和图片(或者其他media types)的文档是怎么被处理的,HTTP会对每个object进行封装,而Internet mail把多有objects放在一个message中
现在我们看一下交易阶段(transaction phase),一个应用POP3的agent可以被设置成“download and delete”和“download and keep”,后来POP3 user agent发出的命令将取决于选择的是以上哪个模式,在download and delete模式中,用户代理会发出list,retr,dele命令,举例,假设用户卖了mailbox中有两封邮件,下面是栗子
用户代理先是让服务器列出所有储存的邮件,然后用户代理从服务器中依次取出并删除了邮件,重点指明在授权阶段后,用户代理就只使用四个命令:list,retr,dele,和quit,执行quit命令后,POP3服务器进入更新阶段,从mailbox中删除message1和2 一个关于这个模式的问题,接收方Bob想要在不同的机器上同步这些邮件,这种模式下如果他现在办公室PC上读了邮件,那晚些时候再在家里用笔记本读取就是不可能的,而download and keep模式,用户代理在下载完邮件之后仍然会让邮件保存在mail server中,然后Bob就可以在不同的终端读到邮件了 在POP3对话中,POP3会保存些状态,特别的,它会记录别标记要删除的邮件,However, the POP3 server does not carry state information across POP3 sessions. This lack of state information across sessions greatly simplifies the implementation of a POP3 server.
我们介绍了两种识别主机的方法,人们更偏爱易于记忆的一种,而路由器更喜欢长度固定,层次严格的IP地址,为了调和这些偏好,我们需要一种目录服务来把hostname转化成IP地址,这就是DNS(domain name system)的主要任务, The DNS is (1) a distributed database implemented in a hierarchy of DNS servers, and (2) an application-layer protocol that allows hosts to query the distributed database. DNS服务器一般是运行BIND(Berkeley Internet Name Domain)软件的UNIX机器,DNS协议运行在UDP协议之上并且使用53端口 DNS通常是被别的应用层协议雇佣——包括HTTP,SMTP , FTP ,来将用户提供的hostname转换成IP地址,举个栗子,想想看浏览器访问www.someschool.edu/index.html,为了能使用户的计算机向Web server发送HTTP request,用户的计算机必须获得这个URL的IP地址,步骤如下 1).这个用户机器必须要运行DNS应用的client side 2).浏览器从URL中提取出hostname,并将hostname发送到client side of the DNS application 3).DNS客户端发送一个包含这个hostname的查询到DNS服务器端 4).DNS客户端收到回复,会包含这个hostname对应的IP地址 5).一旦浏览器得到了IP地址,它就可以与那个IP地址上80端口上的HTTP server process创建一个TCP连接 从上面我们看出DNS又增加了一种delay——有些时候对应用它的application影响还是很大的,幸好,我们需要的IP地址通常都会cached in a “nearby”DNS server,这能帮助减少DNS network traffic和average DNS delay
除了转换hostname为IP地址外,DNS还提供一些其他的服务:
Host aliasing :就是如果主机的hostname很复杂可以有一个或者多个别名,比如hostname : relay1.west-coast.enterprise.com可以叫别名,enterprise.com或者www.enterprise.com ,这种情况下,原来那个长的要命的hostname叫做canonical hostname,应用可以调用DNS通过别名或者IP地址获得canonical hostname Mail server aliasing :很明显的原因,email address也需要易记,例如Bob有个Hostmail的账号,也许他的email地址很简单,就像bob@hotmail.com ,然而Hostmail的mail server的hostname可就不是这么简单易记了,这里DNS也可以提供向第一条中一样的服务,实际上,the MX record允许一个公司的mail server和Web server用相同的hostname或者别名,例如,一个公司的Web server和mail server可以都叫做enterprise.com Load distribution :DNS还可以用来执行replicated servers的负载分布,例如replicated Web servers,busy sites,比如cnn.com are replicated over multiple servers,每个server都运行在不同的终端系统并且有不同的IP地址,对于replicated servers,很多IP会与同一个cannoical hostname,DNS数据库会保存这所有的IP地址,the server responds with the entire set of IP addresses, but rotates the ordering of the addresses within each reply,由于HTTP请求消息往往会用列表中的第一个IP,DNS会把这些浏览分发到replicated servers,DNS轮转还被应用到email所以mail servers可以有相同的别名,一些大公司会在更多的领域应用DNS来分发网络流量
2.5.2 Overview of How DNS Works
下面就具体看下hostname-to-IP-adress的转换服务 假设用户主机上的一些应用需要将hostname转换成IP地址,那么这个应用得调用client side of DNS,得到需要转换的hostname,然后DNS就会向网络发送一个query,所有的DNS query都是用UDP datagram在53端口发送的,经过一个毫秒到秒级的延迟,DNS会收到回复消息,提供所请求的mapping ,然后它会被送到那个调用DNS的应用,因此,在那个应用的角度,DNS就是个提供简单直接翻译服务的黑箱,但是事实上,这个黑箱很复杂,有很多分布在全球的DNS服务器组成,就像一个具体阐明DNS服务器是怎么与发送query的计算机交流的应用层协议 设计一个简单的DNS,要有个DNS服务器,里面有所有的mapping,这种集中制的设计,clients直接把所有的query都发送到这个单独的DNS服务器,这个服务器也是直接将回复发送给clients,虽然这种简单的设计很有吸引力,但是对今天的互联网是不适合的,由于今天的hosts数量非常庞大,所以这种设计的主要问题如下: 1).A single point of failure:如果DNS服务器崩溃了,那整个互联网怎么办, 2).Traffic volume,一个服务器得掌控所有的DNS query(所有的HTTP request和从成千上万的计算机上聚集来的email messages) 3).Distant centrallized database:只有一个服务器意味着不可能离每个client都很近,如果把这个服务器放在纽约,那所有的澳洲的query必须穿过大半个地球,或许这时候线路还很拥堵,那么就会造成很大的delay 4).Maintenance :这个单独的服务器得保存互联网中所有主机的记录,不管是这会造成数据库非常大,而且为了让所有的计算机都包含进来得频繁更新
为了解决规模问题,DNS用了大量的服务器,把他们设计成层次结构样式并且分布到全世界,没有一个DNS拥有互联网中全部主机的mapping,取而代之,这些mapping都是分布在很多DNS服务器里,大致上有三类DNS服务器:root DNS servers ,top-level domain(TLD)DNS servers,understand DNS servers,如下图所示
为理解这三类DNS服务器怎么交互,假设DNS client想要确定www.amazon.com的IP地址,大体上会有下面的步骤,client首先连接root server,这个服务器会返回顶级域名com的IP地址给TLD servers,然后client再与one of these TLD servers连接,这个服务器会返回给一个authoritative server amazon.com 的IP地址,最后,client连接一个authoritative server,这个服务器会返回hostname的IP地址,我们接下来会仔细讲这个过程,但是在那之前我们先看看这三类DNS server
Root DNS servers ,互联网中有13个root DNS server(以A到M标记),大部分坐落在北美,虽然我们好像提到这13个根DNS服务器每个都是一个单独的服务器,为了安全也是为了可靠,其实这每个服务器都是一个服务器群(a network of replicated servers),总起来,截止2011年秋季,总共有247个root servers
Top-level domain(TLD)servers :这些服务器对顶级域名负责,例如,com ,org,net,edu,gov,还有国家顶级域名,例如uk,fr,ca,jp,The company Verisign Global Registry Services maintains the TLD servers for the com top-level domain, and the company Educause maintains the TLD servers for the edu top-level domain
Authoritative DNS servers: Every organization with publicly accessible hosts (such as Web servers and mail servers) on the Internet must provide publicly accessible DNS records that map the names of those hosts to IP addresses. An organization’s authoritative DNS server houses these DNS records. An organization canchoose to implement its own authoritative DNS server to hold these records; alternatively, the organization can pay to have these records stored in an authoritative DNS server of some service provider. Most universities and large companies implement and maintain their own primary and secondary (backup) authoritative DNS server. 除了上边图中的DNS server类型,还有一个重要的类型是local DNS server,这种服务器严格来讲不属于服务器的层次结构,但对于DNS服务器的架构来说却是核心的,每个ISP——例如大学,学术部门,公司,或者a residential ISP——都有a local DNS server(也叫做default name server),当计算机连接了ISP,ISP会为计算机提供IP地址,通过它的一个或者多个local DNS servers 。在Windows或者Unix中你可以通过网络状态窗口轻易的知道你的local DNS server的IP地址,一般一个计算机的local DNS server都会离它比较近,对于一个机构的ISP,本地DNS服务器也许就和计算机在同一个局域网中,通常用几个路由器把它和计算机分隔开,当host发出一个DNS query,这个query会被发送到local DNS server,服务器里会运行一个proxy,把query发送到DNS层次结构中,就像我们前边讲的那样
DNS服务器一起实现DNS的分布式数据库来存储resource records(RRs),包括提供postname-to-IP-address mapping RRs,每个DNS reply message携带一个或多个resource records A resource records is a four-tuple that contains the following fields : (Name,Value,Type,TTL) TTL代表resource records的生命时间,也就是决定何时这个records会被从cache中清除,下面的例子中我们忽略TTL,这里Name和Value的意义决定于Tyoe 1).若Type=A,这是Name就是hostname,Value就是这个hostname的IP地址,因此,A类型的记录提供了标准的hostname到IP的mapping,举例,(relay1.bar.foo.com, 145.37.93.126, A)就是A类型记录 2).若Type=NS,则Name就时域名(比如,foo.com),Value就是一个authoritative server的hostname,这个server知道怎么在域内获得计算机的IP地址,这种记录使DNS query继续沿查询链前进,例如,(foo.com, dns.foo.com, NS)就是个NS记录 3).若Type=CNAME,Value就是规范主机名,Name就是别名,这个记录可以提供别名到主机名的查询,例如,(foo.com, relay1.bar.foo.com , CNAME)就是个CNAME记录 4).Tyoe=MX,则Value就是mail server的标准名称,Name就是其别名,例如(foo.com, mail.bar.foo.com, MX)就是个MX记录,重点指出,用MX记录,一个公司的mail server和一个其他的服务器(比如Web服务器)可以使用同一个别名,为了获得mail server的标准主机名,DNS client得查询MX记录;为了获得其他类型服务器的标准主机名,DNS client得查询CNAME记录
If a DNS server is authoritative for a particular hostname, then the DNS server will contain a Type A record for the hostname. (Even if the DNS server is not authoritative, it may contain a Type A record in its cache.) If a server is not authoritative for a hostname, then the server will contain a Type NS record for the domain that includes the hostname; it will also contain a Type A record that provides the IP address of the DNS server in the Value field of the NS record. As an example, suppose an edu TLD server is not authoritative for the host gaia.cs.umass.edu. Then this server will contain a record for a domain that includes the host gaia.cs.umass.edu, for example, (umass.edu, dns.umass.edu, NS). The edu TLD server would also contain a Type Arecord, which maps the DNS server dns.umass.edu to an IP address, for example, (dns.umass.edu, 128.119.40.111, A).
DNS Messages
1).前12个字节是header section,这里有若干fields,第一个field是一个16-bit的数字用来识别query,这个识别符还会copy到query的回复中,以便client把query和reply对应起来,flag field中有若干flag,1-bit的 query/reply flag来表明这是一条query(0)还是一条reply(1);1-bit的authoritative flag被放入reply message中当一个DNS服务器是一个被查询name的authoritative server;1-bit的recursion-desired flag会别set当client(或者host,DNS server)因为没有被查询记录而想要DNS服务器来进行递归时;1-bit的recursion-available field会被set在reply中,如果DNS服务器同意递归;在header中,还有四个number-of fields,These fields indicate the number of occurrences of the four types of data sections that follow the header. 2).question section 包含发出的query中的信息,这个部分包含(1)一个name field保存有被查询的name(2).一个type field标识被查询的类型,比如,a host address associated with a name (Type A) or the mail server for a name (Type MX). 3).In a reply from a DNS server, the answer section contains the resource records for the name that was originally queried. Recall that in each resource record there is the Type (for example, A, NS, CNAME, and MX), the Value, and the TTL. A reply can return multiple RRs in the answer, since a hostname can have multiple IP addresses (for example, for replicated Web servers, as discussed earlier in this section). 4).authority section包含了其他authoritative server的记录 5).additional section包含其他有用的记录,For example, the answer field in a reply to an MX query contains a resource record providing the canonical hostname of a mail server. The additional section contains a Type A record providing the IP address for the canonical hostname of the mail server. 你想如何把一个DNS query从你工作的计算机直接发送到DNS server呢?nslookup program可以轻松的完成这件事,这个program在大多数Windows和Unix平台都有,例如,在Windows计算机上,打开命令行并调用nslookup program,然后你就可以向任何DNS server发送query,从DNS server收到reply之后,nslookup会显示reply中的记录(以人能读懂的方式)。
Inserting Records into the DNS Database
上边的讨论集中于记录是怎么从database中提取的,也许你会先想到这些记录是怎么进入到database的,让我们用一个栗子来看看这是怎么完成的,假设你刚刚搞了家名叫Network Utopia的初创公司,你想做的第一件事肯定是在注册机构注册域名 networkutopia.com ,注册处是个商业组织,保证域名的唯一性,把域名放入到database中,并为它提供给你的服务收取少量费用, 当你注册了你的域名,你还得向注册处提供你的主要的次要的authoritative server的名称和IP地址,假设两者分别是dns1.networkutopia.com dns2.networkutopia.com和212.212.212.1 212.212.212.2, For each of these two authoritative DNS servers, the registrar would then make sure that a Type NS and a Type Arecord are entered into the TLD com servers. Specifically, for the primary authoritative server for networkutopia.com, the registrar would insert the following two resource records into the DNS system: (networkutopia.com, dns1.networkutopia.com, NS) (dns1.networkutopia.com, 212.212.212.1, A)
你还得确认你的Web server的A类型记录和mail server的MX记录已经进入到你的authoritative DNS server中,(知道最近,DNS中的内容还是静态配置的,然后更近的时候,UPDATE选项被加入到DNS协议来允许通过DNS messages来动态的增添或删除数据库中的数据)
当所有这些步骤完成后,人们才可以访问你的网站并且给你公司的员工发送email,让我们通过一个案例来总结我们的DNS discussion,这个案例会加固我们对DNS的掌握 假设澳大利亚的Alice想要访问上边提到的那个刚注册的网站,像我们先前讲到的一样,她的计算机会先给local DNS server发送一条query,然后local DNS server会连接一个TLD com server(如果TLD com server的地址没有被缓存的话还得访问root DNS server),这个TLD服务器中包含上边提到的那个NS类型和A类型的resource record,由于注册机构已经把这些records都插入到TLD com server,然后TLD com server会给local DNS server发送一条reply,里边包含连个resource records,local DNS服务器就会想212.212.212.1发送一条查询信息,请求与www.networkutopia.com对应的A类型记录,这个记录提供被需要的Web server的IP地址212.212.71.4,local DNS会把这个地址发给Alice的计算机,然后Alice的浏览器就可以与这个IP地址建立一个TCP连接并用这个连接发送HTTP request,卧槽,上网的时候往往不是你看到的那么简单(作者就是这么说的)