HTTP 权威指南

avatarplhDigital nomad
以前一直以为http就是个协议,内容很少,直到我买了http权威指南这本600页厚的书,我才发现,我的基础实在太差了。涨知识。只是觉得这本书开头部分印证了我之前零散的观点,然后就要今天一整天在家看了60页。我终于不害怕整一天宅房间里了。
http分为三部分 1.起始行。2.首部,3.主体。
网络5个层次 1.http应用层。2.TCP-传输层。3.IP-网络层。4.网络特有链路接口-数据链路层。5.物理网络硬件-物理层

前言

HTTP(Hypertext Transfer Protocol, 超文本传输协议),http起初是一个简单协议,因此你也许以为这个没什么好说的,请看目录,你会发现这本书是web架构“圣经”。 纵观全书,我们对于http不仅仅停留在表现,而是深入浅出解释了。这是一本cs(compute science)基础书籍。好吧,我应该补基础了。

本书分为5部分

  • http,web基础,
  • HTTP结构
  • 识别认证,与安全。
  • 实体编码和国际化
  • 内容发布与分发
  • 附录。

第一章 http概述

1.1 http ,多媒体信使,

每天网络上,充斥着各种,资源,jpg,html页面,mpeg电影,WAV音频文件,java小程序,等,而http可以从全世界各个地方的web服务器上将这些信息迅速便捷搬移到人们桌面上的web浏览器上面, http采用可靠的数据传输协议,因此,即使数据来自地球另一端,也可以准确的把数据传给我,并不发生损坏。下面来讲一下,近距离观察,http是如何传输web流量的。

1.2 web客户端和服务端

http客户端发出请求,服务器会根据协议,解析,发送提供数据。这是万维网的基本组件。 当你浏览一个页面比如www.baidu.com的时候,浏览器向服务器发送请求,,服务器默认发送index.html文件给浏览器。

1.3 资源

非常长知识啊。

web服务器是web资源的宿主,而web资源是web内容的源头,这些文件包括任意内容,如html,word文件,图片文件,avi电影, 但同时资源文件不一定是静态文件,资源也可以是根据资源生成的软件程序。例如JSON数组。

媒介类型

MIME(Multipurpose Internet Mail Extension, 多用途因特网邮件扩展),这个是为了在不同邮件系统中挪移报文。http同样采用了它,并且用它标记多媒体内容, web服务器会为所有HTTP对象附加一个MIME类型,MIME是一种文本标记,表示对象类型,和特定子类型,

  • html格式文本文档 text/html
  • ASCII格式文本文档 text/plain
  • JPEG格式的图片为image/jpeg
  • GIF格式的图片为image/jpeg
  • Apple的QuickTIme电影 video/quicktime类型
  • 微软的PowerPoint 演示文件为application/vnd.ms-powerpoint类型

常见的类型有数百种。

URI

每一个web服务器都有一个名字,服务器资源名称 为 统一资源标识符(Uniform Resource Identifier, URL)。URL就像一个地址一样,在全世界范围内标识并定位资源信息。 URI有两种形式 URL,和URN

  • URL 大部分URL分为三部分
    • 第一部分称之为方案,通常就是http://这部分
    • 第二部分称之为因特网地址,www.baidu.com
    • 第三部分称之为服务器上面某个资源 /image/logo.png

1.3.4URN

作为网络上唯一名称使用的,这种与资源所在地无关,就可以将资源四处搬移,

1.3 方法

http支持不同几种请求命令,常见的包括如下

  • GET 从服务器端向客户发送命名资源
  • PUT将来自客户端的数据储存到一个命名的服务器资源中去。
  • DELETE从服务器端删除命名资源
  • POST将客户端数据发送到一个服务器网关应用程序。
  • HEAD仅仅只发送命名资源响应中的httl首部

状态码

  • 200 文档正确返回
  • 302 Redirect重定向,去其他地方获取资源
  • 404 资源找不到

1.5 报文

HTTP报文有一行行简单的字符串组成,HTTP报文都是纯文本,而不是二进制码, http报文主要分为下面3部分

  • 起始行 主要用来说明请求用来做什么,在响应报文中描述了出现了什么情况,是200还是302

  • 首部字段 起始行后面有0或者多个首部字段,每一行都包括一个名字和一个值,

  • 主体 空行之后就是可选的报文主体,其中包含了所有类型的数据,请求柱体包括了要发给服务器的数据,响应主体包括了返回给客户的数据,可以是任意的二进制内容,也可以是文本。

image

1.6 连接

讲一下,报文如何通过传输控制协议(Transmission Control Protocol,TCP),连接从一个地方搬移到另一个地方去。

1.61 TCP/IP

http是应用层协议,HTTP无需操心网络通信的具体细节,他把网络的细节都交给了通用可靠的因特网传输协议:TCP/IP TCP提供了:

  • 无差错的数据传输
  • 接序传输(数据总按照发送的顺序接受)
  • 未分段的数据流

因特网本身就是基于TCP/IP的,这个是全世界计算机和网络设备常用的层次化分组交换网络协议,TCP/IP隐藏了硬件的弱点和特点,。安全通讯。

网络术语对应层次
HTTP应用层
TCP传输层
IP网络层
网络特有链路接口数据链路层
物理网络硬件物理层

1.6.2 连接 IP地址 以及端口号

在http客户端向服务端发送报文之前,需要用到网络协议(Internet Protocol , IP),在网络协议地址和端口号在客户和服务器之间建立一条TCP/IP连接。

至于如何获得HTTP服务器和IP地址呢?当然是通过URL了,URL就是资源地址, 步骤如下:

  • 通过URL解析出服务器主机名字
  • 浏览器将服务器的主机名转换成ip
  • 得到端口号
  • 浏览器建立一条与web服务器的TCP连接
  • 浏览器向服务器发送一条http请求
  • 服务器向浏览器发送一条http响应报文

1.8 Web的结构组件

本章重点介绍2个web应用程序,web浏览器和web服务器

  • 代理 位于客户端和服务器之间http中间实体。

  • 缓存 http仓库,是常用页面的副本得到保存,可以离客户更近的地方

  • 网关 连接其他应用的特殊web服务器

  • 隧道 对http通信报文进盲转发的特殊处理

  • Agent 代理 发起自动http请求的半智能web客户端。

1.8.1 代理

首先看 http代理服务器,这是web安全,应用集成以及性能优化的重要组成模块。处于安全考虑,比如企业对下载内容进行病毒检测,或者屏蔽成人网站,,代理可以对请求和响应进行过滤。

1.8.2 缓存

这是一种特殊的http代理服务器,可以将经过代理传送的常用文档复制保存起来。

1.8.2 网关

网关是一种特殊服务器,作为接受其他服务器中间体使用,通常用于将http流量转换成其他协议。

1.8.3 隧道,

http隧道是一种常见的用途是通过http连接承载加密安全套接字层流量,

1.8.5 Agent代理

用户agent代理是代表用户发起http请求的客户端程序。所有发布web请求都是通过agent代理。最常见的agent代理就是浏览器,但是还有很多其他的代理,比如网络蜘蛛,或者web机器人。自动搜索引擎就是web蜘蛛,它可以从世界范围获取web页面,

第二章 URL与资源

所有的东西都有编号,比如快递收货地址,只有这样,整个城市协作才能进行下去。

2.1浏览因特网资源

那么不得不提到URL,他是URI的子集,它通过资源位置来识别资源。URL分成3部分

同时,URL可以通过HTTP之外的其他协议访问资源,他们指向因特网上的任意资源,

URL提供了一种统一的资源命名方式,大多数URL都有同样的:"方案://服务器位置/路径"

2.2 URL语法

<scheme>://<user>:<password>@<host>:<prot>/<path>;<params>?<query>#<frag>

2.5 常见的web方案

方案描述
httphttp://baidu.com
httpshttps://baidu.com
mailtoemail地址,mailto:
ftp文件传输协议,用于向服务器传输下载文件
rtsp,rtspu实时流传输协议,音频视频传输协议
file表示一台指定主机,本地硬盘,局域网共享文件
news访问特定新闻
telnet方案telnet用于访问交互式业务

第三章 http报文

简单来说http报文就是http所搬运的东西。

3.1.1 报文流入源端服务器

http使用术语流入和流出,分别代表发送,request,response, 所有报文都是向下移动的。

报文组成部分
  • 方法,method,包括get post head
  • 请求URL
  • 版本version
  • 状态吗 status-code
  • 原因短句(reponse-phrase)
  • 首部 header
  • 实体部分entity-body
1.起始行

require使用哪种http,get还是post方法,reponse 200还是404

2.响应行

http方法+200/404

3.方法

get post

4.状态码200
5.原因短语

ok

6.版本号

http1.1/http2。0

3.2.3 首部

Content-length: 19

3.3 方法。

  • get方法 最常用的方法,一般用于获取文件

  • head,方法,获取头部信息,不获取 主体信息,

    • 一般用于查看在不获取资源的情况下了解资源的情况,类型。
    • 通过查看响应中的状态码,看看某个对象是否存在,
    • 通过查看首部,测试资源是否被修改了。 只有当服务器开发者为了保证head返回的和get请求所返回的完全相同,遵循http1.1规范,那就必须实现HEAD方法,
  • PUT方法 与get完全相反,put用于向服务器写入文档,有些发布系统允许用户创建web界面,并用put直接将其安装到web服务器上面去。

  • POST方法 用于向服务器传输数据,一般用于发送表单。

  • TRACE 客户端发送一个请求,这个请求可能穿过防火墙,代理,网关,或者其他地方,这些都有可能修改原始的http请求,Trace允许用户查看最总请求服务器的时候是什么样。

  • OPTIONS 允许请求服务器告知其支持的各种功能,可以询问服务器通常支持哪些方法,或者对某些方法,支持哪些方法。

  • delete 用于删除文件,

扩展方法

http被设计成可扩展的,这样。

方案描述
lock允许用户锁定某些资源
MKCOL允许用户创建资源
COPY便于在服务器上修复资源
MOVE在服务器上移动资源

3.4 状态码

总共五大类1xx,2xx,3xx,4xx,5xx

状态码含义
100说明收到了请求的初始部分,请客户端继续
101说明服务器正在根据客户端指定,将协议切换成Update首部所有协议

1。 客户端与100 Continue

如果客户端在向服务器发送一个实体,并且愿意在发送实体之前等待100 Continue响应,那么客户端就要发送一个携带了值为100 Continue 的Expect请求首部,如果客户端没有实体,就不应该100 Continue Expect 首部,因为这样会让服务器误以为客户端要发送一个实体。

从多个角度来说,100 Continue都是一种优化。客户端应用程序只有避免向服务器发送一个服务器无法处理或使用的大实体时候,才应该使用100Continue。

由于起初对100 Continue状态存在一些困惑(而且以前有些实现在这里出过的问题),因此发送了值为100Continue响应,超时一定的时候,客户端应该直接将实体发送出去。

实际上,客户端程序的实现者也应该做好应对非预期 100 Continue响应的准备。 作为三次握手的第一个步骤,发送100

  • 1:A发,B收, B知道A能发
  • 2:B发,A收, A知道B能发收
  • 3:A发,B收, B知道A能收

2.服务器与 100 Continue

如果服务器收到了一条带有值为100 Continue的expect首部请求,他会用到100 Continue响应或一条错误码来进行响应,服务器永远不应该向没有发送100 Continue期望客户端发送100 Continue状态码。但是错误的服务器可能会这么做。

这就是为什么要三次握手,第一次a发,b收,b可以得出结论a能发验证码,第二次b发a收,a可以得出结论,b正常,可以接收到他发的信息,同时可以发回信息给他,第三次,a又重新发信息给b,b受到信息后得出结论,不单是可以发信息的,同时,他也收到了我发的信息。通过三次握手,得出a,b互相得出结论,他们都具备收发功能。

3.代理与100 Continue的关系,

代理收到100 期望请求,他需要做如下事情,

  • 下一个服务器兼容http1.1,或者代理也不知道下一个服务器兼不兼容,他会将expect首部放在请求中进行转发吗,但是如果他知道下一个服务器只能兼容HTTP1.1之前的版本,那么就应该以417 Expectation Failed进行响应。 但是如果代理服务器与http/1.0之前版本兼容,在请求中放入expect首部和100Continue 值,那么,他就不该将100Continue响应发给客户端, 代理维护一下关于下一条服务器是否支持所支持http版本的状态信息是有好处的,这样就能更好的处理哪些带有100 Continue请求。

2xx 状态码

状态码原因短句含义
200OK请求没有问题,实体的主体部分包含了所请求的资源
201Created用于创建服务器对象的请求,比如PUT,响应的实体部分中应该包含各种引用了已创建的资源URL,但是服务器必须在发这个请求之前创建好对象
202Accepted请求已经被接受,但服务器没有任何动作
203Non-Authoriative Information实体首部验证信息不来自于本服务器
204No Content响应报文中包含若干首部和一个状态行,但是没有实体部分,主用于浏览器不转为显示新文档,只是刷新一个页面的表单
205Reset Content另一个主要用于浏览器的代码,负责告知浏览器清除当前页面所有HTML表单元素
206Partial Content部分请求成功

3xx:::重定向请求

状态码原因短句含义
300Multiple Choices客户一个请求指向多个资源
301Move Permanently在请求的URL已经被移除的时候,响应的Location首部中应该包含了资源现所在处的URL
302Found与301相似,但是,客户端应该使用location首部给出URL来临时定位资源
303See Other告诉客户应该去另一个URL来获取资源,新的url应该位于报文Location首部
304Not Modified未修改,看不懂啥意思。。
305Use Proxy用户必须通过一个代理才能访问资源
306未使用没有用过
307Temporary Redirect与301类似,但客户端应该使用Location首部给出的URL来临时定位资源

4xx客户端错误状态码

状态码原因短句含义
400bad request用于告知客户他发送了一个错误的请求
401Unauthorized未验证身份
402Payment Required未使用
403Forbidden请求被拒绝
404Not Found找不到资源
405Method Not Aollowed所请求的方法不支持
406Not Acceptable服务器端找不到客户端所指定的资源类型
407Proxy Authentivation Require代理服务器要求验证
408Request Timeout请求超时
409Conflict请求主体冲突
410Gone找不到

5xx 服务器错误状态码

状态码原因短句含义
500Interal Server Error服务器遇到一个妨碍它为请求提供服务的错误时,使用
501Not Implemented客户端发起请求超出服务器能力范围
502Bad Gateway作为代理或者网关,使用从服务器清秀响应链的下一条链路上收到了一条伪响应
503Service Unavailable说明服务器现在无法提供请求,但是将来可以,如果服务器什么时候可以了,可以在响应中包含一个Retry-After 首部
504Gateway Timeout和408类似,只是这里响应来自一个网关代理,他在另一端响应超时了
505HTTP Version Not Support服务器收到的请求使用了他无法或者不愿意支持的协议版本时,使用此状态码,有些服务器应用程序会选择不支持协议的早期版本。

3.5 首部

首部有以下5种类型

  • 通用首部

Date:Tue,3 Oct 1974 02:16:00

  • 请求首部 请求报文所特有的

Accept: "/"

  • 响应首部

Server: Tiki - Hut/1.0

  • 实体首部

Content-Type: text/html; charset=iso-latin-1

  • 扩展首部

通用首部

有些首部提供了与报文相关的最基本信息,他们称之为通用首部,他们向和事佬一样,无论是报文是什么类型,都为其提供一些有用信息。 例如:不管是构建请求报文还是响应报文,创建报文的日期和时间都一样。

首部描述
Connection允许客户端和服务端指定与请求一致的选项
Date提供日期和时间标志
MIME-VERSION给出了发送服务端使用的MIME版本
Trailer如果报文采用了分块传输编码方式,就可以使用这个首部列出位于报文拖挂部分的首部集合
Trailer-Encoding告诉接受端为了保证报文的可靠传输,对报文采用了什么编码方式
Update给出了发送端可能想要升级使用的新版本或者协议
Via显示了报文经过的中间节点(代理?)

通用缓存首部

HTTP/1.0引入了第一个允许HTTP应用程序缓存对象本地副本的首部,这样就不能需要总是从服务端获取了。

1. Accept 首部

首部描述
Accept告诉服务器能够发送哪些媒体类型
Accept-Charset告诉服务器能够发送哪些字符集
Accept-Encoding告诉服务器能够发送哪些编码方式
Accept-Language告诉服务器能够发送哪些语言
TE告诉服务器可以使用哪些扩展传输代码
  1. 条件请求首部 有时候客户端洗碗加上某些限制,比如,如果客户端已经有了一份文档副本,就希望只在服务器上的文档与客户端拥有的副本所有区别时,才请求传输文档,
首部描述
Expect允许客户端列出来某些请求所要求的服务器行为
If-Match告诉服务器能够发送哪些字符集
If-Modified-Since除非在某个指定的日期
if-none-match如果提供的实例标记与当前文档实体标记不相符,就获取文档
if-range允许对文档的某个方位按条件进行请求
if-unmodified-since除非在某个指定日期范围之后资源没有没修改过,否则就限制这个请求
Range如果服务器支持范围请求,就请求资源的指定方位

3.安全请求首部

HTTP本身就是支持一种简单机制,可以对请求进行质询/响应认证,这种机制要求客户端在获取特定的资源之前,先对自身进行认证,这样就可以使事物稍微安全一些,

首部描述
Authorization包含了客户端提供给服务器,以便对自身进行认证的数据
Cookie客户端向它服务器传送一个令牌---他并不是真正的安全首部,但确实包含了安全功能
Cookie2用来说明请求段支持cookie版本

4.代理请求首部

随着internet,发展,网上代理普遍应用,人们定义了几个首部来协助其他更好的工作,

首部描述
Max-Forward在通往源服务端路径上,将请求转发给其他代理或者网关最大次数--与TRACE方法一起使用
Proxy-Authorization与Authorization首部相同,但是这个首部是在与代理进行认证使用
Proxy-ConnectionConnection首部相同,但是这个首部是在与代理进行连接时使用

3.5.3 响应首部

响应报文有自己的响应首部。响应首部为客户端提供了一些额外信息,比如谁在发送响应,响应者功能,

首部描述
Age从最初创建开始,响应持续时间
Public服务器为其资源支持的请求方法列表
Retry-After如果资源不可用的化,就在日期或者时间重试
Server服务器应用程序软件的名称和版本
Title对html文档来说,就是html文档的源端给出的标题
Warning比原因短句中更详细一些的警告报文

1.协商首部

日过资源有多种表示方法

首部描述
Accept-Ranges对此资源来说,服务器可接受的范围类型
Vary服务器查看其他首部的列表,可能会使响应发生变化,也就是说,这是一个首部列表,服务器会更具这些首部内容挑选出最适合的资源版本发送给客户端。

2.安全响应首部

首部描述
Proxy-Authorization与Authorization首部相同,但是这个首部是在与代理进行认证使用
Set-cookie不是真正的安全首部,但隐含有安全功能,可以在客户端设置一个令牌,以便服务器对客户进行标识
Set-cookie2与set-cookie类似,
www-authenticate来自服务器的对客户端的质询列表

3.5.4 实体首部

许多有首部的可以用来表示http报文的负荷,由于请求响应报文中都可以可能包含实体部分,所以在这两种类型的报文都可以出现这些首部。

实体首部提供了有关实体及其内容的大量信息,,总之,实体首部可以告诉报文的接收者他在对什么进行处理。

首部描述
Allow列出了可以对此实体执行的请求方法
Location告知客户实体实际上位于何处,用于将接受端指向资源的

1.内容首部,

内容首部提供了与实体内容有关的特定信息,说明了类型,尺寸以及处理他们所需的其他有用信息,比如web浏览器可以通过查看返回的内容类型,

首部描述
Content-base解析主体中相对url使用的基础url
Content-Encoding对主体执行的任意编码方式
Content-Language理解主体时最适宜使用的自然语言
Content-length主体长度
Content-Location资源所在处实际位置
Content-MD5主体MD5校验和
Content-Range在整个资源中,此实体表示的字节范围
Content-Type这个主体的对象类型

2.实体缓存首部

首部描述
Etag于此实体相关的实体标记
Expires实体不在有效,要从原始源资源在次获取次实体的日期和时间
Last-Modified这个实体最后一次被修改的日期和时间