第一章:了解Web及网络基础
1.1简介
为理解HTTP应事先了解一下TCP/IP协议族,我们通常使用的网络(包括互联网)是在TCP/IP协议族的基础上运作,而HTTP属于它内部的一个子集。在互联网上的设备需要相互通信双方就必须要遵从相同的规则,我们把这些规则称为协议。(TCP/IP是对互联网相关的各类协议族的一个总称包括但不限于:PPPoE、HTTP、TCP、IP、UDP、IEEE 802.3…)
在TCP/IP协议族中按照层次从上到下分为:应用层、传输层、网络层、数据链路层
在使用TCP/IP协议族进行通信时,客户端会从应用层往下走,服务端会从链路层往上走。客户端在层与层之间传输数据时,每经过一层时会为其加上该层的段首信息。相反,服务端会一层一层的消去首部。这种把数据信息包装起来的办法叫做封装。
1.2 IP、TCP和DNS
1.2.1 IP协议
IP协议处于网络层,TCP/IP中的IP指的是IP协议,与IP地址并不是一回事。IP协议的作用是把各种数据包发送给对方。各种IP地址可以和MAC地址进行配对。IP地址可变换,但MAC地址基本上不会更改。IP 地址指明了节点被分配到的地址,MAC地址是指网卡所属的固定地址。
1.2.2 MAC地址
IP之间的通信依赖MAC地址。通常会使用ARP协议来根据通信方的IP地址反查出对应的MAC地址
1.2.3 TCP协议
按层次分,TCP 位于传输层,提供字节流服务(Byte Stream Service)——为了方便传输,将大块数据分割成以报文段(segment)为单位的数据包进行管理。一言以蔽之, TCP 协议为了更容易传送大数据才把数据分割,而且 TCP 协议能够确认数据最终是否送达到对方。
为了确认数据是否送达到了对方,TCP采用了三次握手策略。握手过程中使用了TCP的标志(flag)——SYN(synchronize)和 ACK(acknowledgement)。
1.2.4 负责域名解析的DNS服务
计算机既可以被赋予IP地址,也可以被赋予主机名和域名。DNS协议提供通过域名查找IP地址,或逆向从IP地址反查域名的服务。
1.3 URL和URI
1.3.1 区别与关系
与URI(统一资源标识符)相比,我们更熟悉URL(Uniform Resource Locator,统一资源定位符)。URL正是使用Web 浏览器等访问Web 页面时需要输入的网页地址。比如https://www.bilibili.com/就是URL。URI 用字符串标识某一互联网资源,而 URL 表示资源的地点(互联网上所处的位置)。可见URL是URI的子集。URI可被视为定位符(URL),名称(URN)或两者兼备。统一资源名(URN)如同一个人的名称,而统一资源定位符(URL)代表一个人的住址。换言之,URN定义某事物的身份,而URL提供查找该事物的方法。
1.3.2 URI 格式
表示指定的URI,要使用涵盖全部必要信息的绝对URI、绝对URL以及相对URL。
相对URL,是指从浏览器中基本URI处指定的URL,形如 /image/logo.gif。
绝对URI的格式:
登录信息(认证):指定用户名和密码作为从服务器端获取资源时必要的登录信息(身份认证)。此项是可选项。
服务器地址:使用绝对 URI 必须指定待访问的服务器地址。地址可以是类似 hackr.jp 这种 DNS 可解析的名称,或是192.168.1.1 这类 IPv4 地址 名,还可以是 [0:0:0:0:0:0:0:1] 这样用方括号括起来的 IPv6 地址名。
服务器端口号 :指定服务器连接的网络端口号。此项也是可选项,若用户省略则自动使用默认端口号。
带层次的文件路径 :指定服务器上的文件路径来定位特指的资源。这与 UNIX 系统的文件目录结构相似。
查询字符串 :针对已指定的文件路径内的资源,可以使用查询字符串传入任意参数。此项可选。
片段标识符:使用片段标识符通常可标记出已获取资源中的子资源(文档内的某个位置)。但在 RFC 中并没有明确规定其使用方法。该项也为可选项。
第二章:简单的HTTP协议
2.1 HTTP简介
HTTP是一种不保存状态的协议,所谓不保存状态是指HTTP协议自身并不会对每次的请求和响应之间的通信状态进行保存。所以引入了cookie技术来保存通信状态。(注:HTTP这本书出版较早,现在使用保存状态的技术是由cookie、session和token共同实现的)
2.2 常用的HTTP方法
GET:获取资源
GET方法是用来请求URL指定的资源。指定资源经服务器端解析后返回响应内容
POST:传输实体主体
POST用于向服务器传输数据,和获取的数据过大时也会使用POST方法。
GET和POST的区别:
先下结论,GET 和 POST 方法没有实质区别,只是报文格式不同。
请求参数长度限制:GET请求长度最多1024kb,POST对请求数据没有限制
请求参数:GET请求参数是通过URL传递的,多个参数以&连接,POST请求放在request body中。
请求缓存:GET请求会被缓存,而POST请求不会,除非手动设置。
安全性:POST比GET安全,GET请求在浏览器回退时是无害的,而POST会再次请求。
历史记录:GET请求参数会被完整保留在浏览历史记录里,而POST中的参数不会被保留。
编码方式:GET请求只能进行url编码,而POST支持多种编码方式。
对参数的数据类型:GET只接受ASCII字符,而POST没有限制。
此外,HTTP还有PUT、HEAD、DELETE等方法在此不细细展开。
2.3 HTTP的持久连接(三次握手四次挥手)
持久连接的特点是,只要任意一端没 有明确提出断开连接,则保持 TCP 连接状态。
三次握手:建立TCP连接 四次挥手:断开TCP连接
在持久连接中使用管线化技术可以不用等待响应即可直接发送下一个请求。
2.4 使用cookie的状态管理
Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存 Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。
Cookie信息是在服务端产生发送给客户端进行保存的
第三章 HTTP报文信息
3.1 HTTP的请求和响应报文结构
用于HTTP协议交互的信息被称为HTTP报文。请求端(客户端)的HTTP报文叫做请求报文,响应端(服务器端)的叫做响应报文。由8位字节流组成,通过HTTP通信传输。
请求行:包含用于请求的方法,请求 URI 和 HTTP 版本。
状态行:包含表明响应结果的状态码,原因短语和 HTTP 版本。
首部字段:包含表示请求和响应的各种条件和属性的各类首部。一般有4种首部,分别是:通用首部、请求首部、响应首部和实体首部。
其他:可能包含 HTTP 的 RFC 里未定义的首部(Cookie 等)。
3.2 编码传输及分块传输
HTTP在传输数据过程中通过编码提升传输速率。
3.2.1 报文主体和实体主体的差异
实体:作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。
HTTP 报文的主体用于传输请求或响应的实体主体。 通常,报文主体等于实体主体。只有当传输中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体产生差异。
3.2.2 分割发送实体主体
在HTTP通信过程中传输大容量数据时,通过把数据分割成多块能让浏览器逐步显示页面。把实体主体分块的功能称为分块传输编码。分块传输编码会将实体主体分成多个块。每一块都会用 十六进制来标记块的大小,而实体主体的最后一块会使用“0(CR+LF)”来标记。
所谓的块也就是常称的包
第四章 返回结果的HTTP状态码
4.1 状态码的类别
借助状态码用户可以知道服务器是否正常处理了请求,状态码种类繁多但常用的大概只要14种。
4.2 2XX 成功
4.2.1 200 OK
表示从客户端发来的请求在服务器端被正常处理了。在响应报文内,随状态码一起返回的信息会因方法的不同而发生改变。
4.2.2 204 No Content
该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。
4.3 3XX 重定向
重点介绍一下301重定向和302重定向,还有其他状态码可自行查看
4.3.1 301 Moved Permanently
301重定向是永久性的重定向。该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在所指的 URI。例如像下方给出的请求URI,当指定资源路径的最后忘记添加斜杠 “/”,就会产生 301 状态码。
http://excample.com/sample
4.3.2 302 Found
302重定向是临时性的重定向。该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的 URI 访问。和 301 Moved Permanently 状态码相似,但 302 状态码代表的资源不是被永久移动,只是临时性质的。
4.4 4XX 客户端错误
有400 Bad Request、401 Unauthorized、403 Forbidden、404 Not Found。 重点介绍一下404 Not Found
4.4.1 404 Not Found
该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。
4.5 5XX 服务器端错误
5XX 的响应结果表明服务器本身发生错误。
第五章 Web服务器
5.1 通信数据转发程序:代理、网关、隧道
5.1.1 代理
代理服务器的基本行为就是接收客户端发送的请求后转发给其他服务器。代理不改变请求URI,会直接发送给前方持有资源的目标服务器。值得一提的是代理是指对客户端的代理(也称为前向代理),而反向代理是指对服务器的代理。
使用代理服务器可以利用缓存技术减少网络宽带的流量,有时也会为了信息安全而使用代理。
- 缓存代理
代理转发响应时,缓存代理(Caching Proxy)会预先将资源的副本(缓存)保存在代理服务器上。当代理再次接收到对相同资源的请求时,就可以不从源服务器那里获取资源,而是将之前缓存的资源作为响应返回。
- 反向代理
反向代理的优点有很多:
对客户端隐藏服务器(集群)的IP地址
安全:作为应用层防火墙,为网站提供对基于Web的攻击行为(例如DoS/DDoS)的防护,更容易排查恶意软件等
为后端服务器(集群)统一提供加密和SSL加速(如SSL终端代理)
负载均衡,若服务器集群中有负荷较高者,反向代理通过URL重写,根据连线请求从负荷较低者获取与所需相同的资源或备援
对于静态内容及短时间内有大量访问请求的动态内容提供缓存服务
5.1.2 网关
网关的工作机制和代理十分相似。而网关能使通信线路上的服务器 提供非HTTP协议服务。