HTTP学习笔记
前言
看的书是:图解 HTTP
第1章 了解 Web 及网络基础
1.1 使用 HTTP 协议访问 Web
HTTP 即 超文本传输协议
通过发送请求获取服务器资源的Web浏览器等,都可以称为客户端
Web是建立在HTTP协议上通信的
1.3 网络基础 TCP/IP
通常使用的网络(包括互联网)是在TCP/IP协议族的基础上运作的,而HTTP属于它内部的一个子集
1.3.1 TCP/IP 协议族
计算机与网络设备要相互通信,双方就必须基于相同的方法
不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则,而我们把这种规则称为协议
1.3.2 TCP/IP 的分层管理
TCP/IP 协议族按层次分为以下四层:应用层、传输层、网络层和数据链路层
把TCP/IP层次化是有好处的。比如,如果互联网只由一个协议统筹,某个地方需要改变设计时,就必须把所有部分整体替换掉。而分层之后只需把变动的层替换掉即可。
TCP/IP 协议族各层的作用如下:
应用层
应用层决定了向用户提供应用服务时通信的活动
TCP/IP协议族内预存了各类通用的应用服务。比如,FTP(文件传输协议)和DNS(域名系统)服务就是其中两类
HTTP协议也处于该层
传输层
传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输
在传输层有两个性质不同的协议:TCP(传输控制协议)和UDP(用户数据报协议)
网络层(又名网络互连层)
网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。
与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多的选项内选择一条传输路线
链路层(又名数据链路层,网络接口层)
用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(网络适配器、即网卡),及光纤等物理可见部分(还包括连接器等一切传输媒介)。硬件上的范畴均在链路层的作用范围之内。
1.3.3 TCP/IP 通信传输流

发送端从应用层往下走,接收端从应用层往上

发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息。反正,接收端在层与层传输数据时,每经过一层时会把对应的首部消去
这种把数据信息包装起来的做法称为封装
1.4 与 HTTP 关系密切的协议:IP、TCP 和 DNS
1.4.1 负责传输的 IP 协议
按层次分,IP网际协议位于网络层
IP协议的作用是把各种数据包传送给对方。而要保证确实传送到对方那里,则要满足各类条件。其中两个重要的条件是IP地址和MAC地址
IP地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址。IP地址可以和MAC地址进行配对。IP地址可变换,但MAC地址基本上不会更改
在网络上,通信双方在同一局域网内的情况是很少的,通常是经过多台计算机和网络设备中转才能连接到对方。而在进行中转时,会利用下一站中转设备的MAC地址来搜索下一个中转目标。这时会采用ARP协议。ARP协议是一种用于解析地址的协议,根据通信方的IP地址就可以反查出对应的MAC地址
在到达通信目标前的中转过程中,那些计算机和路由器等网络设备只能获悉很粗略的传输路线,这种机制称为路由选择。无论哪台计算机、哪台网络设备,它们否无法全面掌握互联网中的细节
1.4.2 确保可靠性的 TCP 协议
按层次分,TCP位于传输层,提供可靠的字节流服务
字节流服务是指:为了方便传输,将大块数据分割以报文段为单位的数据包进行管理。
可靠是指:能把数据准确可靠的传给对方,能确认数据最终是否送达到对方
TCP协议采用了三次握手策略。用TCP协议把数据包发送出去后,TCP会向对方确认是否成功送达。握手过程中使用了TCP的标志——SYN和ACK
发送端首先首先发送一个带SYN标志的数据包给对方,接收端收到后,回传一个带有SYN/ACK标志的数据包,代表握手结束,若握手在某个阶段莫名中断,TCP协议会再次以相同的顺序发送相同的数据包

1.5 负责域名解析的 DNS 服务
DNS服务是和HTTP协议一样位于应用层的协议。它提供域名到IP地址间的解析服务
计算机既被赋予IP地址,同时也被赋予主机名和域名,用户通常使用主机名或者域名访问对方计算机,因为这种方式更符合人类记忆习惯;而计算机去理解名称就变得十分困难,计算机更偏向于IP地址访问
DNS协议提供通过域名查找IP地址,或逆向从IP地址反查域名的服务
1.6 各种协议与 HTTP 协议的关系

1.7 URI 和 URL
1.7.1 统一资源标识符
URI就是由某个协议方案表示的资源的定位标识符,协议方案指访问资源所使用的协议类型名称。
采用HTTP协议时,协议方案就是http,除此之外还有ftp,mailto,file等。标准的URI协议方案有30种左右
URI用字符串标识某一互联网资源,而URL表示资源的地点(互联网上所处的位置),可见URL是URI的子集
1.7.2 URI 格式
URI的绝对格式:

第2章 简单的HTTP协议
2.1 HTTP 协议用于客户端和服务器端之间的通信
应用HTTP协议时,必定是一端担任客户端角色,另一端担任服务器角色
2.2 通过请求和相应的交换达成通信
请求必定由客户端发出,而服务端回复响应
HTTP协议规定,请求从客户端发出,最后服务器响应该请求并返回。也就是说,肯定是先从客户端开始建立通信的,服务器端在没有接收到请求之前不会发送响应
请求报文是由请求方法、请求URL、协议版本、可选的请求首部字段和内容实体构成

响应报文基本上由协议版本、状态码(表示成功或失败的数字代码)、用以解释状态码的原因短语、可选的响应首部字段以及试题主体构成

2.3 HTTP 是不保存状态的协议
HTTP协议自身不具备保存之前发送过的请求或响应的功能,这是为了更快的处理大量事物、确保协议的可伸缩性,而特意设计成这样的
为了实现期望的保持状态功能,于是引入了Cookie技术
2.4 请求 URI 定位资源
当客户端请求访问资源而发送请求时,URI需要将作为请求报文中的请求URI包含在内,指定请求 URI的方式有很多

2.5 告知服务器意图的HTTP方法
GET:获取资源
用来请求访问已被URI识别的资源

POST:传输实体主体
用来传输实体的主体
POST的功能与GET很相似,但POST的主要目的并不是获取响应的主体内容

PUT:传输文件
PUT方法用来传输文件。就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置
鉴于HTTP的PUT方法自身不带验证机制,存在安全性问题,因此一般web网站不使用该方法(除非配合Web应用程序的)

HEAD:获得报文首部
HEAD方法和GET方法一样,只是不返回报文主体部分。用于确认URI的有效性及资源更新的日期时间等

DELETE:删除文件
DELETE方法用来删除文件,是与PUT相反的方法,与PUT同理,该方法不带验证机制,所以一般的Web网站也不是用DELETE方法

OPTIONS:询问支持的方法
OPTIONS方法用来查询针对请求URI指定的资源支持的方法

TRACE:追踪路径
TRACE方法是让Web服务器将之前的请求通信环回给客户端的方法
发送请求时,在Max-Forwards首部字段中填入数值,没经过一个服务器就将该数字减1,当数值刚好减到0时,就停止继续传输,最后接受到请求的服务器则返回状态码 200 OK 的响应
客户端通过TRACE方法可以查询发送出去的请求是怎样被加工修改的,但是该方法本来就不怎么常用,再加上它容易引发跨站追踪攻击,就更不会用到了

CONNECT:要求用隧道协议连接代理
CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCPT通信。主要使用 SSL(安全套接层)和 TLS(传输层安全)协议把通信内容加密后经网络隧道传输
CONNECT方法格式如下:
CONNECT 代理服务器名 : 端口号 HTTP版本

2.7 持久连接节省通信量
2.7.1 持久连接
为了解决每进行一次HTTP通信就要断开一次TCP连接而导致的通信量开销,产生了持久连接
持久连接的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态

2.7.2 管线化
持久连接使得多数请求以管线化方式发送成为可能
之前发送请求后需要等待并收到响应,才能发送下一个请求。管线化技术出现后,能做到同时并行发送多个请求

2.8 使用 Cookie 的状态管理
Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端状态
Cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去
服务器端发现客户端发送过来的Cookie后,会去检查究竟是从哪一个客户端发来的请求,然后对比服务器上的记录,最后得到之前的状态信息
第3章 HTTP报文内的HTTP信息
3.1 HTTP报文
HTTP报文大致可分为报文首部和报文主体两块。两者由最初出现的空行来划分。注意,并不一定需要报文主体

3.2 请求报文和响应报文的结构

请求行
包含请求方法,URI和HTTP版本
状态行
包含相应结果的状态码,原因短语和HTTP版本
首部字段
包含请求和响应的各种条件和属性的各类首部
一般有4种首部:通用首部、请求首部、响应首部 和 实体首部
其他
如Cookie等
3.3 编码提升传输速率
编码需要计算机完成,会消耗更多的CPU资源
3.3.1 报文主体和实体主体的差异
报文
HTTP通信的基本单位,由8位组字节流组成,通过HTTP通信传输
实体
作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成
3.3.2 压缩传输的内容编码
常见的内容编码有以下几种:
- gzip (GUN zip)
- compress (UNIX 系统的标准压缩)
- deflate (zlib)
- identity (不进行编码)
3.3.3 分割发送的分块传输编码
在传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示画面
3.5 获取部分内容的范围请求
执行范围请求时,使用首部字段 Range 指定 byte 范围
Range: bytes= xxxx
针对范围请求,会返回状态码为 206 Partial Content 的响应报文
第4章 返回结果的HTTP状态码
4.1 状态码告知从服务器端返回的请求结果

4.2 2XX 成功
4.2.1 200 OK

4.2.2 204 No Content

4.2.3 206 Partial Content

4.3 3XX 重定向
4.3.1 301 Moved Permanently

4.3.2 302 Found

4.3.3 303 See Other

4.3.4 304 Not Modified

4.3.5 307 Temporary Redirect
临时重定向,与302有相同含义,尽管302标准禁止POST变换成GET,但实际使用时大家并不遵守;307会根据浏览器标准,不会从POST变成GET
4XX 客户端错误
4.4.1 400 Bad Requset

4.4.2 401 UNauthorized

4.4.3 403 Forbidden

4.4.4 404 Not Found

4.5 5XX 服务器错误
4.5.1 500 Internal Server Error

4.5.2 503 Service Unavailable

第5章 与HTTP协作的Web服务器
5.1 用单台虚拟主机实现多个域名
提供Web托管服务的供应商,可以用一台服务器为多位客户个服务,也可以以每位客户所持有的域名运行各自不同的网站
在相同的IP地址下,由于虚拟主机可以寄存多个不同主机名和域名的Web网站,因此在发送HTTP请求时,必须在Host首部内完整指定主机名或域名的URI
5.2 通信数据转发程序:代理、网关、隧道
代理
一种有转发功能的应用程序,扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端
网关
转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源分源服务器一样对请求进行处理。有时客户端可能都不会察觉自己通信的目标是一个网关
隧道
在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序
5.2.1 代理


缓存代理
代理转发响应时,会预先将资源的副本(缓存)保存在代理服务器上
当代理再次接受到对相同资源的请求时,将之前缓存的资源作为响应返回
透明代理
转发请求或响应时,不对报文做任何加工的代理类型被称为透明代理,反之则为非透明代理
5.2.2网关

利用网关能提高通信系统的安全性,因为可以在客户端与网关之间的通信线路上加密以确保连接安全
5.2.3 隧道

隧道可按要求建立一条与其他服务器的通信线路,届时使用SSL等加密手段进行通信,保障安全。隧道本身不回去解析HTTP请求
5.3 保存资源的缓存
5.3.1 缓存的有效期限
即使存在缓存,也会因为客户端的要求、缓存的有效期等因素,向源服务器确认资源的有效性。若判断缓存失效,缓存服务器会再次从源服务器上获取“新”资源
5.3.2 客户端的缓存
客户端把缓存称为临时网络文件
浏览器如果缓存有效,就直接从本地磁盘内读取,如果判定缓存过期,后续操作和服务器一致
第6章 HTTP 首部
6.2 HTTP 首部字段
6.2.1 HTTP 首部字段传递重要信息
使用首部字段是未来给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容
6.2.2 HTTP 首部字段结构
首部字段名: 字段值
6.2.3 4种 HTTP 首部字段类型
通用首部字段
请求报文和响应报文两方都会使用的首部
请求首部字段
从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息
响应首部字段
从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息
实体首部字段
针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等于实体有关的信息
6.2.4 HTTP/1.1 首部字段一览





6.2.5 非 HTTP/1.1 首部字段
Cookie、Set-Cookie 和 Content-Disposition 等其他在RFC中定义的首部字段
6.2.6 End-to-End 首部和Hop-by-Hop 首部
端到端首部
分在此类别中的首部会转发给请求/响应对应的最终收集目标,且必须保存在缓存生成的响应中,另外规定它必须被转发
逐跳首部
分在此类别中的首部只对单次转发有效,会因通过缓存或代理而不再转发
以下是 HTTP/1.1 中的逐跳首部字段,除了这8个首部字段外,其他所有字段都属于端到端首部
- Connection
- Keep-Alive
- Proxy-Authenticate
- Proxy-Authorization
- Trailer
- TE
- Transfer-Encoding
- Upgrade
6.3 HTTP/1.1 通用首部字段
6.3.1 Cache-Control

指令一览:



6.3.2 Connection
控制不再转发给代理的首部字段

管理持久连接

6.3.9 Warning


6.4 请求首部字段
6.4.1 Accept

权重值能给媒体类型增加优先级, q 的范围是0~1(可精确到小数点后3位),分号(;)分隔,1为最大值,在不指定权重q时默认值为1=1.0
第7章 确保 web 安全的 HTTPS
7.1 HTTP 的缺点
7.1.1 通信使用明文看你会被窃听
加密处理防止被窃听
通信的加密
可以通过和 SSL(安全套接层) 或 TLS(安全层传输协议) 的组合使用,加密 HTTP 通信内容

内容的加密
客户端对 HTTP 报文进行加密处理后再发送请求,但内容仍有被篡改风险

7.1.2 不验证通信方的身份就可能遭遇伪装
任何人都能发起请求
-
无法确定请求发送至目标的 Web 服务器是否是按照真实意图返回响应的那台服务器。有可能是已伪装的 Web 服务器
-
无法确定响应返回到的客户端是否是按真实意图接收响应的那个客户端。有可能是已伪装的客户端
-
无法确定正在通信的对方是否具备访问权限。某些 Web 服务器上保存着重要的信息,只想发给特定用户通信的权限
-
无法判定请求是来自何方、出自谁手
-
即使是无意义的请求也会照单全收。无法阻止海量请求下的 DoS 攻击
查明对手的证书

7.1.3 无法证明报文的完整性,可能已遭篡改
接收到的内容可能有误


如何防止篡改
常用的是 MD5 和 SHA-1等散列值校验的方法,但是浏览器无法自动帮用户检查,而且依然无法百分百保证结果正确,因此有必要使用 HTTPS

浙公网安备 33010602011771号