HTTP(Hypertext Transfer Protocol, 超文本传输协议),http起初是一个简单协议,因此你也许以为这个没什么好说的,请看目录,你会发现这本书是web架构“圣经”。 纵观全书,我们对于http不仅仅停留在表现,而是深入浅出解释了。这是一本cs(compute science)基础书籍。好吧,我应该补基础了。
本书分为5部分
每天网络上,充斥着各种,资源,jpg,html页面,mpeg电影,WAV音频文件,java小程序,等,而http可以从全世界各个地方的web服务器上将这些信息迅速便捷搬移到人们桌面上的web浏览器上面, http采用可靠的数据传输协议,因此,即使数据来自地球另一端,也可以准确的把数据传给我,并不发生损坏。下面来讲一下,近距离观察,http是如何传输web流量的。
http客户端发出请求,服务器会根据协议,解析,发送提供数据。这是万维网的基本组件。 当你浏览一个页面比如www.baidu.com的时候,浏览器向服务器发送请求,,服务器默认发送index.html文件给浏览器。
web服务器是web资源的宿主,而web资源是web内容的源头,这些文件包括任意内容,如html,word文件,图片文件,avi电影, 但同时资源文件不一定是静态文件,资源也可以是根据资源生成的软件程序。例如JSON数组。
MIME(Multipurpose Internet Mail Extension, 多用途因特网邮件扩展),这个是为了在不同邮件系统中挪移报文。http同样采用了它,并且用它标记多媒体内容, web服务器会为所有HTTP对象附加一个MIME类型,MIME是一种文本标记,表示对象类型,和特定子类型,
常见的类型有数百种。
每一个web服务器都有一个名字,服务器资源名称 为 统一资源标识符(Uniform Resource Identifier, URL)。URL就像一个地址一样,在全世界范围内标识并定位资源信息。 URI有两种形式 URL,和URN
http://
这部分作为网络上唯一名称使用的,这种与资源所在地无关,就可以将资源四处搬移,
http支持不同几种请求命令,常见的包括如下
HTTP报文有一行行简单的字符串组成,HTTP报文都是纯文本,而不是二进制码, http报文主要分为下面3部分
起始行 主要用来说明请求用来做什么,在响应报文中描述了出现了什么情况,是200还是302
首部字段 起始行后面有0或者多个首部字段,每一行都包括一个名字和一个值,
主体 空行之后就是可选的报文主体,其中包含了所有类型的数据,请求柱体包括了要发给服务器的数据,响应主体包括了返回给客户的数据,可以是任意的二进制内容,也可以是文本。
讲一下,报文如何通过传输控制协议(Transmission Control Protocol,TCP),连接从一个地方搬移到另一个地方去。
http是应用层协议,HTTP无需操心网络通信的具体细节,他把网络的细节都交给了通用可靠的因特网传输协议:TCP/IP TCP提供了:
因特网本身就是基于TCP/IP的,这个是全世界计算机和网络设备常用的层次化分组交换网络协议,TCP/IP隐藏了硬件的弱点和特点,。安全通讯。
网络术语 | 对应层次 |
---|---|
HTTP | 应用层 |
TCP | 传输层 |
IP | 网络层 |
网络特有链路接口 | 数据链路层 |
物理网络硬件 | 物理层 |
在http客户端向服务端发送报文之前,需要用到网络协议(Internet Protocol , IP),在网络协议地址和端口号在客户和服务器之间建立一条TCP/IP连接。
至于如何获得HTTP服务器和IP地址呢?当然是通过URL了,URL就是资源地址, 步骤如下:
本章重点介绍2个web应用程序,web浏览器和web服务器
代理 位于客户端和服务器之间http中间实体。
缓存 http仓库,是常用页面的副本得到保存,可以离客户更近的地方
网关 连接其他应用的特殊web服务器
隧道 对http通信报文进盲转发的特殊处理
Agent 代理 发起自动http请求的半智能web客户端。
首先看 http代理服务器,这是web安全,应用集成以及性能优化的重要组成模块。处于安全考虑,比如企业对下载内容进行病毒检测,或者屏蔽成人网站,,代理可以对请求和响应进行过滤。
这是一种特殊的http代理服务器,可以将经过代理传送的常用文档复制保存起来。
网关是一种特殊服务器,作为接受其他服务器中间体使用,通常用于将http流量转换成其他协议。
http隧道是一种常见的用途是通过http连接承载加密安全套接字层流量,
用户agent代理是代表用户发起http请求的客户端程序。所有发布web请求都是通过agent代理。最常见的agent代理就是浏览器,但是还有很多其他的代理,比如网络蜘蛛,或者web机器人。自动搜索引擎就是web蜘蛛,它可以从世界范围获取web页面,
所有的东西都有编号,比如快递收货地址,只有这样,整个城市协作才能进行下去。
那么不得不提到URL,他是URI的子集,它通过资源位置来识别资源。URL分成3部分
同时,URL可以通过HTTP之外的其他协议访问资源,他们指向因特网上的任意资源,
URL提供了一种统一的资源命名方式,大多数URL都有同样的:"方案://服务器位置/路径"
<scheme>://<user>:<password>@<host>:<prot>/<path>;<params>?<query>#<frag>
方案 | 描述 |
---|---|
http | http://baidu.com |
https | https://baidu.com |
mailto | email地址,mailto: |
ftp | 文件传输协议,用于向服务器传输下载文件 |
rtsp,rtspu | 实时流传输协议,音频视频传输协议 |
file | 表示一台指定主机,本地硬盘,局域网共享文件 |
news | 访问特定新闻 |
telnet | 方案telnet用于访问交互式业务 |
简单来说http报文就是http所搬运的东西。
http使用术语流入和流出,分别代表发送,request,response, 所有报文都是向下移动的。
require使用哪种http,get还是post方法,reponse 200还是404
http方法+200/404
get post
ok
http1.1/http2。0
Content-length: 19
get方法 最常用的方法,一般用于获取文件
head,方法,获取头部信息,不获取 主体信息,
PUT方法 与get完全相反,put用于向服务器写入文档,有些发布系统允许用户创建web界面,并用put直接将其安装到web服务器上面去。
POST方法 用于向服务器传输数据,一般用于发送表单。
TRACE 客户端发送一个请求,这个请求可能穿过防火墙,代理,网关,或者其他地方,这些都有可能修改原始的http请求,Trace允许用户查看最总请求服务器的时候是什么样。
OPTIONS 允许请求服务器告知其支持的各种功能,可以询问服务器通常支持哪些方法,或者对某些方法,支持哪些方法。
delete 用于删除文件,
http被设计成可扩展的,这样。
方案 | 描述 |
---|---|
lock | 允许用户锁定某些资源 |
MKCOL | 允许用户创建资源 |
COPY | 便于在服务器上修复资源 |
MOVE | 在服务器上移动资源 |
总共五大类1xx,2xx,3xx,4xx,5xx
状态码 | 含义 |
---|---|
100 | 说明收到了请求的初始部分,请客户端继续 |
101 | 说明服务器正在根据客户端指定,将协议切换成Update首部所有协议 |
如果客户端在向服务器发送一个实体,并且愿意在发送实体之前等待100 Continue响应,那么客户端就要发送一个携带了值为100 Continue 的Expect请求首部,如果客户端没有实体,就不应该100 Continue Expect 首部,因为这样会让服务器误以为客户端要发送一个实体。
从多个角度来说,100 Continue都是一种优化。客户端应用程序只有避免向服务器发送一个服务器无法处理或使用的大实体时候,才应该使用100Continue。
由于起初对100 Continue状态存在一些困惑(而且以前有些实现在这里出过的问题),因此发送了值为100Continue响应,超时一定的时候,客户端应该直接将实体发送出去。
实际上,客户端程序的实现者也应该做好应对非预期 100 Continue响应的准备。 作为三次握手的第一个步骤,发送100
如果服务器收到了一条带有值为100 Continue的expect首部请求,他会用到100 Continue响应或一条错误码来进行响应,服务器永远不应该向没有发送100 Continue期望客户端发送100 Continue状态码。但是错误的服务器可能会这么做。
这就是为什么要三次握手,第一次a发,b收,b可以得出结论a能发验证码,第二次b发a收,a可以得出结论,b正常,可以接收到他发的信息,同时可以发回信息给他,第三次,a又重新发信息给b,b受到信息后得出结论,不单是可以发信息的,同时,他也收到了我发的信息。通过三次握手,得出a,b互相得出结论,他们都具备收发功能。
代理收到100 期望请求,他需要做如下事情,
状态码 | 原因短句 | 含义 |
---|---|---|
200 | OK | 请求没有问题,实体的主体部分包含了所请求的资源 |
201 | Created | 用于创建服务器对象的请求,比如PUT,响应的实体部分中应该包含各种引用了已创建的资源URL,但是服务器必须在发这个请求之前创建好对象 |
202 | Accepted | 请求已经被接受,但服务器没有任何动作 |
203 | Non-Authoriative Information | 实体首部验证信息不来自于本服务器 |
204 | No Content | 响应报文中包含若干首部和一个状态行,但是没有实体部分,主用于浏览器不转为显示新文档,只是刷新一个页面的表单 |
205 | Reset Content | 另一个主要用于浏览器的代码,负责告知浏览器清除当前页面所有HTML表单元素 |
206 | Partial Content | 部分请求成功 |
状态码 | 原因短句 | 含义 |
---|---|---|
300 | Multiple Choices | 客户一个请求指向多个资源 |
301 | Move Permanently | 在请求的URL已经被移除的时候,响应的Location首部中应该包含了资源现所在处的URL |
302 | Found | 与301相似,但是,客户端应该使用location首部给出URL来临时定位资源 |
303 | See Other | 告诉客户应该去另一个URL来获取资源,新的url应该位于报文Location首部 |
304 | Not Modified | 未修改,看不懂啥意思。。 |
305 | Use Proxy | 用户必须通过一个代理才能访问资源 |
306 | 未使用 | 没有用过 |
307 | Temporary Redirect | 与301类似,但客户端应该使用Location首部给出的URL来临时定位资源 |
状态码 | 原因短句 | 含义 |
---|---|---|
400 | bad request | 用于告知客户他发送了一个错误的请求 |
401 | Unauthorized | 未验证身份 |
402 | Payment Required | 未使用 |
403 | Forbidden | 请求被拒绝 |
404 | Not Found | 找不到资源 |
405 | Method Not Aollowed | 所请求的方法不支持 |
406 | Not Acceptable | 服务器端找不到客户端所指定的资源类型 |
407 | Proxy Authentivation Require | 代理服务器要求验证 |
408 | Request Timeout | 请求超时 |
409 | Conflict | 请求主体冲突 |
410 | Gone | 找不到 |
状态码 | 原因短句 | 含义 |
---|---|---|
500 | Interal Server Error | 服务器遇到一个妨碍它为请求提供服务的错误时,使用 |
501 | Not Implemented | 客户端发起请求超出服务器能力范围 |
502 | Bad Gateway | 作为代理或者网关,使用从服务器清秀响应链的下一条链路上收到了一条伪响应 |
503 | Service Unavailable | 说明服务器现在无法提供请求,但是将来可以,如果服务器什么时候可以了,可以在响应中包含一个Retry-After 首部 |
504 | Gateway Timeout | 和408类似,只是这里响应来自一个网关代理,他在另一端响应超时了 |
505 | HTTP Version Not Support | 服务器收到的请求使用了他无法或者不愿意支持的协议版本时,使用此状态码,有些服务器应用程序会选择不支持协议的早期版本。 |
首部有以下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应用程序缓存对象本地副本的首部,这样就不能需要总是从服务端获取了。
首部 | 描述 |
---|---|
Accept | 告诉服务器能够发送哪些媒体类型 |
Accept-Charset | 告诉服务器能够发送哪些字符集 |
Accept-Encoding | 告诉服务器能够发送哪些编码方式 |
Accept-Language | 告诉服务器能够发送哪些语言 |
TE | 告诉服务器可以使用哪些扩展传输代码 |
首部 | 描述 |
---|---|
Expect | 允许客户端列出来某些请求所要求的服务器行为 |
If-Match | 告诉服务器能够发送哪些字符集 |
If-Modified-Since | 除非在某个指定的日期 |
if-none-match | 如果提供的实例标记与当前文档实体标记不相符,就获取文档 |
if-range | 允许对文档的某个方位按条件进行请求 |
if-unmodified-since | 除非在某个指定日期范围之后资源没有没修改过,否则就限制这个请求 |
Range | 如果服务器支持范围请求,就请求资源的指定方位 |
HTTP本身就是支持一种简单机制,可以对请求进行质询/响应认证,这种机制要求客户端在获取特定的资源之前,先对自身进行认证,这样就可以使事物稍微安全一些,
首部 | 描述 |
---|---|
Authorization | 包含了客户端提供给服务器,以便对自身进行认证的数据 |
Cookie | 客户端向它服务器传送一个令牌---他并不是真正的安全首部,但确实包含了安全功能 |
Cookie2 | 用来说明请求段支持cookie版本 |
随着internet,发展,网上代理普遍应用,人们定义了几个首部来协助其他更好的工作,
首部 | 描述 |
---|---|
Max-Forward | 在通往源服务端路径上,将请求转发给其他代理或者网关最大次数--与TRACE方法一起使用 |
Proxy-Authorization | 与Authorization首部相同,但是这个首部是在与代理进行认证使用 |
Proxy-Connection | Connection首部相同,但是这个首部是在与代理进行连接时使用 |
响应报文有自己的响应首部。响应首部为客户端提供了一些额外信息,比如谁在发送响应,响应者功能,
首部 | 描述 |
---|---|
Age | 从最初创建开始,响应持续时间 |
Public | 服务器为其资源支持的请求方法列表 |
Retry-After | 如果资源不可用的化,就在日期或者时间重试 |
Server | 服务器应用程序软件的名称和版本 |
Title | 对html文档来说,就是html文档的源端给出的标题 |
Warning | 比原因短句中更详细一些的警告报文 |
日过资源有多种表示方法
首部 | 描述 |
---|---|
Accept-Ranges | 对此资源来说,服务器可接受的范围类型 |
Vary | 服务器查看其他首部的列表,可能会使响应发生变化,也就是说,这是一个首部列表,服务器会更具这些首部内容挑选出最适合的资源版本发送给客户端。 |
2.安全响应首部
首部 | 描述 |
---|---|
Proxy-Authorization | 与Authorization首部相同,但是这个首部是在与代理进行认证使用 |
Set-cookie | 不是真正的安全首部,但隐含有安全功能,可以在客户端设置一个令牌,以便服务器对客户进行标识 |
Set-cookie2 | 与set-cookie类似, |
www-authenticate | 来自服务器的对客户端的质询列表 |
许多有首部的可以用来表示http报文的负荷,由于请求响应报文中都可以可能包含实体部分,所以在这两种类型的报文都可以出现这些首部。
实体首部提供了有关实体及其内容的大量信息,,总之,实体首部可以告诉报文的接收者他在对什么进行处理。
首部 | 描述 |
---|---|
Allow | 列出了可以对此实体执行的请求方法 |
Location | 告知客户实体实际上位于何处,用于将接受端指向资源的 |
内容首部提供了与实体内容有关的特定信息,说明了类型,尺寸以及处理他们所需的其他有用信息,比如web浏览器可以通过查看返回的内容类型,
首部 | 描述 |
---|---|
Content-base | 解析主体中相对url使用的基础url |
Content-Encoding | 对主体执行的任意编码方式 |
Content-Language | 理解主体时最适宜使用的自然语言 |
Content-length | 主体长度 |
Content-Location | 资源所在处实际位置 |
Content-MD5 | 主体MD5校验和 |
Content-Range | 在整个资源中,此实体表示的字节范围 |
Content-Type | 这个主体的对象类型 |
首部 | 描述 |
---|---|
Etag | 于此实体相关的实体标记 |
Expires | 实体不在有效,要从原始源资源在次获取次实体的日期和时间 |
Last-Modified | 这个实体最后一次被修改的日期和时间 |