HTTP协议学习二:HTTP报文与Web服务器

HTTP协议学习笔记。参考《图解HTTP协议》

HTTP报文

用于HTTP协议交互的信息被称作HTTP报文。HTTP报文是由多行(CR+LF作为换行符)数据构成的字符串文本。HTTP报文可分为报文首部和报文主体两块。两者由最初出现的空行(CR+LF)来划分。并不一定要有报文主体。

请求报文首部结构:

  • 请求行:包含请求方法,请求URI和HTTP版本
  • 请求首部字段:从客户端向服务器端发送请求报文时使用的首部。补充了求情的附加内容、客户端信息、响应内容相关优先级等信息。
  • 通用首部字段
  • 实体首部字段
  • 其他:包含HTTP的RFC里未定义的首部(Cookie等)

响应报文首部结构:

  • 状态行:包含表明响应结果的状态码,原因短语和HTTP版本
  • 响应首部字段:从服务器端向客户端返回响应报文时使用的首部。补充了相应的附加内容,也会要求客户端附加额外的内容信息
  • 通用首部字段
  • 实体首部字段
  • 其他
  • HTTP在传输数据时可以按照数据原貌直接传输,也可以在传输过程中通过编码提升传输速率。

  • 报文(message)*是HTTP通信中的基本单位,由8位组字节流组成,通过HTTP通信传输

  • 实体(entity)*作为请求或响应的有效载荷数据被传输,内容由实体首部和实体主题组成。通常报文主题等于实体主体,只有当传输中进行编码操作时,实体主题的内容发生变化才导致和报文主体产生差异。

  • 在HTTP通信过程中,请求的编码实体资源尚未全部传输完成之前,浏览器无法显示请求页面。在传输大容量数据时,通过把数据分隔成多块,能够让浏览器逐步显示页面。把实体主题分块的功能成为分块传输编码

  • HTTP协议中也采纳了多部分对象集合,发送一份报文主题内可还有多种类型实体。在HTTP报文中使用多部分对象集合时,需要在首部字段里加上Content-type,并使用boundary字符串来划分多部分对象集合指明的各类实体。

  • 获取部分内容的范围请求。HTTP实现一种可恢复机制,指能从之前下载中断处恢复下载。要实现该功能需要制定下载的实体范围。

  • 内容协商返回最合适的内容。同一个Web网站有可能存在多份相同内容的页面,但语言不通。当浏览器的默认语言为英语或中文时,访问想用URI的Web页面会像是相应的语言页面。内容协商的类型: 服务器驱动协商客户端驱动协商_, _透明协商

返回结果的HTTP状态码

状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务器端是正常处理了请求还是出现了错误。

状态码类别:

类别 原因短语
1xx Informational 信息性状态码 接收的请求正在处理
2xx Success 成功状态码 请求正常处理完毕
3xx Redirection 重定向状态码 需要进行附加操作以完成请求
4xx Client Error 客户端错误状态码 服务器无法处理请求
5xx Server Error 服务器错误状态吗 服务器处理请求出错

举例:

200 OK 表示客户端发来的请求在服务器端被正常处理了。
204 No Content 该状态码代表服务器接受的请求已成功处理,但在返回的响应报文中不含实体的主体部分,也不允许返回任何实体主体。一般在只需要从客户端往服务器发送消息,而对客户端不需要发送新信息的情况下使用。
206 Partial Content 表示客户端进行了范围请求,服务器成功执行了这部分GET请求。

301 Moved Permanently 永久重定向。该状态码表示请求的资源已被分配了新的URI,以后应使用更新的URI。当请求URI执行资源路径的最后忘记添加斜杠如 http://example.com/sample,就会产生301状态码。如果用户保存成了书签,则自动更新书签。
302 Found 临时重定向。该状态码表示请求的资源已被分配了新的URI,希望用户本次能够使用新的URI访问。如果用户保存了书签,302状态不会更新书签。
303 See Other 该状态码表示由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源。303状态码明确表示客户端应采用GET方法获取资源。
304 Not Modified 该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。304状态码返回时,不包含任何响应的主体部分。
307 Temporary Redirect 临时重定向,与320 Found有相同含义。307会遵照浏览器标准,不会从POST变成GET。

400 Bad Request 表示请求报文中存在语法错误。
401 Unauthorized 该状态码表示发送的请求需要有通过HTTP认证的认证信息,如果之前已进行过1次请求,则表示用户认证失败。返回含有401的响应必须包含一个适用于被请求资源的www-authenticate首部用于质询(challenge)用户信息。当浏览器初次接收到401响应,会弹出认证用的对话窗口。
403 Forbidden 该状态码表明对请求资源的访问被服务器拒绝了。服务器端没有必要给出拒绝的详细理由,但可以在实体主体部分对原因进行描述。
404 Not Found 表明服务器上复发找到请求的资源,除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。

500 Internal Server Error 表明服务器端在执行请求时发生了错误。
503 Service Unavailable 表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。

需要注意的是,不少返回的状态码相应都是错误的,但用户可能察觉不到这一点。比如Web应用程序内部发生错误,状态码已然返回200 OK。

Web服务器

一台Web服务器可搭建多个独立域名的Web网站,也可作为通信路径上的中转服务器提升传输效率。

通信数据转发程序:代理、网关、隧道
代理是一种有转发功能的应用程序,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。代理不改变请求URI,会直接发送给前方持有资源的目标服务器。每次通过代理服务器转发请求或响应时,会追加写入Via首部信息。
使用代理服务器的理由有:利用缓存技术减少网络带宽的流量,组织内部针对特定网站的访问控制以获取访问日志为主要目的。代理有多重使用方法,按两种基准分类:一种是是否使用缓存,另一种是是否会修改报文。
网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。在TCP/IP中,网关是连接两种不同通信协议的设备。在这里,网关能使通信线路上的服务器提供非HTTP服务。利用网关能提高通信的安全性。
隧道隧道是在像个很远的客户端与服务器之间进行中转,并保持双方通信连接的应用程序。隧道可以按要求建立一条与其他服务器的通信线路,届时使用SSL等加密手段进行通信,隧道的目的是确保客户端能与服务器进行安全的通信。隧道本身不会去解析HTTP请求。

保存资源的缓存:缓存是指代理服务器或客户端本地磁盘内保存的资源副本。利用缓存可减少对源服务器的访问,因此也就节省了通信流量和通信时间。可以避免多次从源服务器转发资源,客户端可就近从缓存服务器上获取资源。(镜像服务器)缓存服务器判定缓存过期后,会向源服务器确认资源的有效性。同时客户端也可以将资源缓存在浏览器中。浏览器缓存如果有效就不必再向服务器请求相同的资源了,可以直接从本地磁盘读取。

HTTP首部

首部字段结构首部字段名:字段值。字段值对应单个HTTP首部字段可以有多个值。

通用首部字段

首部字段名 解释 说明
Cache-Control 控制缓存的行为
Connection 逐跳首部、连接的管理
Date 创建报文的日期时间
Pragama 报文指令
Trailer 报文末端的首部一览
Transfer-Encoding 指定报文主体的传输编码方式
Upgrade 升级为其他协议
Via 代理服务器的相关信息
Warning 错误通知

请求首部字段

首部字段名 解释 说明
Host 请求起源所在服务器
Accept 可处理的媒体类型
Accept-Charset 可接受的字符集
Accept-Encoding 可接受的内容编码
Accept-Language 可接受的自然语言

响应首部字段

首部字段名 解释 说明
Accept-Ranges 可接受的字段范围
Location 零客户端重新定向到URI
Server HTTP服务器的安装信息

实体首部字段

首部字段名 解释 说明
Allow 资源可支持的HTTP方法
Content-Type 实体主体的类型
Content-Encoding 实体主体适用的编码方式
Content-Language 实体主体的自然语言
Content-Length 实体主题的字节数
Content-Range 实体主题的位置范围,一般用于发出部分请求时使用

HTTPS保证Web的安全

HTTP的缺点

  • 通信使用明文(不加密),内容可能会被窃听
  • 不验证通信方的身份,因此有可能遭遇伪装
  • 无法证明报文的完整性,所以有可能已遭篡改

HTTPS = HTTP + 加密 + 认证 + 完整性保护

HTTPS并非是应用层的一种新协议,只是HTTP通信接口部分用SSL和TLS协议替代而已。通常HTTP直接和TCP通信。当使用SSL时,就演变成了先和SSL通信,再由SSL和TCP通信。SSL通过对信息进行公开密钥加密方式实现安全传输。

公开密钥加密:发送方使用接收方公开密钥进行加密,接收方用自己的私有密钥进行解密。

HTTPS采用公开密钥和共享密钥的混合加密模式。首先用公开密钥传输后续传输的共享密钥,之后的传输使用共享密钥来提高效率。

当然,公开密钥加密方式无法证明公开密钥本身就是货真价实的公开密钥。为了解决上述问题,可以使用数字证书认证机构和其相关机关颁发的公开密钥证书 CA。