admin 管理员组

文章数量: 887021

计算机网络

知 识 梳 理

(第一版)

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


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


二 应用层

声明
本书涉及的网站:www.3134、jasmine、www.oust.edu和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应用程序中,单服务器无法满足所有请求。如果社交网站只有1台服务器处理请求,那么很快就会不堪重负。因此,常使用数据中心。搜索引擎(例如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)可能允许设定运输层参数(例如,最大缓冲区和最大段大小,见第3章)。
一旦应用程序开发人员选择了传输协议(如果可选),就使用该协议提供的运输层服务来构建应用程序。

为了识别接收进程,需要指定2条信息:主机的地址、目标主机中的接收进程的标识符。
在Internet中,主机通过IP地址唯一标识。发送进程还必须确定主机中运行的接收进程(具体而言,是接收套接字),因为主机一般同时运行许多网络应用程序。目标端口号(port number)用于确定接收进程。常见应用已经被分配特定端口:Web服务器(HTTP)的端口号是80,邮件服务器进程(使用SMTP)的端口号是25,HTTPS的端口是443。所有Internet标准协议的端口号可以在www.iana上找到。

发送端通过套接字发送消息。在套接字的另一端,运输层协议负责将消息发送到接收进程的套接字。许多网络(包括Internet)提供多个运输层协议。开发应用时,必须选择其中一种。
运输层协议可以为调用该协议的应用程序提供哪些服务?我们分成四类:
·传输可靠性保证。数据包可能会在网络中丢失:或溢出路由器的缓冲区,或在某些位损坏后被主机或路由器丢弃。对许多应用(电子邮件,文件传输,远程主机访问,Web文档传输和财务应用程序等),数据丢失可能会带来灾难性的后果。这时,必须保证发送的数据被正确而完整地传递到另一端。如果协议提供这种保证,则说它提供可靠的数据传输。这时,发送进程有把握:数据将正确无误地到达。
运输层协议不提供可靠的数据传输时,某些数据可能永远不会到达接收进程。对于容错型应用程序来说,这是可以接受的。最典型的是多媒体应用:这类程序一般能忽略少量的影音数据丢失,代价是音视频出现一些小瑕疵。
·吞吐量保证。由于其它会话会共享带宽,且会话数量可变,因此吞吐量可能波动。运输层协议可以提供另一种服务:保证吞吐量。此服务适合许多应用程序。例如,如果Internet电话以32 kbps编码语音,则需要保证至少以该速率将数据传送给对方。如果传输协议不能提供此吞吐量,应用程序就要以更低的速率编码,或者拒绝继续语音。具有吞吐量要求的应用程序称为带宽敏感应用程序(bandwidth-sensitive application)。许多多媒体应用都对带宽敏感,尽管它们可能使用自适应编码技术以匹配当前可用吞吐量。
有的应用程序比较容易适应不同的吞吐量,比如电子邮件,文件传输和Web传输。当然,吞吐量越大越好。
·延迟保证。与吞吐量保证一样,时延保证有多种形式。示例:发送方注入到套接字中的每一位,在100 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的普遍利益,而不是通信过程的直接利益。当网络在发送方和接收方之间拥塞时,将限制客户端或服务器的发送速率。在第3章会看到,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/courses/nlp/intro.pdf
的主机名是cse.oust.edu,路径名是/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/user/AndyBayerRoswell/worklist?filetype=audio&access=public

https://3134/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/nlp/index.htm
传输的过程是:
1、HTTP客户端进程启动到服务器cse.oust.edu的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
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指定对象所在的主机。您可能会认为此报头行是不必要的,因为已经有到主机的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/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报头行表

本文标签: 第二章 计算机网络 应用层 方法 docx