图解HTTP 读书笔记 HTTP协议相关
图解HTTP这本书,我这里准备分两篇来讲,这篇是上篇,涉及到书中的了解Web及网络基础、简单的HTTP协议、HTTP报文内的HTTP信息,HTTP状态码,HTTP首部这五章内容,主要讲Web网页和HTTP的一些基本概念以及HTTP报文的有关信息。
下篇则涉及Web服务器、HTTPS、用户身份认证和构建Web内容技术;也就是有关Web服务器、Web网页和Web安全的内容。
一 Web基础
Web(World Wide Web):即全球广域网,也称为万维网,它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。
Web构建的基本理念:借助多文档之间相互关联形成的超文本(HyperText),连成可相互参阅的WWW。
Web构建技术:
1. HTML:把SGML作为页面的文本标记语言
2. HTTP:文档传输协议
3. URL:指定文档所在位置
以上3项技术分别代表了通信内容——Web网页;通信方式——HTTP协议;通信地址——URL。此外还有通信内容提供方——Web服务器,以及通讯内容获取方——客户端。这五个方面,就是Web技术的主要内容。
Web服务器和Web页面是下一篇的内容,Web客户端这里不讲。HTTP协议是下面的重要内容,这里写简单讲下URL。
1.1 URL
绝对URI格式:
https://item.taobao.com/item.htm?spm=a21ig.11052422.944389.2.74709cb1YKlqaV&id=530476331966
https://user:pass@item.taobao.com:80/item.htm?spm=a21ig.11052422.944389.2.74709cb1YKlqaV#ch1
上面给出了两个网址,第一个是真实淘宝地址,第二个是在第一个基础上经过添加删减用于说明的地址。绝对URI格式从左到右可分为7个部分:
1.协议方案名:即https://,注意格式
2. 登录信息(认证):可选项,见二中的user:pass@
3. 服务器地址:即item.taobao.com,可为网址,也可为IP地址。
4. 服务器端口号:可选项,忽略时使用默认端口号
5. 带层次的文件路径:见二中的item.htm?,指定服务器上的文件路径来定位特指文件
6. 查询字符串:见spm=。。。&。。。,查询已制定的文件路径内的资源
7. 片段标识符:见二中的#ch1,用以标识已获取资源中的子资源
二 HTTP基础
HTTP协议:HTTP协议位于计算机网络分层的最上层——应用层。用以实现客户端和服务器之间的通信。有关整个计算机网络的可以参考图解TCP/IP这本书,也可以看下我的读后感权当解闷。
客户端:请求访问文本或图像等资源的一端,客户端程序即为Web浏览器
服务端:提供资源响应的一端即为服务端。
需要说明的是,一台机器既可以是客户端也可以是服务端。甚至两者之间关系可以互换。但是在一条确定通信线路上,客户端和服务端的身份是确定的。
2.1 通过HTTP进行通信的完整流程
在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:
1. 建立TCP连接:
在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能进行更高层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。
2. Web浏览器向Web服务器发送请求命令
一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令。例如:
GET/ sample/hello.jsp HTTP/1.1
3. Web浏览器发送请求头信息
浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。
4. Web服务器应答
客户机向服务器发出请求后,服务器会客户机回送应答, HTTP/1.1 200 OK ,应答的第一部分是协议的版本号和应答状态码。
5. Web服务器发送应答头信息
正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。
6. Web服务器向浏览器发送数据
Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。
7. Web服务器关闭TCP连接
一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,一次请求对应一次响应。在HTTP1.1中引入持久连接和管程化以实现更高效地通信。在浏览器或者服务器在其头信息加入这行代码Connection:keep-alive
即可。
注:本小节参考自参考资料2
2.2 HTTP协议缺陷与对应解决
1. 无状态:HTTP属于无状态协议,其协议本身对于发送过的请求和响应都不做持久化处理。现在一般是通过引入Cookie技术实现状态管理:Cookie根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。在下次通信时,客户端自动在请求报文中加入Cookie值再发送过去。这样服务器根据其服务器上保存的记录可以得知状态信息。
2. 单次连接:由上节的HTTP通信过程可以看出,早期的HTTP通信设计是每一次通信就要进行一次TCP连接到断开的完整过程。考虑到现在通信量远远大于之前,这样做会异常耗时。现在的HTTP协议则通过持久连接——在明确提出断开TCP请求前保持连接和管线化——不等下次响应直接发送下一个请求来大大提高传输速率。
3. 安全性:HTTP安全性较低,通信使用明文、没有身份验证、报文完整性无法验证,总体上有着很大的安全隐患。现在一般是使用HTTPS来实现安全可靠的Web通信,在下一篇进行讲解。
三 HTTP报文
本节讲HTTP通信的细节部分——HTTP报文。根据2.1节可知,在HTTP通信的过程中,是通过客户端发出请求,服务器端对请求进行响应的方式来实现通信的。其中,请求和响应都是以报文的形式实现的,分别对应请求报文和响应报文。
本节的内容就是HTTP的请求报文和响应报文的结构分析和各部分详细说明。
3.1 报文结构
HTTP报文可大致分为报文首部和报文主体两部分,中间用空行(回车+换行)分隔。通常不一定要有报文主体。
3.2 请求报文
![](https://img-blog.csdn.net/20171225230202070?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYW5hbmhhbw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
请求报文的结构如上图所述。其中,报文首部由请求行和请求头部构成。报文首部和请求正文被空行分开。
请求行:请求行包括三个参数:请求方法,URL和协议版本。其中,考虑到请求头部中一定会有Host首部字段来标识地址,URL一般可忽略。协议版本一般为HTTP/1.1。请求方法由八个,包括了客户端能向服务器发出的所有方法申请。请求行示例如下:
POST /form/entry HTTP/1.1
GET / HTTP/1.1 //URL忽略时需要以/代替
HTTP/1.1中可用的8个请求方法列表:
方法 | 作用 | 说明 |
---|
GET | 获取资源 | 请求访问已被URI识别的资源,指定的资源经服务器解析后返回响应内容 |
POST | 提交数据 | 在Request-URI所标识的资源后附加新的数据 |
PUT | 传输文件 | 请求获取由Request-URI所标识的资源的响应消息报头 |
DELETE | 删除文件 | 请求服务器删除Request-URI所标识的资源 |
HEAD | 获取报文首部 | 请求获取由Request-URI所标识的资源的响应消息报头 |
OPTION | 询问支持方法 | 请求查询服务器的性能,或者查询与资源相关的选项和需求 |
TRACE | 追踪路径 | 请求服务器回送收到的请求信息,主要用于测试或诊断 |
CONNECT | 隧道连接代理 | 要求在与代理服务器通信时建立隧道 |
首部字段(请求头部)可分为四种,其中请求报文中涉及其中三种:请求首部字段、通用首部字段和实体首部字段。首部字段由首部字段名和字段值构成。结构如下:
首部字段名:字段值
通用首部字段
通用首部字段,顾名思义,是指请求报文和响应报文中都会使用的首部,共有9种。
HTTP通用首部字段列表:
首部字段名 | 说明 |
---|
Cache-Control | 控制缓存行为 |
Connection | 逐跳首部、连接的管理 |
Date | 创建报文的时间 |
Pragma | 主要使用 Pramga: no-cache,相当于 Cache-Control: no-cache |
Transfer-Encoding | 服务器表明自己对本响应消息体(不是消息体里面的对象)编码信息 |
Upgrade | 协议升级 |
Via | 列出从客户端到服务器或者相反方向的响应经过了代理服务器信息 |
Warning | 错误通知 |
请求首部字段
通用首部字段,顾名思义,是指从客户端向服务端发送请求报文时使用的首部。补充了请求的附加信息、客户端信息、响应内容相关优先级等,共19个。
HTTP请求首部字段列表:
首部字段名 | 说明 |
---|
Accept | 告诉WEB服务器自己接受什么媒体类型 |
Accept-Charset | 浏览器申明自己接收的字符集 |
Accept——Encoding | 浏览器申明自己接收的编码方法 |
Accept-Language | 浏览器申明自己接收的语言语言跟字符集的区别 |
Authorization | Web认证信息 |
Expect | 期待服务器的特定行为 |
From | 用户的电子邮箱地址 |
Host | 请求资源所在服务器 |
If-Match | 比较实体标识ETAG |
If-None_Match | 与上面相反 |
If-Modified-Since | 比较资源更新时间 |
If-Unmodified-Since | 与上面相反 |
If-Range | 资源未更新时发送实体Byte的请求范围 |
Max-Forwards | 最大传输逐跳数 |
Proxy-Authorization | 代理服务器要求客户端的认证信息 |
Range | 实体的字节范围请求 |
Referer | 对请求中URI的原始获取方 |
TE | 传输编码的优先级 |
User-Agent | HTTP客户端信息 |
实体首部字段
实体首部字段,针对请求报文和响应报文的实体部分使用的报文。补充与实体有关的信息,共10个。
HTTP实体首部字段列表:
首部字段名 | 说明 |
---|
Allow | 资源可支持的HTTP方法 |
Content-Encoding | 实体主体适用的编码方式 |
Content-Language | 实体主体的自然语言 |
Content-Length | 实体主体的大小(字节数) |
Content-Location | 替代对应资源的URI |
Content-MD5 | 实体主体的报文摘要 |
Content-Range | 实体主体的位置范围 |
Content-Type | 实体主体的媒体类型 |
Expires | 实体主体过期的时间日期 |
Last-Modified | 资源的最后修改日期时间 |
3.3 响应报文
![这里写图片描述](https://img-blog.csdn.net/20171226000523868?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYW5hbmhhbw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
请求报文的结构如上图所述。其中状态行由协议版本和状态码部分组成。状态行示例如下:
HTTP/1.1 200 OK
状态码的职责是当客户端向服务端发送请求时,告知返回的请求结果。状态码由3位数字和原因短语组成。数字的第一位指定响应类别,共分5类。状态码一共有大约60余种,常用的14种。
HTTP响应报文状态码分类:
- | 状态码类型 | 说明 |
---|
1XX | Informational消息性状态码 | 接收的请求正在处理 |
2XX | Success成功状态码 | 请求正常处理完毕 |
3XX | Redirection重定向状态码 | 需要进行附加操作以完成请求 |
4XX | Client Error客户端错误状态码 | 服务器无法处理请求 |
5XX | Server Error服务器错误状态码 | 服务器处理请求出错 |
HTTP响应报文常用状态码列表:
状态码类型 | 说明 |
---|
200 OK | 请求被正常处理 |
204 No Content | 成功处理,但响应不含主体部分 |
206 Partial Content | 响应报文中成功返回范围请求对应的实体内容 |
301 Moved Permanently | 永久性重定向 |
302 Found | 临时性重定向 |
303 See Other | 指明让客户端使用GET方法向服务器的另一URI发送请求 |
304 Not Modified | 服务器端资源未改变,可直接使用客户端未过期缓存 |
400 Bad Request | 请求报文中存在语法错误 |
401 Unauthorized | 请求需要通过HTTP认证的认证信息 |
403 Forbidden | 请求资源的访问被服务器拒绝 |
404 Not Found | 服务器无法找到资源或服务器的不想提供资源的借口 |
500 Internal Server Error | 服务器执行请求时发生了错误 |
503 Service Unavailable | 服务器超载或停机维护 |
响应报文也涉及首部字段其中三种:响应首部字段、通用首部字段和实体首部字段。其中,后两种在上一节已经说过,这里再说下响应首部字段。
响应首部字段补充了响应的附加信息,也会要求客户端附加额外的内容信息,有9种。
HTTP响应首部字段列表:
首部字段名 | 说明 |
---|
Accept-Ranges | 是否接收字节范围请求 |
Age | 推算资源创建经过时间 |
ETag | 资源的匹配信息 |
Location | 令科幻端重定向至指定URI |
Proxy-Authenticate | 代理服务器对客户端的认证信息 |
Retry-After | 对再次发起请求的时机要求 |
Server | HTTP服务器的安装信息 |
Vary | 代理服务器缓存的管理信息 |
WWW-Authenticate | 服务器对客户端的认证信息 |
有关HTTP报文的资料有很多,这里只简单介绍一下,详细信息可以看参考文献5,6和8.
四 HTTP传输
4.1 传输编码
通过在传输时编码,能有效地处理大量的方法请求,提高传输速率。但是,编码的操作需要计算机完成,会消耗一定的CPU计算资源。
内容编码:由服务器进行编码,客户端接收并解码。编码方式有gzip、compress、deflate等。
分块传输编码:在传输大容量数据时,将数据分隔成多块,使Web浏览器逐步显示页面。
4.2 传输多种类型数据
HTML采用了多部分对象集合的方法,在报文中也可含多类型实体,涉及内容首部字段的Content-type。
4.3 获取内容的范围请求
涉及请求首部字段的Range。
参考资料
1. 图解HTTP