1 Web及网络基础
1.1 适用Http协议访问Web
在浏览器上输入网址然后访问指定的网页,浏览器就相当于是客户端,访问的网址就是指向特定的服务器。
HTTP协议:HyperText Transfer Protocol,超文本传输协议。
Web是建立在HTTP协议上通信的。
1.2 HTTP的诞生
HTTP/0.9:于1990年问世,1.0之前的版本统称
HTTP/1.0:1996年5月,HTTP正式被作为标准公布,命名为HTTP/1.0,记载于RFC1945,RFC1945 - Hypertext Transfer Protocol -- HTTP/1.0。
HTTP/1.1:1997年1月公布的。最初版本为RFC2068,之后发布的修订版RFC2616就是当前最新版本,RFC2616 - Hypertext Transfer Protocol -- HTTP/1.1。
1.3 网络基础TCP/IP
1.3.1 TCP/IP协议族
1.3.2 TCP/IP的分层管理
TCP/IP协议族按照层次分为四个层次:应用层、传输层、网络层和数据链路层。
- 应用层:决定了向用户提供应用服务时通信的任务,如FTP(File Transfer Protocol,文件传输协议),DNS(Domain Name System,域名系统),HTTP协议。
- 传输层:对上应用层,提供处于网络连接中的两台计算机之间的数据传输,包含两个性质不同的协议TCP(Transmission Control Protocol,传输控制协议)和UDP(User Data Protocol,用户数据报协议)。
- 网络层:又名网络互连层,用来处理在网络上流动的数据包。数据包时网络传输的最小数据单位。该层规定了通过怎样的路径到达对方计算机,并把数据包发送给对方。
- 链路层:又名数据链路层,网络接口层,用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分,还包括连接器等一切传输媒介。硬件的范畴均属于链路层。
1.3.3 TCP/IP通信传输流
利用TCP/IP协议族进行网络通信时,发送端从应用层往下走,接收端则从链路层往上走。
发送端在层与层之间传输数据时,每经过一层就会添加一个该层的首部信息,反之,接收端每经过一层则会把对应的首部信息消去。
这种把数据信息包装起来的做法称为封装(encapsulate)。
1.4 与HTTP密不可分的三个协议IP、DNS、TCP
1.4.1 负责传输的IP协议
IP(Initenet Protocol)网际协议位于网络层。
IP协议的作用是把各种数据包传送给对方。起中有两个关键点IP地址和MAC地址(Media Access Control Address)。
- IP地址指明了节点被分配到的地址。
- MAC地址指网卡所属的固定地址,每张网卡出厂时都有一个MAC地址。
路由选择(routing):数据在互联网中的传输路线。
1.4.2 确保可靠性的TCP协议
TCP协议属于传输层,提供可靠的字节流服务。
字节流服务(Byte Stream Service)指为了传输方便将大块数据分割成以报文段(segment)为单位的数据包进行管理。
TCP协议为了更容易传输大数据把数据分割,而且能够确认数据最终是否送达到对方。
TCP协议采用三次握手(three-way handshaking)策略。
- 发送端首先发送一个带有SYN标志的数据包给对方。
- 接收端收到后回传一个带有SYN/ACK标志的数据包以示接收到。
- 最后发送端再回传一个带有ACK标志的数据包,代表握手结束。
- 握手过程中断后,TCP协议会再次以相同的顺序发送相同的数据包。
TCP协议才有其他手段保证通信可靠性。
1.5 负责域名解析的DNS服务
DNS(Domain Name System)服务是和HTTP一样位于应用层的协议,提供域名到IP地址之间的解析服务。
1.6 各种协议和HTTP协议之间的关系
1.7 URI和URL
1.7.1 URI(统一资源标识符)
URI 是Uniform Resource Identifier的缩写。
URI用字符穿标识某一互联网资源,而URL标识资源的地点,可见URL是URI的子集。
1.7.2 URI格式
- 适用http:或https:等协议方案名获取访问资源是要指定协议类型。不区分字母大小写,最后附一个冒号(:),也可以适用data:或javascript:这类指定数据或脚本的方案名。
- 登陆信息(认证):指定用户名和密码作为从服务器获取资源时的必要登录信息。为可选项。
- 服务器地址:使用绝对URI必须指定待访问的服务器地址。域名,IPv4地址(如192.168.1.1)或IPv6地址(如[0:0:0:0:0:0:0:1])。
- 服务器端口号:网络端口号。
- 带层次的文件路径:指定服务器上文件路径,与UNIX系统的文件目录结构类似。
- 查询字符串:针对已制定的文件路径类的资源,可以使用查询字符串传入任意参数。可选项。
- 片段标识符:用来标记出以获取资源中的子资源(文档内的某个位置)。可选项。
2 简单的HTTP协议
2.1 HTTP协议用于客户端和服务器之间的通信
2.2 通过请求和响应的交换达成通信
请求报文:
响应报文:
2.3 HTTP是不保存状态的协议
HTTP是一种不保存状态,即无状态(stateless)协议。自身不对请求和响应之间的通信状态进行保存。
使用Cookie技术,再用HTTP协议通信,就可以管理状态。
2.4 请求URI定位资源
若不是访问特定资源,而是对服务器本身发起请求,可以使用一个*来代替请求URI。
如下是查询HTTP服务器端支持的HTTP方法种类:
OPTIONS * HTTP/1.1
2.5 告知服务器意图的HTTP方法
2.5.1 GET:获取资源
GET方法用来请求访问已被URI识别的资源。
2.5.2 POST:传输实体主体
POST用来传输实体的主体。
2.5.3 PUT:传输文件
PUT方法用来传输文件。但是由于PUT方法自身不带验证机制,任何人都可以上传文件,存在安全隐患,因此一般网站不适用该方法。
2.5.4 HEAD:获得报文首部
HEAD方法和GET方法一样,只是不返回报文主体部分。
用于确认URI的有效性及资源更新的日期时间等。
2.5.5 DELETE:删除文件
DELETE方法用来删除文件,与PUT相反的方法。同PUT方法,由于不带验证机制,一般不使用该方法。
2.5.6 OPTIONS:询问支持的方法
OPTIONS方法用来查询针对请求URI指定的资源支持的方法。
2.5.7 TRACE:追踪路径
TRACE方法是让Web服务器端将之前的请求通信环回给客户端的方法。是用来确认连接过程中发生的一系列操作,使用它容易引发XST(Cross-Site Tracing,跨站追踪)攻击,一般不使用。
2.5.8 CONNECT:要求使用隧道协议连接代理
CONNECT方法要求在与代理服务器通信时建立隧道,实现使用隧道协议进行TCP通信,主要使用SSL(Secure Sockets Layer,安全套接层)和TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。
格式如下:
CONNECT 代理服务器名:端口号 HTTP版本
2.6 使用方法下达命令
注:方法区分大小写,需要使用大写字母。
2.7 持久连接节省通信量
早起的HTTP协议版本,每次通信都需要断开一次TCP连接,会增加多余的通信量开销。
2.7.1 持久连接
持久连接(HTTP Persistent Connections,也称为HTTP keep-alive或HTTP connection reuse)的方法,用于解决每次都要断开一次的问题。
持久连接只要任意一端没有明确提出断开连接,则保持TCP连接。
2.7.2 管线化
持久连接使得多数请求以管线化(pipelining)方法发送成为可能。
2.8 使用Cookie的状态管理
Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。
没有Cookie信息状态下的请求:
第2次以后(存在Cookie信息状态)的请求:
3 HTTP报文内的HTTP信息
3.1 HTTP报文
用于HTTP协议交互的信息被称为HTTP报文。
请求端(客户端)的HTTP报文叫做请求报文。
响应端(服务器端)的报文叫做响应报文。
HTTP报文本身是由多行(用CR+LF做换行符)数据构成的字符串文本。
HTTP报文大致可以分为报文首部和报文主体两块,通常不一定有报文主体。
3.2 请求报文及响应报文的结构
- 请求行:包含用于请求的方法,请求URI和HTTP版本。
- 状态行:包含表明响应结果的状态码,原因短语和HTTP版本。
- 首部字段:包含表示请求和响应的各种条件和属性的各类首部。
- 一般有四种首部:通用首部、请求首部、响应首部、实体首部。
- 其他:RFC里未定义的首部(Cookie等)。
3.3 编码提升传输速率
传输时编码可以有效地处理大量的访问请求。但是编码的操作需要计算机来完成,因此会消耗更多的CPU资源。
3.3.1 报文主体和实体主体的差异
名称 | 英文 | 基本信息 | 备注 |
---|---|---|---|
报文 | message | HTTP通信中的基本单位,由8位组字节流(octet sequence,其中octet为8个比特)组成,通过HTTP传输 | 通常报文主体等于实体主体,当传输中进行编码操作时,实体主体的内容发生变化两者才会产生差异。 |
实体 | entity | 作为请求和响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。 |
3.3.2 压缩传输的内容编码
常用的内容编码:
- gzip (GNU zip)
- compress (UNIX系统的标准压缩)
- deflate (zlib)
- identity (不进行编码)
3.3.3 分割发送的分块传输编码
分块传输编码(Chunked Transfer Coding):把实体主体分块的功能。
分块传输编码将实体主体分为多个部分(块)。每一块都会用十六进制来标记块的大小。
实体主体的最后一块会使用“0(CR+LF)”来标记。
3.4 发送多种数据的多部份对象集合
多部分对象集合(Multipart):用来容纳多份不同类型的数据。
多部分对象集合包含的对象:
- multipart/form-data:在web表单文件上传时使用。
- multipart/byteranges:状态码206(Partial Content,部分内容)响应报文包含了多个范围的内容时使用。
在HTTP报文中使用多部分对象合集时,需要在首部字段里加上Content-type。
使用boundary字符串来划分多部分对象集合指明的各类实体。在boundary字符串指定的各个实体的起始行之前插入“--”来标记。在多部分对象集合对应的字符串的最后插入“--”标记作为结尾。
3.5 获取部分内容的范围请求
范围请求(Range Request):指定范围发送的请求。
使用首部字段Range来指定资源的byte范围。
针对范围请求,响应会返回状态码为206 Partial Content的响应报文。对于多重范围的范围请求,响应会在首部字段Content-Type表明multipart/byteranges后返回响应报文。
若服务器无法响应范围请求,则会返回状态码200 OK和完整的实体内容。
3.6 内容协商返回最合适的内容
内容协商(Content Negotiation)根据不同的语言等信息返回不同版本资源的机制。
判断基准字段:
- Accept
- Accept-Charset
- Accept-Encoding
- Accept-Language
- Content-Language
内容协商技术的3种类型:
类型 | 说明 |
服务器驱动协商(Server-driven Negotiation) | 由服务器进行内容协商。 以请求的首部字段为参考,在服务器端自动处理。 对用户来说,以浏览器发送的信息作为判断的依据,并不一定能筛选出最优内容。 |
客户端驱动协商(Agent-drven Negotiation) | 由客户端进行内容协商的方式。 用户从浏览器显示的可选列表中手动选择。 可以利用JavaScript脚本在Web页面上自动进行选择。 如按照OS类型或浏览器类型自动切换PC版页面或手机页面。 |
透明协商(Transparent Negotiation) | 服务器驱动和客户端驱动的结合体。 |
4 返回结果的HTTP状态
4.1 状态码返回请求结果
状态码分类:
状态码 | 类别 | 说明 |
---|---|---|
1XX | Informational 信息性状态码 | 正在处理接收的请求 |
2XX | Success 成功状态码 | 清楚正常处理完毕 |
3XX | Redirection 重定向状态码 | 需要进行附加操作以完成请求,将访问重定向到其他地址。 |
4XX | Client Error 客户端错误状态码 | 服务器无法处理请求,如常见的404错误。 |
5XX | Server Error 服务器错误状态码 | 服务器处理请求出错。 |
4.2 2XX成功
表示请求被正常处理了。
状态码 | 内容 | 说明 |
---|---|---|
200 OK | 请求被正常处理了。 如:GET方法返回主体,HEAD方法返回首部,不返回主体。 | |
204 No Content | 请求成功,但返回的相应报文中不含实体的主体部分。如:返回204响应后,浏览器显示的页面不发生更新。 | |
206 Partial Content | 表示客户端进行了范围请求。 响应报文包含Content-Range指定范围的实体内容。 |
4.3 3XX重定向
表示需要执行某些处理,比如需要登陆或者验证等。
4.4 4XX客户端错误
表示客户端发送错误的原因所在。
4.5 5XX服务器错误
表明服务器本身发生错误。
5 与HTTP协作的Web服务器
5.1 单台虚拟主机实现多个域名
虚拟主机(Virtual Host,又称虚拟服务器),使用一台服务器,提供多个服务。
由于虚拟主机具有相同的域名,进行请求时Host首部内要完整指定主机名或域名的URI。
5.2 通信数据转发程序:代理、网关、隧道
5.2.1 代理
作为中间人,直接转发信息,不改变请求URI。
分类:
- 缓存代理(Caching Proxy):预先将特定资源的副本缓存到代理服务器上。
- 透明代理(Transparent Proxy):不对报文做任何加工的代理类型。
- 非透明代理:对报文内容进行加工的代理。
5.2.2 网关
可以转换请求类型。
5.2.3 隧道
通信线路,如SSL、SSH等。
5.3 保存资源的缓存
代理服务器或本地磁盘保存的资源副本。
可节省通信流量和通信时间。
5.3.1 缓存的有效期
缓存需要确认缓存的有效性,若过期了需要及时更新。
5.3.2 客户端的缓存
6 HTTP首部
6.2 HTTP首部字段
首部字段用来给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容。
6.2.1 首部字段结构:
首部字段名:字段值
如:
Content-Type: text/html # 说明对象类型
Keep-Alive:timeout=15,max=100 #单个字段多个值
6.2.2 4种HTTP首部字段类型
类型 | 说明 |
---|---|
通用首部字段 General Header Fields | 请求报文和响应报文两方都会使用的首部。 |
请求首部字段 Request Header Fields | 发送请求报文时使用的首部。 补充请求的附加内容、客户端信息、响应内容相关优先级等。 |
响应首部字段 Response Header Fields | 返回响应报文时使用的首部。 补充响应的附加内容。 |
实体首部字段 Entity Header Fields | 针对请求和响应报文的实体部分使用的首部。 |
6.2.3 HTTP/1.1 首部字段一览表
类型 | 字段名 | 说明 |
---|---|---|
通用首部字段
|
Cache-Control
|
控制缓存的行为
|
Connection
| 逐跳首部、连接的管理 | |
Date
|
创建报文的日期时间
| |
Pragma
|
报文指令
| |
Trailer
|
报文末端的首部一览
| |
Transfer-Encoding
|
指定报文主体的传输编码方式
| |
Upgrade
|
升级为其他协议
| |
Via
|
代理服务器的相关信息
| |
Warning
|
错误通知
| |
请求首部字段
|
Accept
|
用户代理可处理的媒体类型
|
Accept-Charset
|
优先的字符集
| |
Accept-Encoding
|
优先的内容编码
| |
Accept-Language
|
优先的语言(自然语言)
| |
Authorization
|
Web认证信息
| |
Expect
|
期待服务器的特定行为
| |
From
|
用户的电子邮箱地址
| |
Host
|
请求资源所在服务器
| |
If-Match
|
比较实体标记(ETag)
| |
If-Modified-Since
|
比较资源的更新时间
| |
If-None-Match
|
比较实体标记(与 If-Match 相反)
| |
If-Range
|
资源未更新时发送实体 Byte 的范围请求
| |
If-Unmodified-Since
|
比较资源的更新时间(与If-Modified-Since相反)
| |
Max-Forwards
|
最大传输逐跳数
| |
Proxy-Authorization
|
代理服务器要求客户端的认证信息
| |
Range
|
实体的字节范围请求
| |
Referer
|
对请求中 URI 的原始获取方
| |
TE
|
传输编码的优先级
| |
User-Agent
|
HTTP 客户端程序的信息
| |
Cookie | 服务器接收到的Cookie信息 | |
响应首部字段
|
Accept-Ranges
|
是否接受字节范围请求
|
Age
|
推算资源创建经过时间
| |
ETag
|
资源的匹配信息
| |
Location
|
令客户端重定向至指定URI
| |
Proxy-Authenticate
|
代理服务器对客户端的认证信息
| |
Retry-After
|
对再次发起请求的时机要求
| |
Server
|
HTTP服务器的安装信息
| |
Set-Cookie | 开始状态管理所用的Coookie信息 | |
Vary
|
代理服务器缓存的管理信息
| |
WWW-Authenticate
|
服务器对客户端的认证信息
| |
实体首部字段
|
Allow
|
资源可支持的HTTP方法
|
Content-Encoding
|
实体主体适用的编码方式
| |
Content-Language
|
实体主体的自然语言
| |
Content-Length
|
实体主体的大小(单位:字节)
| |
Content-Location
|
替代对应资源的URI
| |
Content-MD5
|
实体主体的报文摘要
| |
Content-Range
|
实体主体的位置范围
| |
Content-Type
|
实体主体的媒体类型
| |
Expires
|
实体主体过期的日期时间
| |
Last-Modified
|
资源的最后修改日期时间
|
7 确保Web安全的HTTPS
HTTPS(HTTP Secure,超文本传输安全协议,或称HTTP over SSL):与SSL组合使用的HTTP。
7.1 HTTP的缺点
- 通信使用明文(不加密),内容可能会被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭篡改
7.2 HTTP+加密+认证+完整性保护 = HTTPS
简言之,所谓 HTTPS,其实就是身披 SSL协议这层外壳的 HTTP。
使用两把密钥的公开密钥加密
证明公开密钥正确性的证书
8 确认访问用户身份的认证
8.1 何为认证
- BASIC 认证(基本认证)
- DIGEST 认证(摘要认证)
- SSL 客户端认证
- FormBase 认证(基于表单认证)
本文为《图解HTTP》的阅读笔记,旨在记录该书本中的一些重要知识点以作复习之用。