资讯详情

【2021-09-22 修订】【梳理】计算机网络:自顶向下方法 第二章 应用层(docx)

计算机网络

知 识 梳 理

(第一版)

建议先修课程:数据结构。 配套教材: Computer Networking - A Top Down Approach, 8th edition James F. Kurose, Keith W. Ross 参考书目: 1.计算机网络(第8版) 谢希仁 编着 高等教育出版社


链接:https://pan.baidu.com/s/1QGAsUur33TPXdJicMHupGw 提取码:0000


二 应用层

声明 本书涉及的网站:www.3134.com、jasmine.org、www.oust.edu.cn和gakuen-toshi.ac.jp,所有这些都是为例编造的假想网站。这本书发表后,经过测试,一些网站有有有害信息。这纯粹是巧合。请珍惜生命,远离恶意网站。 2.1 网络应用背后的原理 现代网络应用程序常用的架构是:客户端-服务器(client-server,C-S)结构和对等(peer-to-peer,P2P)结构。 C-S体系结构中,长期在线的主机称为服务器,服务来自其它主机(客户端)的请求。当Web当服务器收到客户端浏览器对象的请求时,将请求对象发送到客户端主机作为响应。在C-S在结构上,客户端不直接通信。此外,众所周知,服务器是固定的IP地址(见后文)。由于服务通常运行很长时间,客户端总是可以通过服务器IP与服务器联系的地址发送数据包。具有C-S系统结构的应用包括:Web、FTP、Telnet电子邮件等。 通常,在C-S单服务器不能满足应用程序中的所有要求。如果社交网站只有一个服务器处理请求,很快就会不堪重负。因此,数据中心经常被使用。搜索引擎(例如Google、Bing、百度),互联网商务(Amazon、eBay、基于阿里巴巴等),Web电子邮件(例如Gmail和Yahoo Mail),社交网络(如,Facebook、Instagram、Twitter和微信一起使用几个数据中心。必须保证供电和维护,数据中心可以拥有数十万的服务器。此外,服务提供商必须为数据中心支付互连和带宽费用。 在P2P在架构上,对专用服务器的依赖性很小(或不)。相反,应用程序使用间歇连接直接在主机之间通信,称为对等(peers)。对等方不属于服务提供商,而属于用户本身,主要位于家庭、大学和办公室。对等方不需要通过专用服务器通信,因此被称为P2P。包括文件共享在内的许多流量密集型应用(如BitTorrent)、P2P辅助下载加速,以及互联网电话和视频会议(如Skype),都基于P2P架构。有些程序是混合的C-S和P2P架构:在许多即时通信程序中,服务器跟踪用户IP但用户到用户的消息直接发送到用户主机之间,而不是通过中间服务器。 P2P可扩展性是架构最引人注目的特征之一(self-scalability)。例如,在P2P在文件共享中,每个对等方通过要求文件产生工作量,但也通过向其他对等方分发文件来增加系统的服务容量。P2P由于通常没有大量的服务器和服务器带宽,成本很低。但是,由于P2P应用程序高度分散,因此面临着安全、性能和可靠性的挑战。

网络应用程序由通过网络成对发送信息的过程组成。在Web在中间,客户端浏览器的过程和Web在服务器过程中交换信息。在P2P在文件共享中,文件从一个对等方的过程传输到另一个对等方的过程。在一对过程的通信会话中,启动通信的过程(主动在会话开始时联系另一个过程)是客户端,等待联系的过程是服务器。对于Web,浏览器过程是客户端,Web服务器过程是服务器。对于P2P文件共享,一般是下载进程为客户端,上传进程为服务器。  大多数网络应用程序包括多个通信过程,每个过程相互通信。过程中传输的任何信息都必须通过网络。这个过程被称为套接字(socket)软件接口收发消息。套接字是主机应用层与运输层之间的接口,也属于应用程序编程接口(API),位于应用程序和网络之间。应用程序开发人员可以控制套接字应用层一侧的所有内容,但套接字的运输层一侧几乎无法控制——运输层唯一的控制权是: (1)选择传输协议; (2)运输层参数层参数(如最大缓冲区和最大段大小,见第三章)。 一旦应用程序开发人员选择了传输协议(如果可选),就会使用协议提供的运输层服务来构建应用程序。  为了识别接收过程,需要指定两个信息:主机的地址和目标主机中接收过程的标识符。 在Internet中间,主机通过IP唯一的地址标识。由于主机通常同时运行许多网络应用程序,因此接收过程也必须确定主机中运行的接收过程(具体来说,是接收套接字)。目标端口号(port number)确定接收过程。特定端口已分配常用应用:Web服务器(HTTP)端口号为80,邮件服务器流程(使用SMTP)端口号为25,HTTPS的端口是443。所有Internet标准协议的端口号可以在www.iana.org上找到。  发送端通过套接字发送消息。在套接字的另一端,运输层协议负责将信息发送到接收过程中的套接字。许多网络(包括Internet)提供多个运输层协议。在开发应用时,必须选择其中一种。 运输层协议能为调用协议的应用程序提供哪些服务?我们分为四类: ·保证传输可靠性。网络中可能会丢失数据包:或溢出路由器缓冲区,或在某些位置损坏后被主机或路由器丢弃。对于许多应用程序(电子邮件、文件传输、远程主机访问,Web数据丢失可能会带来灾难性的后果,如文档传输和财务应用等。此时,必须确保发送的数据正确、完整地传输到另一端。如果协议提供这种保证,则说它提供可靠的数据传输。此时,发送过程确定:数据将正确到达。 当运输层协议不提供可靠的数据传输时,某些数据可能永远不会到达接收过程。这是可以接受的容错应用程序。最典型的是多媒体应用程序:这类程序通常会忽略少量的视频和音频数据丢失,成本是音频和视频的一些小缺陷。 ·吞吐量保证。吞吐量可能会波动,因为其他会话会共享带宽,会话数量可变。运输协议可以提供另一种服务:确保吞吐量。该服务适用于许多应用程序。例如,如果Internet电话以32 kbps编码语音,则需要保证至少以该速率将数据传送给对方。如果传输协议不能提供此吞吐量,应用程序应以较低的速度编码或拒绝继续发音。具有吞吐量要求的应用程序称为带宽敏感应用程序(bandwidth-sensitive application)。尽管它们可能使用自适应编码技术来匹配当前的吞吐量,但许多媒体应用程序对带宽很敏感。 有些应用程序更容易适应不同的吞吐量,如电子邮件、文件传输和Web传输。当然,吞吐量越大越好。 ·延迟保证。就像吞吐量保证一样,延迟保证有多种形式。例子:发送方在1000套接字中注入每个人 ms到达接收者的套接字。该服务适用于交互式实时应用程序,如Internet电话、虚拟环境、远程会议和多人游戏都需要严格的传输延迟。延迟过长会导致网络通话不自然停顿。在多人游戏或虚拟互动环境中,采取行动与看到响应的间隔很长,会减少体验。对于非实时应用,较低的延迟也更好,但不需要严格保证端到端延迟。 ·安全保障。传输协议可以为应用程序提供安全服务。例如,在发送主机中,传输协议加密发送数据;在接收主机中,运输层协议在数据到达接收过程前解密。即使数据在传输过程中被截获,也是秘密(confidentiality)也能保证。除了秘密,传输协议还可以提供其他安全服务,包括数据完整性和端点身份验证。  对数据丢失、吞吐量的网络应用程序对数据丢失、吞吐量和延迟的要求,仅供参考。 

应用程序 数据丢失 吞吐量 延迟敏感 文件传输 / 下载 不允许 一般无要求 无 电子邮件 不允许 一般无要求 无 Web文档 不允许 一般无要求 无 Internet电话 / 视频会议 允许某种损失 例如:音频32 ~ 1536 kbps 视频200 ~ 10000 kbps 例如:几百ms 流音频 / 流视频 允许某种损失 例如:几s 交互游戏 允许某种损失 例如:10 kbps左右 例如:几百ms 智能手机短信 不允许 一般无要求 可能有

TCP服务模型包括连接服务和可靠的数据传输服务。调用TCP获得这两项服务作为传输协议。 ·连接服务。在应用层报纸开始传输之前,TCP使客户端和服务器交换运输层控制信息。这种握手(handshaking)该过程提示客户端和服务器为接收数据做准备。握手之后,两个进程的套接字之间建立了TCP连接。TCP连接是全双工,两个过程可以同时发送信息。发送后,必须断开连接。 ·数据传输服务可靠。一方可以依靠TCP在不丢失、重复或乱序的情况下,将字节流传到接收套接字。 TCP还包括考虑拥塞控制机制的考虑Internet一般利益,而不是通信过程的直接利益。当网络在发送方和接收方之间拥堵时,客户端或服务器的发送速度将受到限制。第三章会看到,TCP还试图限制拥塞控制TCP连接,以确保网络带宽的公平分配。  TCP和UDP不提供任何加密。若将明文密码发送到套接字,则密码将在通过的所有链接上传播,并可被嗅探和发现。Internet社区已经开发出了针对TCP增强功能-运输层安全(transport layer security,TLS)。使用TLS的TCP传统不仅可以执行TCP所有程到过程的关键安全服务,包括加密、数据完整性和端点身份验证。必须强调,TLS不是与TCP和UDP同级第三个Internet传输协议是在应用层中实现的增强功能。如要使用TLS,它包含在程序的客户端和服务器端TLS代码(使用一些高度优化的库和类)。TLS有自己的套接字API,它与传统的TCP套接字API相似。使用TLS当发送过程将明文数据传到TLS套接字;然后,在主机中发送TLS加密数据,并将加密数据传输到TCP套接字。通过加密数据Internet传输给接收方TCP套接字,后者将加密数据传递给TLS,TLS对其解密。最后,TLS通过明文数据TLS套接字传递到接收过程。  UDP传输协议简单、轻便,服务尽可能少。UDP两个过程通信前无需握手,无需连接。UDP提供不可靠的数据传输服务,不保证信息到达接收过程。此外,到达接收过程的消息可能是混乱的。 UDP发送方可以以任何速度将数据泵入下层(网络层),而不包括拥塞控制机制。由于中间链路的传输容量有限或拥塞,实际的端到端吞吐往往低于此速率。

TCP提供了可靠的端到端数据传输;还可以使用TLS在应用层增强TCP,以提供安全服务。对于吞吐量或延迟保证,当今的Internet传输协议并不提供它们。但这并不意味着时间敏感应用程序(例如Internet电话)无法在当今的Internet中运行,因为它们被设计成能够最大程度地应对这种缺乏保证的情况。不过,当延迟过高或端到端吞吐量受限时,这些设计无法保证程序不受影响。总之,当今的Internet虽然可以使时间敏感型应用程序提供令人满意的服务,但不能提供任何延迟或吞吐量保证。
下面列举常用应用首选的传输协议。邮件、远程终端访问、Web和文件传输都使用TCP,主要因为TCP提供了可靠的数据传输,从而确保所有数据都能到达目的地。Internet电话通常不受少量数据丢失的影响,但对最低速率有要求,因此Internet电话的开发人员通常更喜欢给程序使用UDP,从而避免了TCP的拥塞控制和数据包带来的开销。但许多防火墙阻止(大多数类型的)UDP通信,因此Internet电话常被设计为在UDP通信失败时改用TCP。

应用程序 应用层协议 运输层协议 电子邮件 SMTP TCP 远程终端访问 Telnet TCP Web HTTP / HTTPS TCP 文件传输 FTP / TFTP / SFTP FTP / SFTP:TCP TFTP:UDP 流媒体 HTTP / HTTPS, DASH或私有的协议 UDP / TCP Internet电话 SIP, RTP或私有的协议 UDP / TCP 名称转换 DNS UDP 路由选择 RIP, OSPF RIP:UDP OSPF:不使用运输层协议,直接使用IP 自动配置IP地址 IPv4:DHCP IPv6:有状态配置时使用DHCPv6 UDP 远程文件服务器 NFS(网络文件系统) UDP 网络管理 SNMP UDP 多播 IPv4:IGMP IPv6:MLD UDP

网络进程通过向套接字发送报文来相互通信。这些报文的结构如何?各个字段的含义是什么?何时发送?这些问题与应用层协议有关。应用层协议定义了不同终端上运行的应用程序进程如何相互传递报文。具体来说,定义了:
·交换的报文类型,例如:请求报文和响应报文。
·不同类型报文的语法,例如:报文中的字段以及如何描述这些字段。
·字段的语义,即:字段中信息的含义。
·确定进程何时、如何发送或响应报文。

某些应用层协议在RFC中指定。遵循HTTP RFC规则的浏览器能够从同样遵循HTTP RFC规则的任何Web服务器中检索网页。许多应用层协议是专有的,在公共领域不可用。例如,Skype使用专有的应用层协议。
区分网络应用程序和应用层协议非常重要。应用层协议只是网络应用程序的一部分,定义的是应用进程间通信和交互的规则。Web是一个C-S结构应用程序,允许用户从Web服务器获取文档。Web应用由许多组件组成,包括文档格式标准(HTML)、浏览器(例如Chrome、Firefox和Microsoft Edge)、Web服务器(例如Apache和Microsoft IIS)及应用层协议。Web的应用层协议HTTP定义了浏览器和Web服务器之间交换的消息的格式和顺序。因此,HTTP只是Web应用程序的一部分。电子邮件应用程序具有许多组件,包括容纳用户邮箱的邮件服务器;允许用户阅读和创建消息的邮件客户端(例:Outlook);定义了邮件结构的标准;以及定义服务器之间、服务器和客户端之间如何传递及解释消息头的应用层协议,包括SMTP(2.3节)等。因此,SMTP等协议只是电子邮件应用的一部分。

2.2 Web和HTTP 万维网(World Wide Web,WWW)并非某种特殊的计算机网络。万维网是一个大规模的、联机式的信息储藏所,是一种存储信息的方式。WWW也简称Web。万维网能通过链接非常方便地从互联网上的一个站点访问另一个站点(也就是所谓的“链接到另一个站点”),从而获取丰富的信息。 WWW是由Tim Berners-Lee于1989年3月提出的。1989年夏,Tim成功开发出世界上第一台Web客户端和第一台Web服务器,并为他的发明正式定名WWW。为了让WWW快速促进世界的发展,Tim放弃申请关于WWW的一切专利。在2012伦敦奥运会(The London 2012 Summer Olympics)开幕式上,Tim Berners-Lee爵士亮相,并在一台NeXT计算机上打出了“This is for Everyone”字样。言外之意,互联网献给所有人。2017年,他因“发明万维网、第一个浏览器和使万维网得以扩展的基本协议和算法”,获得2016年度的图灵奖(Turing Award)。

万维网是分布式超媒体(hypermedia)系统,它是超文本(hypertext)系统的扩充。
超文本,是包含指向其它文档的链接的文本。一个超文本可以由分布在互连网上的多个信息源链接成。超文本是WWW的基础。超媒体与超文本的区别是文档内容不同:超文本文档仅包含文本信息;超媒体文档包含文本信息、图形、图像、声音、视频,等等。

超文本传输协议(HyperText Transfer Protocol,HTTP)是Web的应用层协议,也是Web的核心。HTTP在两个程序中实现:客户端程序和服务器程序。它们在不同终端上执行,通过交换HTTP报文来通信。HTTP定义了这些报文的结构,以及客户端和服务器如何交换报文。详细讲解HTTP之前,先回顾一些Web术语。
Web页面(也称为文档)由对象组成。对象(object)就是一个文件(例如HTML文件、PNG图像或视频剪辑),可以通过单个URL(uniform resource locator,通用资源定位符)进行定位。大多数网页由基本HTML文件(base HTML file)和几个引用的对象组成。如果一个网页包含HTML文本和5个PNG图像,则该网页具有6个对象。基本HTML文件使用对象的URL引用页面中的其它对象。关于HTML的介绍,参见本节后文。
URL包含两部分:存储该对象的服务器的主机名(hostname),以及该对象的路径名(pathname)。例如:

https://cse.oust.edu.cn/courses/nlp/intro.pdf 的主机名是cse.oust.edu.cn,路径名是/courses/nlp/intro.pdf。Web浏览器实现了HTTP的客户端,所以浏览器和客户端在这里是同义词。Web服务器实现HTTP的服务器端,存储了Web对象,每个对象都可以通过URL寻址。 HTTPS是使用安全套接层(SSL)的HTTP,将在8.6节学习SSL。 URL使用ASCII作为字符编码。其一般格式是: <协议>://<主机>:<端口>/<路径> 常见的协议有http、ftp和https。现在的浏览器为了方便用户,在输入URL时,可以把最前面的http://和主机名最前面的“www”省略,浏览器替用户把省略的字符添上。 HTTP的URL的一般形式是: http://<主机>:<端口>/<路径> HTTP的默认端口是80,通常可以省略。若再省略<路径>,则URL指向互联网上的某个主页(homepage)。 主页通常是: (1) 一个WWW服务器的最高级别的页面。 (2) 组织或部门的定制页面或目录。这样的页面可以链接到互联网上的与本组织或部门有关的其它站点。 (3) 由某人自己设计的描述他本人情况的WWW页面。 在URL的尾部,还可以添加可选的请求串(query string)。请求串部分是由ASCII字符“?”开头的。它的语法并没有明确定义,但传统一般是:“?”后跟随若干个key-value对,用分隔符分开。例如: https://3134.com/user/AndyBayerRoswell/worklist?filetype=audio&access=public 或 https://3134.com/user/AndyBayerRoswell/worklist?filetype=audio;access=public 在URL的尾部,还可以添加可选的分段(fragment),其开头为ASCII字符“#”。分段包含一个分段标识符(fragment identifier),提供到其它资源的重定向。比如,文章的段标题可以做成链接,链接就由URL的分段部分指示。当首选资源是HTML文档时,分段一般是特定元素的id标识符。点击带“#”的这类链接,浏览器将该元素滚动到指定位置显示。

HTTP定义Web客户端如何从Web服务器请求页面,以及服务器如何将网页传输到客户端。当用户请求Web页面时(例如,单击超链接,hyperlink),浏览器会将页面中的该对象的HTTP请求报文发送到服务器。服务器接收请求,并使用包含该对象的HTTP响应报文进行响应。
HTTP使用TCP作为基础传输协议而不是UDP。HTTP协议本身是无连接的。HTTP客户端首先启动与服务器的TCP连接。建立连接后,浏览器和服务器进程通过其套接字接口访问TCP:客户端通过其套接字接口发送HTTP请求报文并接收HTTP响应报文;HTTP服务器从其套接字接口接收请求报文并发送响应报文。客户端将报文发送到其套接字接口后,该报文就不再由客户端而由TCP控制。TCP为HTTP提供了可靠的数据传输服务。客户端发送的每份HTTP请求报文,最终都会完整到达服务器;服务器发送的每份HTTP响应报文,最终都会完整到达客户端。在这里,分层结构带来了一个巨大优势:HTTP不必担心数据丢失,也不必考虑TCP如何恢复丢失的数据或对数据重新排序。这些是TCP和低层协议的工作。
HTTP是面向事务的(transaction-oriented)应用层协议。事务(transaction),这里指一系列不可分割的信息交换,也就是说,要么所有的信息交换都完成,要么一次交换都不进行。

注意:HTTP服务器不存储有关客户端的任何状态信息,所以HTTP是无状态协议(stateless protocol)。如果同一客户端频繁请求相同的对象,在不被识别为恶意请求的情形下,服务器不会只返回已经传输过此对象的提示,而是重新发送该对象。
Web使用C-S结构。如2.1节所述,Web服务器长期在线,IP地址一般固定,为无数个浏览器的请求提供服务。

对于非持久连接(non-persistent connection),我们来看一看将网页从服务器传输到客户端的步骤。假设该页面包含1个基本HTML文件和10个PNG图像,基本HTML文件的URL是

https://cse.oust.edu.cn/nlp/index.htm 传输的过程是: 1、HTTP客户端进程启动到服务器cse.oust.edu.cn的TCP连接(DNS解析完毕后),端口默认为443。客户端和服务器将各有一个与建立的TCP连接关联的套接字。 2、HTTP客户端通过其套接字向服务器发送HTTP请求报文。请求报文包含路径名/nlp/index.htm。 3、HTTP服务器进程通过其套接字接收请求报文,从其存储器(RAM或磁盘)中检索对象/nlp/index.htm,将其封装在HTTP响应报文中,然后通过其套接字将响应报文发送给客户端。 4、HTTP服务器进程告诉TCP关闭连接(TCP确定客户端已经完整接收到响应后,才真正终止连接)。 5、HTTP客户端收到响应报文。TCP连接终止。报文指示了封装的对象是HTML文件。客户端从响应报文中提取并检查HTML文件,并找到对10个PNG对象的引用。 6、对每个引用的PNG对象重复前四个步骤。

浏览器接收到网页后,显示页面给用户。不同的浏览器可能以不同的方式解释(即显示)网页。HTTP与客户端如何解释网页无关,HTTP规范仅定义了客户端HTTP程序和服务器HTTP程序之间的通信协议。
以上步骤解释了非持久连接:每个TCP连接在服务器发送相应的对象后关闭,而不为其它对象保留。每个TCP连接恰好传输1份请求报文和1份响应报文。在此示例中,共生成了11个TCP连接。
上述步骤没有说明客户端是通过10个串行TCP连接获得了10幅PNG,还是某些PNG是通过并行TCP连接获得的。实际上,用户可以在浏览器中设置并行度。大多数浏览器默认最多打开5到10个并行TCP连接,每个连接都处理一个请求-响应事务。也可以将并行连接数设置为1。此时将串行建立10个连接。并行连接缩短了响应时间。

在继续之前,估计一下从客户端请求基本HTML文件到客户端接收整个文件所花费的时间。
往返时间(RTT),即小数据包从客户端到服务器再返回到客户端花费的时间,包括传播延迟、路由器和交换机中的排队延迟,以及处理延迟。用户单击超链接时,浏览器启动与Web服务器之间的TCP连接。这涉及三次握手(3-way handshake):客户端向服务器发送一个小的TCP段;服务器以一个小的TCP段进行确认;最后,客户端向服务器确认。握手的1、2部分计一次RTT。之后,客户端将HTTP请求与三路握手的第3部分(确认)一起发送到TCP连接。请求报文到达服务器后,服务器将HTML文件发送到TCP连接。这个HTTP请求/响应再计一个RTT。因此,总响应时间约为:2个RTT加上服务器耗费的检索、服务器间传输等的时间。

非持久连接有一些缺点。首先,必须为每个请求的对象建立并维护一个全新的连接。对每一个连接都必须分配TCP缓冲区,并且必须在客户端和服务器中都保留TCP变量。这可能会给Web服务器带来沉重负担。其次,每个对象会带来2个RTT的传播延迟,分别用于建立TCP连接、请求和接收对象。
有了HTTP 1.1持久连接(persistent connection),服务器在发送响应后保持TCP连接,用于发送同一客户端和服务器之间的后续请求和响应。具体而言,整个Web页面(上例包含基本HTML文件和10个图像)可以通过单个持久TCP连接发送。单个持久TCP连接还能将同一服务器上的多个Web页面发送到同一客户端。这些对对象的请求可以紧密发出,而无需一直等待答复(流水线化)。通常,HTTP服务器在一定时间(可更改)未通过该连接通信后,会关闭连接。当服务器接收到高密度的请求时,它将高密度地发送对象。HTTP默认使用带有流水线的持久连接。

HTTP报文有两种:请求报文和响应报文。下面是一份典型的HTTP请求报文:

GET /video/index.html HTTP/2.0 Host: www.3134.com Connection: close User-agent: Mozilla/5.0 Accept-language: zh-CN 首先,报文是用普通的ASCII文本编写的,所以可以直接阅读。其次,该报文由5行组成,每行的末尾是行分隔符CRLF,包括最后一行。HTTP请求报文有数行。第一行和随后的若干行分别称为请求行(request line)和报头行(header lines,首部行)。请求行包含3个字段:方法字段、URL字段和HTTP版本字段。方法字段可以是:GET,POST,HEAD,PUT和DELETE。多数HTTP请求使用GET方法。当浏览器请求一个对象时,使用GET方法,且在URL字段中标识所请求的对象。在此示例中,浏览器正请求/video/index.html,使用HTTP / 2.0。 本例中,报头行Host: www.3134.com指定对象所在的主机。您可能会认为此报头行是不必要的,因为已经有到主机的TCP连接。但Web代理缓存需要主机报头行提供的信息(见下文)。通过添加Connection: close报头行,浏览器告诉服务器:不想建立持久连接,希望服务器在发送请求的对象后关闭连接。User-agent报头行指定用户代理(User Agent,UA)。UA是代表使用者行为的软件代理程序提供的自己的标识符,在这里是向服务器发出请求的浏览器类型:Firefox浏览器Mozilla / 5.0。该报头行允许服务器将同一对象的不同版本发送给不同类型的UA(每个版本可以使用相同的URL),典型的例子就是网站的桌面版和移动版。最后,Accept-language报头指示用户希望接收对象的简体中文版本。如果服务器上存在该对象,则发送之;否则,服务器发送默认版本。Accept-language报头只是HTTP中可用的许多内容协商报头之一。 报头可以有好几行,但也可以不使用。

请求报文的一般格式如上图。在报头行之后,有一个“实体本体”(entity body)。实体本体在请求报文中一般不使用,在响应报文中也可以不使用。实体本体在使用GET方法时为空,但使用POST方法时不为空。当用户填写表单时(例如,向搜索引擎提供搜索词),HTTP客户端经常使用POST方法。如果方法字段为POST,则实体包含用户在表单字段中输入的内容。实体本体的换行符可以不是CRLF(Linux:LF;Mac:CR)。
包含表单的请求不一定使用POST方法。相反,HTML表单通常使用GET方法,并将输入的数据(在表单字段中)包括在请求的URL中。例如,如果表单使用GET方法,具有两个字段,分别输入“spider-man”和“trailer”,则URL的结构将类似于:https://ww.3134.com/video/search?spider-man&trailer。这种扩展URL十分常见。
HEAD方法类似GET方法。服务器接收到HEAD请求时,它将以HTTP报文进行响应,但不发送请求的对象。开发人员常使用HEAD方法进行调试。PUT方法通常与Web发布工具结合使用。它允许用户将对象上传到特定Web服务器上的特定路径(目录)。需要将对象上载到Web服务器的应用程序也使用PUT方法。DELETE方法允许用户或应用程序删除Web服务器上的对象。

方法(操作) 意义 OPTION 请求一些选项的信息 GET 获得URL对应的内容 HEAD 获得URL对应的内容的头部 POST 向服务器发送附带信息(如,注释或密码)的请求 PUT 向服务器上传数据到URL对应的位置 DELETE 删除指定URL对应的数据 TRACE 进行回环测试的请求报文 CONNECT 用于代理服务器

对HTTP请求报文,服务器可能会给出这样的响应报文:

HTTP/2.0 200 OK Connection: close Date: Sun, 11 Oct 2020 22:54:43 GMT Server: Apache/2.4.44 (Debian) Last-Modified: Sun, 11 Oct 2020 15:11:03 GMT Content-Length: 1919810 Content-Type: text/html

(data data data data data …) 此回复报文包含三个部分:初始状态行(status line),6行报头行,然后是实体本体(主体)。实体主体是报文的基础,它包含所请求的对象本身。状态行具有3个字段:协议版本字段,状态代码和相应的状态信息。在此示例中,状态行指示服务器正在使用HTTP / 2.0,并且一切正常(已找到并正在发送请求的对象)。 现在看报头行。Connection: close告诉客户端,将在发送响应后关闭TCP连接。Date报头行指示服务器创建和发送HTTP响应的日期时间。注意,这不是对象的创建或最后修改时间,而是服务器检索对象、将其插入响应报文并发送的时间。Server报头行指示该报文是由Apache Web服务器生成的;它类似于HTTP请求中的User-agent报头行。Last-Modified报头行指示创建或最后修改对象的日期时间。它对于本地客户端和网络高速缓存服务器中的对象缓存至关重要。Content-Length报头行指示要发送的对象的字节数(若不注意这点,可能在后端编程中遇到奇怪的问题)。Content-Type报头行表示实体主体中的对象是HTML文本(对象类型由Content-Type报头而不是文件扩展名正式表示)。

响应报文的一般格式如上图。状态代码和相关的短语表示请求的结果。

状态码 类别 例 含义 1xx 通知 100 Continue 继续。 101 Switching Protocols 正在切换协议。 102 Processing 处理中。 2xx 成功 200 OK 请求成功。 201 Created 对象已创建。 202 Accepted 服务器端已经收到请求消息,但尚未进行处理。 3xx 重定向 301 Moved Permanently 请求的对象已被永久移动;新的URL在响应报文的Location报头行中指定,客户端将检索新的URL。 304 Not Modified 请求的对象在指定日期后未被修改。 4xx 客户端错误 400 Bad Request 服务器无法理解该请求。 403 Forbidden 服务器(已理解请求但)拒绝该请求。 404 Not Found 找不到指定的对象。 5xx 服务器错误 500 Internal Server Error 内部服务器错误。 502 Bad Gateway 在网关访问下一个服务器时出错。 505 HTTP Version Not Supported 服务器不支持所请求的HTTP版本。

如何查看真实的HTTP响应报文?首先Telnet到指定的Web服务器。然后为服务器上存储的某个对象键入单行请求报文。例如,如果您有权访问命令提示符,键入

telnet gaia.cs.umass.edu 80 GET /kurose_ross/interactive/index.php HTTP/1.1 Host: gaia.cs.umass.edu (在最后一行键入后,按回车键两次) 这将打开与主机gaia.cs.umass.edu的端口80的TCP连接,然后发送HTTP请求报文。您应该会看到一份响应报文,其中包含教科书的作业题的基本HTML文件。如果只想查看报头行而不接收对象,则将GET替换为HEAD。 HTTP规范定义了许多报头行,它们可以由浏览器、Web服务器和缓存服务器插入。浏览器根据浏览器类型和版本(例:HTTP/1.0浏览器不生成任何1.1报头行)、用户配置(如:首选语言)及浏览器是否具有对象的缓存(可能已过期)构造报头行。Web服务器也类似:不同的产品、版本和配置,所有这些都会影响响应报文包含的报头行。

上面我们提到,HTTP服务器是无状态的。这简化了服务器设计,并允许工程师开发可以同时维持大量TCP连接的高性能Web服务器。但是,服务器需要限制用户权限,或根据用户身份提供内容。因此,网站通常希望标识用户。为此,HTTP使用cookie。Cookie允许网站跟踪用户。当今非常多的主要商业网站都使用cookie。
cookie具有四部分:
(1)HTTP响应报文中的cookie报头行;
(2)HTTP请求报文中的cookie报头行;
(3)保留在用户的最终系统,并由用户的浏览器进行管理的cookie文件;
(4)网站上的后端数据库。

我们通过一个示例演示cookie的工作原理。设Susan总是从家用PC访问Web,第一次访问amazon.com,已访问过eBay。请求进入Amazon Web服务器时,服务器创建一个唯一的标识号,并在后端数据库中创建一个由该标识号索引的条目。然后,Amazon Web服务器响应Susan的浏览器,在HTTP响应中包括Set-cookie报头。例如:

Set-cookie: 31d4d96e407aad42 Susan的浏览器收到HTTP响应报文时,会读取到Set-cookie报头。然后,浏览器为它管理的cookie文件添加一行,该行包括服务器的主机名和Set-cookie报头中的标识号。注意:cookie文件已经具有eBay的条目。随着Susan继续浏览Amazon,每次她请求一个网页时,浏览器都会查询她的cookie文件,提取站点的标识号,并将包含标识号的cookie报头行放在HTTP请求中。具体来说,她对Amazon服务器的每个HTTP请求都包含报头行 Cookie: 31d4d96e407aad42 通过这种方式,Amazon服务器记录Susan在该网站的活动。Amazon未必知道Susan的真名,但知道用户31d4d96e407aad42以什么顺序、在什么时间访问了哪些页面。Amazon使用cookie实现购物车服务——维护Susan所有预定购买的清单,以便她日后可以为它们一同付款。

如果Susan以后返回Amazon网站,则她的浏览器将继续在请求报文中添加报头行:

Cookie: 31d4d96e407aad42 Amazon还根据她访问过的网页推荐产品。如果Susan也在Amazon注册(提供全名、邮件地址、邮政地址和信用卡信息等),那么Amazon可以将该信息写入到数据库,从而将Susan的姓名与ID及过去曾在该网站访问过的内容关联。这就是电商网站提供的“一键购物”:Susan在后续购买商品时,无需重新输入姓名、信用卡号或地址。 Cookie可以用来识别用户。用户首次访问站点时,可以提供用户标识(可能是他或她的名字)。在后续会话期间,浏览器将cookie报头传递给服务器,从而为服务器标识用户。因此,可使用cookie在无状态HTTP之上创建用户会话层。比如,当用户登录Web邮件应用(例如Hotmail)时,浏览器将cookie信息发送到服务器,从而允许服务器在用户与应用程序的整个会话过程中识别用户。 Cookie之所以引起争议,是因为它们也可能侵犯隐私。结合Cookie和用户提供的帐户信息,网站可以了解很多有关用户的信息,并可能将该信息出售给第三方。Cookie Central包含有关Cookie争议的广泛信息。 有人认为Cookie会把计算机病毒带到用户的计算机中。其实这是对Cookie的误解。Cookie只是一个小小的文本文件,不是计算机的可执行程序,因此不可能传播计算机病毒,也不可能用来获取用户计算机硬盘中的信息。

Web缓存(Web cache),也称代理服务器(proxy server),是代替原始Web服务器满足HTTP请求的网络实体。Web缓存具有自己的存储,在存储中保留最近请求的对象的副本。可以配置用户的浏览器,以便每个对对象的浏览器请求都首先定向到Web缓存。浏览器请求对象时,将会发生下列事件:
1、浏览器建立到Web缓存的TCP连接,并将对该对象的HTTP请求发送到Web缓存。
2、Web缓存检查服务器上是否具有对象副本。若是,则将HTTP响应报文中的对象返回到客户端浏览器。
3、如果Web缓存中没有该对象,则Web缓存打开与原始服务器的TCP连接。然后,Web缓存将对对象的HTTP请求发送到缓存到服务器的TCP连接中。收到此请求后,原始服务器将对象发送到Web缓存。
4、当Web缓存接收到对象时,它将副本存储在其本地,并在HTTP响应报文中将副本发送到客户端浏览器(通过客户端浏览器和Web缓存之间的现有TCP连接)。
除了专门的服务器以外,用户自己的计算机也可以进行缓存。

缓存同时是服务器和客户端。当它接收浏览器的请求并发回响应时,它是服务器。当它向原始服务器发送请求并接收响应时,它是客户端。
通常,Web缓存由ISP购买和安装。例如,大学可能会在校园网络上安装缓存,并配置所有校园浏览器以指向该缓存。大型居民ISP(如Comcast)可能会在其网络中安装若干个缓存,并预先配置浏览器以指向已安装的缓存。
Web缓存可以大大减少客户端请求的响应时间,尤其是客户端和原始服务器之间的带宽远小于客户端和缓存之间的带宽时。如果客户端和缓存之间存在高速连接(通常如此),并且缓存具有请求的对象,则缓存能够快速将对象传递给客户端。另外,Web缓存可以大大减少机构访问Internet的流量。这使机构(例如公司或大学)不必尽快升级带宽,从而降低成本。Web缓存也减少了整个Internet上的Web流量,提高了所有应用程序的性能。

尽管缓存可以减少用户感知的响应时间,但它带来了一个新问题:缓存的对象副本可能不是最新的。换句话说,自从副本缓存以来,Web服务器中的对象可能已被修改。幸运的是,HTTP具有允许高速缓存验证其对象是否最新的机制。该机制称为条件GET(conditional GET)。如果:
(1)请求报文使用GET方法;
(2)请求报文包含If-Modified-Since报头行,那么该HTTP请求报文就是所谓的条件GET报文。
来看一个例子。首先,浏览器发出请求,代理缓存将请求报文发送到Web服务器:

GET /user/AndyBayerRoswell/profile/avatar.png HTTP/2.0 Host: www.3134.com 其次,Web服务器发送包含请求对象的响应报文: HTTP/2.0 200 OK Date: Sat, 11 Oct 2020 23:15:15 Server: Apache/2.4.44 (Debian) Last-Modified: Wed, 9 Sep 2020 09:23:24 Content-Type: image/png

(data data data data data …) 缓存将对象转发到发出请求的浏览器,也将其缓存,并存储其修改日期。一周后,另一浏览器通过缓存请求相同的对象,而该对象仍在缓存中。对象可能已在过去一周在Web服务器上被修改,缓存发出条件GET执行更新检查: GET /user/AndyBayerRoswell/profile/avatar.png HTTP/2.0 Host: www.3134.com If-modified-since: Wed, 9 Sep 2020 09:23:24 本例中,If-modified-since报头行的值与服务器一周前发送的Last-Modified报头行的值完全相同。该条件GET告诉服务器:仅在指定日期以来修改了该对象时,才发送该对象。现在,自2020年9月9日09:23:24以来,该对象未修改。然后,Web服务器将响应报文发送到缓存: HTTP/2.0 304 Not Modified Date: Sat, 11 Oct 2020 23:15:15 Server: Apache/2.4.44 (Debian)

(empty entity body) 为响应条件GET,Web服务器仍发送响应报文,但报文中不包括请求的对象:这只会浪费带宽并增加响应时间。最后一条响应报文在状态行显示304 Not Modified。它告诉缓存:可以将对象的缓存副本转发给请求的浏览器。

HTTP/2在2015年标准化,是HTTP/1.1之后的第一个新版本,后者在1997年标准化。自从HTTP/2标准化后,到2020年,在前1000万网站中,已经有超过40%使用HTTP/2。许多浏览器,包括Google Chrome、Internet Explorer、Safari、Opera和Firefox,都已支持HTTP/2。
HTTP/2的首要目标是:通过在单个TCP连接上启用请求和响应的复用(multiplexing),减少感知的延迟,提供请求优先级和服务器推送机制,并提供HTTP报头字段的高效压缩。HTTP/2未对HTTP方法、状态码、URL和头部字段做出改动。相反,HTTP/2改变了数据如何在客户端与服务器之间格式化与传送。
HTTP/1.1使用持久连接,允许一个Web页面通过单个TCP连接发送给客户端。每个连接一个Web页面,使服务器端的Socket数量减少,且每个运输的网页能获得公平的网络带宽份额。但浏览器的开发者们很快发现,通过单个TCP连接在单一的Web网页中发送全部对象,会带来线路头端阻塞(Head of Line blocking)问题。设想一个Web页面包含一个HTML基本页面,接近网页顶部的一个大的视频剪辑和视频下方的许多小对象。并假设存在瓶颈链路。使用单个TCP连接时,视频剪辑需要很长的时间穿过瓶颈链路,小对象们一直被延迟加载,因为它们位于视频剪辑之后。即:位于线路头端的视频剪辑阻塞了之后的全部小对象。HTTP/1.1浏览器一般通过打开多个并行的TCP连接解决这个问题,令同一网页中的对象并行发送到浏览器。通过这种方式,小对象到达并被渲染会快得多,于是减少了用户感知的延迟。
TCP拥塞控制(第3章)也会令浏览器计划之外地使用并行TCP连接。粗略地讲,TCP拥塞控制的目的在于:让每个TCP连接公平分享瓶颈链路的可用带宽。使用多个TCP连接传输单个网页,浏览器能够“作弊”,获得更多链路带宽。许多HTTP/1.1浏览器最多打开6个并行TCP连接,不仅为了避免线路头端阻塞,也为了获得更多带宽。
HTTP/2的一个主要目标是:避免(至少减少)传输单个网页的并行TCP连接。这不但减少了服务器需要打开并维护的Socket数量,还能允许TCP拥塞控制预期实施。然而,HTTP/2需要小心设计的机制避免线路头端阻塞。

HTTP/2的线路头端阻塞的解决方案是:将每一份报文分开成小的帧(frame),并在同一TCP连接中交错请求和响应报文。设一个Web网页具有一个大的视频剪辑和n(例如,n=8)个小对象。服务器会从浏览器收到(n+1)个请求。假设所有帧都是等长的,视频片段包含n_V(例如,1000)帧,其它小对象每个只占n_s(例如,2)帧,n_s≪n_v。如果不使用交错发送,只有在全部传输完n_V帧后,才能传输剩余的n_s帧。
将HTTP报文划分成独立的帧,并交错传输,最后在另一端重组成正确的数据,是HTTP/2最重要的增强。HTTP/2的帧划分子层(framing sub-layer)完成帧的划分。当服务器需要发送HTTP响应的时候,响应被帧划分子层处理。响应的报头字段单独成一帧,报文本体被划分成若干帧。这些帧与经由同一个持久TCP连接传送的响应帧一起,由帧划分子层交错传输。帧到达客户端后,先在帧划分子层被重组成原始的响应报文,再被浏览器照常处理。类似地,客户端的HTTP请求也被划分成帧,并交错传输。
帧划分子层还负责二进制编码帧。二进制协议的语法分析效率更高,更易产生短的帧,且错误率更低。

报文优先级机制允许开发者自定义请求的相对优先级,以优化应用程序性能。当客户端并发请求服务器时,它为每份报文的响应指派1到256的优先级。更高的数字代表更高的优先级。使用这些权重,服务器能够首先发送高优先级的响应帧。此外,客户端还能通过报文ID,指明报文间的依赖关系。
HTTP/2的另一个特性是:令服务器可以为同一个客户端请求发送多个响应,服务器能向客户端推送(push)附加的对象,而无需等待客户端再发送请求。这可能是因为HTML基本网页指定了完整渲染网页需要的对象。服务器能分析HTML页面,识别需要的对象,并在收到对这些对象的显式请求之前发送它们。服务器推送消除了等待请求的额外延迟。

第3章将会提到QUIC,是一种在应用层实现的基于裸的UDP的新型“运输”协议。QUIC具备HTTP期望的几个特性,例如报文复用(交错),流(stream)级别的流量控制,以及低延迟连接建立(low-latency connection establishment)。HTTP/3是在QUIC上运作的新型协议。在2020年,HTTP/3处于Internet草案(draft)状态,尚未完全标准化。许多HTTP/2特性(比如报文交错)已经被QUIC包括在内,允许更简易的、流线型的HTTP/3设计。

要使任何计算机都能显示WWW服务器上的页面,就必须解决页面的标准化问题。超文本标记语言(HyperText Markup Language,HTML)是一种制作WWW页面的标准语言,消除了计算机之间信息交流的障碍。注意,HTML并不是应用层协议,它只是WWW浏览器使用的一种语言。HTML易于掌握、实施简单,很快就成为WWW的重要基础。官方的HTML标准由WWW联盟(WWW Consortium,W3C)负责制定。1993年问世后,HTML就不断在更新。现在最新的版本是HTML 5(2014年9月发布),新的版本增加了在网页中嵌入音频、视频,在移动设备上支持多媒体,以及交互式文档等功能。现在一些主流的浏览器都支持HTML 5。
HTML定义了许多用于排版的命令,即标签(tag)。例如,<I>表示后面开始用斜体排版,而</I>则表示斜体字排版到此结束。HTML把各种标签嵌入到WWW页面中,就构成HTML文档。HTML文档是可以使用任何文本编辑器创建的ASCII文件。但应注意,仅当HTML文档是以.html或.htm为后缀时,浏览器才对HTML文档的标签进行解释。如果HTML文档以.txt为后缀,HTML解释程序就不对标签进行解释,浏览器只能原样显示文本。
并非所有的浏览器都支持所有的HTML标签。若浏览器不支持某HTML标签,则它将忽略此标签,但在一对不能识别的标签之间的文本仍然会被显示出来。
篇幅所限,这里不介绍HTML的具体语法。

XML(Extensible Markup Language),即可扩展标记语言,它和HTML很相似。但XML的设计宗旨是传输而不是显示数据(HTML是为了在浏览器上显示数据)。更具体些,XML用于标记电子文件,使其具有结构性的标记语言,可用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML是一种简单、平台无关、广泛采用的标准。XML相对HTML的优点是:它将用户界面与结构化数据分隔开来。这种数据与显示的分离,使得集成来自不同源的数据成为可能。客户信息、订单、研究结果、账单付款、病历、目录数据及其它信息,都可以转换为XML。XML不是要替换HTML,而是对HTML的补充。XML标记由文档的作者定义,并且是无限制的。HTML标记则是预定义的;HTML作者只能使用当前HTML标准所支持的标记。
另一种语言XHTML(Extensible HTML)即可扩展超文本标记语言,它与HTML 4.01几乎是相同的。但XHTML是更严格的HTML版本,也是一个W3C标准(2000年1月制定),是作为一种XML应用被重新定义的HTML,并将逐渐取代HTML。所有新的浏览器都支持XHTML。

还有一种语言是层叠样式表(Cascading Style Sheets,CSS)。它是一种样式表语言,用于为HTML文档定义布局。CSS与HTML的区别是:HTML用于结构化内容,CSS则用于格式化结构化的内容。例如,在浏览器上显示的字体、颜色、边距、高度、宽度、背景图像等方面,都能够给出精确的规定。现在所有的浏览器都支持CSS。

上面的文档只是万维网文档中最基本的一种,即静态文档(static document)。静态文档在创作完毕后,就存放在WWW服务器中,在被用户浏览的过程中,内容不会改变,因此每次读取静态文档都返回相同结果。
静态文档的最大优点是简单。由于HTML是一种排版语言,因此静态文档可以由不懂程序设计的人员来创建。但静态文档不够灵活。当信息变化时,作者要手工修改文档。可见,变化频繁的文档不适于做成静态文档。
动态文档(dynamic document)的内容,是在浏览器访问WWW服务器时,才由应用程序动态创建的。浏览器请求到达时,服务器运行另一个应用程序,并把控制转移到此程序。接着,程序处理浏览器发来的数据,并输出HTML格式的文档,作为对浏览器的响应。由于这些响应都是临时生成的,因此用户看到的内容是不断变化的。动态文档的主要优点是:具有报告当前最新信息(如:股市行情、天气预报或售票情况)的能力。但动态文档的创建难度比静态文档高,因为动态文档的开发不是直接编写文档本身,而需要编写生成文档的应用程序,这就要求开发人员必须会编程,编写的程序还要通过大范围的测试,以保证输入的有效性。
动态文档和静态文档之间的首要差别体现在服务器端:文档内容的生成方法不同。而从浏览器的角度看,这两种文档并没有区别。动态文档和静态文档的内容都遵循HTML规定的格式,仅根据屏幕内容,无法判定服务器送来的是哪一种文档,只有文档的开发者才知道。

通用网关接口(Common Gateway Interface,CGI)是一种标准,它定义了动态文档应如何创建,输入数据应如何提供给应用程序,以及输出结果应如何使用。取这个名字的原因是:WWW服务器与CGI的通信遵循CGI标准。“通用”是因为标准定义的规则对其它任何语言都是通用的。“网关”二字的出现是因为,CGI程序还可能访问其它服务器资源,如数据库或图形软件包,因而CGI程序的作用有点像一个网关。也有人将CGI程序简称为网关程序。“接口”是因为有一些已定义好的变量和调用等,可供其它CGI程序使用。
CGI程序的正式名称是CGI脚本(script)。脚本是一个程序,它先被解释器解释,而不由CPU直接执行。有一些语言专门作为脚本语言(script language),如Perl、REXX(在IBM主机上使用)、JavaScript、PHP、Tcl/Tk等。脚本也可用一些常用的语言写出,如C、C++等。脚本语言容易上手,开发耗时短,这对一些有限功能的小程序是很合适的。但脚本运行起来通常比编译程序要慢。脚本不一定是一个独立的程序,它可以是一个动态装入的库,甚至是服务器的一个子程序。
CGI程序又称为cgi-bin脚本:在许多WWW服务器上,为便于找到CGI程序,就将它们放在/cgi-bin的目录下。

随着HTTP和浏览器的发展,动态文档已明显不能满足发展的需要。这是因为:动态文档一旦建立,它所包含的信息内容也就固定下来,而无法及时刷新屏幕。另外,像动画之类的显示效果,动态文档也无法提供。
有两种技术可用于浏览器屏幕显示的连续更新。一种是服务器推送(server push):将所有的工作都交给服务器。服务器不断地运行与动态文档相关联的应用程序,定期更新信息,并发送更新过的文档。
尽管这样可以达到连续更新的目的,但也有很大的缺点。首先,为了满足大量客户的请求,服务器就要运行很多推送程序,带来繁重的开销。其次,服务器要为每一个浏览器客户维持一个不释放的TCP连接。随着TCP连接的数目增加,每个连接分配到的网络带宽就下降,导致网络传输时延增大。
另一种提供屏幕连续更新的技术是活动文档(active document)。这种技术把所有的工作都转移给浏览器。每当浏览器请求一份活动文档时,服务器就返回一段活动文档程序副本,该副本在浏览器端运行。这时,活动文档程序可与用户直接交互,并改变屏显。只要用户运行活动文档程序,活动文档的内容就可以连续改变。由于活动文档技术不需要服务器的连续更新传送,对网络带宽的要求也不会太高。
从传送的角度看,浏览器和服务器都把活动文档看成是静态文档。在服务器上的活动文档的内容是不变的,这点和动态文档是不同的。浏览器可在本地缓存一份活动文档的副本。活动文档还可压缩,以便于存储和传送。另一点要注意的是,活动文档本身并不包括其运行所需的全部软件,大部分的支持软件事先集成在浏览器中。
实现活动文档的语言包括JavaScript等。Java Applet虽然也可以开发活动文档,但现在已经被弃用。
动态网页和静态网页的一个重要区别是:网页是否能够和自己在服务器端编写的应用程序进行交互。

2.3 电子邮件 电子邮件(E-mail)是互联网上使用最多的和最受用户欢迎的一种应用。电子邮件把邮件发送到收件人使用的邮件服务器,并放在其中的收件人邮箱(mail box)中,收件人可在自己方便时,上网到自己使用的邮件服务器进行读取。这相当于互联网为用户设立了存放邮件的信箱,因此e-mail有时也称为“电子信箱”。电子邮件不仅使用方便,而且还具有传递迅速和费用低廉的优点。据有的公司报道,使用电子邮件后,劳动生产率可以提高30%以上。

简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)是Internet电子邮件的核心。SMTP将邮件从发件人的邮件服务器传输到收件人的邮件服务器。SMTP比HTTP古老得多。

SMTP规定了14条命令和21种应答信息。每条命令用几个字母组成,而每一种应答信息一般只有一行信息,由一个3位数字的代码开始,后面附上(也可不附上)很简单的文字说明。

即使两台邮件服务器位于两个半球,SMTP通常也不使用中间邮件服务器来发送邮件。如果发送方的服务器在香港(Hong Kong),接收方服务器在St Louis,则位于香港和St Louis的TCP连接也是直接的。假设接收方的邮件服务器故障,邮件将保留在发送方的邮件服务器中,过后会再次尝试。邮件不会放置在中间服务器中。

客户端SMTP(在发送邮件服务器主机上运行)通过TCP建立到服务器SMTP(在接收邮件服务器主机上运行)的端口25的连接。若服务器故障,则稍后再试。建立连接后,服务器和客户端执行应用层握手。在SMTP握手阶段,SMTP客户端指示发件人和收件人的邮件地址。客户端和服务器相互介绍后,客户端发送报文。SMTP依靠TCP的可靠数据传输服务将报文正确发送到服务器。如果还有其它报文要发送,客户端在同一TCP连接上重复此过程;否则,它指示TCP关闭连接。邮件服务器还要向发信人报告邮件传送的情况(如,已交付、被拒绝、丢失等)。

来看SMTP客户端(C)和SMTP服务器(S)之间交换邮件的示例。客户端与服务器分别是student.oust.edu.cn和oest.no.jasmine.org。以C和S开头的ASCII文本行,分别是客户端与服务器发送到其TCP套接字的行。一旦建立TCP连接,下面的对话就会开始:

S: 220 oest.no.jasmine.org C: HELO student.oust.edu.cn S: 250 Hello student.oust.edu.cn, pleased to meet you C: MAIL FROM: alice@student.oust.edu.cn S: 250 alice@student.oust.edu.cn … Sender ok C: RCPT TO: bob@oest.no.jasmine.org S: 250 bob@oest.no.jasmine.org … Recipient ok C: DATA S: 354 Enter mail, end with ”.” on a line by itself C: Do you like the science fiction novel Defense of Data? C: Is there an ongoing film adaptation of it? C: . S: 250 Message accepted for delivery C: QUIT S: 221 oest.no.jasmine.org closing connection

在上面的示例中,我们可以看出,电子邮件的地址的格式是:

<用户名>@<邮件服务器的域名> 这个格式是TCP/IP体系的电子邮件系统规定的。“@”读作at,表示“在”。用户名就是收件人的邮箱名,在注册邮箱时定义。该名称在同一邮件服务器中必须唯一。邮件服务器要确保用户名在本服务器中的唯一性,这样就保证了每个电子邮件地址在世界范围内都是唯一的。发送方的电子邮件软件只使用域名来选择目的地。 客户端从邮件服务器student.oust.edu.cn向邮件服务器oest.no.jasmine.org发送报文: 你喜欢长篇科幻小说《数据保卫战》吗?它是否正被改编为电影? 作为对话的一部分,客户发出了五个命令:HELO,MAIL FROM,RCPT TO,DATA和QUIT。这些命令的意义是不言自明的。客户端还发送一个由单句点组成的行,该行将报文的结尾指示给服务器。服务器发出对每个命令的答复,每个答复都有一个代码和一些(可选的)英语说明。SMTP使用持久连接:如果发送邮件服务器有多封邮件要发送到同一接收邮件服务器,则它通过同一TCP连接发送所有邮件。对于每份报文,客户端以一个新的MAIL FROM开始该过程,以一个单独的句号指定报文的结尾,仅在所有报文发送之后才发出QUIT。

注意:发送成功不等于收件人读取了这个邮件。接收方的邮件服务器也可能接着就出了故障,使收到的邮件全部丢失(在收件人读取信件之前);发送的邮件也可能被邮件服务器当作垃圾邮件删除了;收件人在清理自己的邮箱时,也可能把尚未读取的邮件一起删除了。有时,收件人很久没有登录邮箱,根本不知道邮箱中有来信。因此,邮件即使“发送成功”,收件人也不一定会读取到。但即便如此,基于SMTP的电子邮件通常都被认为是可靠的。

使用Telnet可以对SMTP服务器发起直接对话。执行

telnet 25 是本地邮件服务器的名称。执行此操作时,只是在本地主机和邮件服务器之间建立TCP连接。键入此行后,应立即收到220答复。然后,在适当的时候发出SMTP命令:HELO,MAIL FROM,RCPT TO,DATA,CRLF.CRLF和QUIT。

SMTP与HTTP两种协议都用于在主机之间传送文件。HTTP将文件(对象)从Web服务器传输到Web客户端(通常是浏览器);SMTP将文件(邮件)从一台邮件服务器传输到另一台。传输文件时,持久性HTTP和SMTP均使用持久连接。但是两者有重要的区别。首先,HTTP主要是一种内拉式协议(pull protocol):有人将信息加载到Web服务器上,用户在方便时使用HTTP从服务器拉取信息;TCP连接由要接收文件的机器启动。相比之下,SMTP主要是一种外推式协议(push protocol):发送邮件服务器将文件推送到接收邮件服务器;TCP连接是由要发送文件的计算机发起的。
第二个区别是:SMTP要求每条报文(包括正文)都采用7位ASCII格式。如果报文包含非ASCII字符(例如带有重音符号的法语字符)或二进制数据(例如图像文件),则必须将报文编码为7位ASCII。HTTP没有此限制。
第三个重要区别涉及如何处理由文本、图像及其它媒体类型组成的文档。HTTP将每个对象封装在自己的HTTP响应报文中。SMTP将邮件的所有对象放入一封邮件中。

发送电子邮件时,包含外围信息(例如:发件人地址、收件人地址、日期)的报头位于报文本身之前。报头行和正文由空行(CRLF)分隔。RFC 5322指定了邮件报头行的确切格式及其语义。与HTTP一样,每个报头行均包含可读文本,文本由关键字、冒号和值组成。一些关键字是必需的,其它则是可选的。每个报头都必须有一个From报头行和一个To报头行;可以包括Subject及其它可选报头行。这些报头行与之前的SMTP命令不同(即使它们包含一些相同的词,如from、to)。那部分中的命令是SMTP握手协议的一部分;这里的报头行是邮件本身的内容的一部分。典型的邮件报头行如下所示:

From: alice@student.oust.edu.cn To: bob@sth.se.jasmine.org Subject: I am planning a departure to your university following the schedule of School of Literature and School of Film and Television of OUST Shanghai. Hope you will come. 报文标题之后,空行;然后出现正文(以ASCII表示)。 邮件首部还可以有一项抄送Cc(Carbon copy),意思是留下一个“复写副本”。这是借用旧的名词,表示应给某某人发送(抄送)一个邮件副本。有些邮件系统允许用户使用关键字Bcc(Blind carbon copy)来实现盲复写副本。这是使发件人能将邮件的副本送给某人,但不希望此事为收件人知道。Bcc又称为暗送。 首部还可以有Date,表示发件日期。这一项一般与From一起,由系统自动填入。 另一个关键字是Reply-To,即对方回信的地址。这个地址可以与发件人发信时所用的地址不同。例如,在外地借用他人的邮箱发邮件,但仍希望对方将回信发到自己的邮箱。这一项可以预先设置,而无需每次写信时设置。

SMTP将邮件从Alice的邮件服务器传递到Bob的以后,邮件就放在Bob的邮箱中。Bob登录服务器主机,然后执行主机上的邮件阅读器读取邮件。直到1990年代初,这都是标准的方式。如今,邮件访问使用的是C-S结构:用户在客户端读取邮件。本地PC上的邮件客户端使用户可以享受一系列丰富的功能,包括查看多媒体和附件。
理论上,Bob作为收件人,也可以直接放置邮件服务器在本地PC上。于是,Alice的邮件服务器可以直接与Bob的PC对话。但这存在问题。回想一下,邮件服务器管理邮箱并运行SMTP客户端和服务器端。如果Bob的邮件服务器就是他的PC,则Bob的PC必须始终开机并连接到Internet,以便接收可能随时到达的新邮件。这对许多用户是不切实际的。而且,多数用户的计算机无力承担邮件服务器的负载。一般地,用户在PC上运行UA(如Outlook),但访问存储在始终在线的共享邮件服务器上的邮箱。该邮件服务器与其他用户共享,通常由ISP或一些公司维护。
在Foxmail中,有一种“特快专递”服务。这种服务就从发件人的UA直接利用SMTP把邮件发送到接收方邮件服务器。这就加快了邮件的交付(省去在发送方邮件服务器中的排队等待时间)。但这种“特快专递”和邮政直接把邮件送到用户家中不同,它并没有把邮件直接发送到收件人的计算机中。有些邮件服务器为了防止垃圾邮件和计算机病毒,拒绝接收从一般用户

标签: 3tk系列继电器zh1032d胀差变送器装置cr系列中间继电器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台