HTTP
了解网络基础
TCP/IP
TCP参考了OSI的七层模型
TCP四层模型
应用层
应用层决定了像用户提供应用服务是通信的活动
TCP/IP协议族内预存了各类通用的应用服务,比如,FTP(File Transfer Protocol,文件传输协议)和DNS(Domain Name System,域名系统)服务就是其中两类
HTTP
,DNS
,FTP
协议也处于该层
传输层
传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输
在传输层有两个性质不同的协议:TCP
(Transmission Control Protocol,传输控制协议)和UDP
(Usesr Data Protocol,用户数据报协议)
TCP
会三次握手来建立可靠的连接
UDP
速度快效率高,但是不可靠(只管发,不管是否接收到)
网络层
IP
链路层
各种物理通信网络接口
TCP三次握手
TCP四次挥手
DNS
DNS
(Domain Name System):域名解析系统
计算机既可以被赋予IP地址,也可以被赋予主机名和域名,比如www.baidu.com
用户通常使用主机名或域名来访问对方计算机,而不是直接通过IP地址访问,因为与IP地址的一组纯数字相比,用字母配合数字的表示形式来指定计算机名更符合人类的记忆习惯
但是让计算机去理解名称,相对而言就变得困难了。因为计算机更擅长处理一长串数字
为了解决上述问题。DNS服务应运而生,DNS协议提供通过域名查找IP地址,或逆向从IP地址反查域名服务
DHCP
DHCP
(动态主机配置协议)是一个局域网的网络协议。指的是由服务器控制一段lP地址范围,客户机登录服务器时就可以自动获得服务器分配的lP地址和子网掩码。
当输入了一个网址发生什么
首先先查找本地的host文件,找到域名对应的IP,如果没有的话,则去对应的DNS,把他解析成IP地址
URI和URL
与URI(统一资源标识符)相比,我们更熟悉URL(Uniform Resource Loator,统一资源定位符).URL整数使用Web浏览器等访问Web页面时需要输入的网页地址
简单的HTTP协议
HTTP协议用于客户端和服务器端之间的通信
应用HTTP协议时,必定是一端担任客户端角色,另一端担任服务器角色
在两台计算机之间使用HTTP协议通信时,在一条通信线路上必定又一端是客户端,另一端是服务器端
HTTP是不保存状态协议
HTTP是一种不保存状态,即无状态,即无状态(stateless)协议.HTTP协议自身不对请求和响应之间的通信状态进行保存.也就是说在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理
告知服务器意图的HTTP方法
GET
GET:获取资源
GET方法用来请求访问已被URI识别的资源,指定的资源服务器端解析后返回响应内容
POST
POST:传输实体主题
POST方法用来传输实体的主体
虽然用GET方法也可以传输实体的主体,但一般不用GET方法进行传输,而是POST方法。虽说POST的功能与GET很相似,但POST的主要目的并不是获取响应的主题内容
PUT
PUT:传输文件
PUT方法用来传输文件,就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存到请求URI指定的位置
但是鉴于HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传问价,存在安全性问题,因此一般的Web网站不适用该方法。若配合Web应用程序的验证机制,或架构设计采用
HEAD
HEAD:获得报文首部
HEAD方法和GET方法一样,只是不返回报文主体部分。用于确认URI的有效性及资源更新的日期时间等
DELETE
DELETE:删除文件
DELETE方法用来删除文件,是与PUT相反的方法。DELETE方法按请求URI删除指定的资源
OPTIONS
OPTIONS:询问支持的方法
OPTIONS方法用来查询针对请求URI指定的资源支持的方法
持久连接节省通信量
HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接
以当年的通信情况来说,因为都是些容量很小的文本传输,所以即使这样也没有多大问题。可随着HTTP的普及,文档中包含大量图片的情况多了起来
持久连接
为了解决上述TCP连接的问题,HTTP/1.1和一部分的HTTP/1.0想出了持久连接(HTTP Persistent Connections),也称为HTTP keep-alive或HTTP connection reuse的方法。持久连接的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态
使用Cookie的状态管理
HTTP是无状态协议,它不对之前发生过的请求和响应的状态进行管理。也就是说,无法根据之前的状态进行本次的请求处理
假设要求登录认证的Web页面本身无法进行状态管理(不记录已登录的状态),那么每次跳转新页面 不是要再次登录,就是要在每次请求报文中附加参数来管理登录状态
不可否认,无状态协议当然也有它的优点,由于不必保存状态,自然可减少服务器的CPU及内存资源的消耗,从另一侧面来说,也正是因为HTTP协议本身是非常简单的,所以才会被应用在各种场景里
保留无状态协议这个特征的同时又要解决类似的矛盾问题,于是引入了Cookie技术。Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端状态
Cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动再请求报文中加入Cookie值后发送出去
服务器端发现客户端发送过来的Cookie后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息
HTTP报文内的HTTP信息
HTTP报文
用于HTTP协议交互的信息被称为报文
HTTP报文大致可分为报文首部和报文主体两块,通常并不一定要有报文主体
报文首部:服务器或客户端需处理的请求响应的内容即属性
报文主体:应被发送的数据
请求报文及响应报文的结构
请求报文
- 请求行:包含用于请求的方法,请求URI和HTTP版本
- 请求首部字段
- 通用首部字段
- 实体首部字段
- 其他
响应报文
- 状态行:包含表明响应结果的状态码,原因短语和HTTP版本
- 响应首部字段
- 通用首部字段
- 实体首部字段
- 其他
首部字段:包含表示请求和响应的各种条件和属性的各类首部
编码提升传输速率
- 报文(message)
是HTTP通信的基本单位,由8位字节流(otet sequence,其中octet为8个比特)组成,通过HTTP通信传输
实体(entity)
作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成
分割发送的分块传输编码
在HTTP通信过程中,请求的编码实体资源尚未全部传输完成之前,浏览器无法显示请求页面。早传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面
这种把实体主体分块的功能称为分块传输编码(Chunked Transfer Coding)
HTTP 的状态码
HTTP状态码负责表示客户端HTTP请求返回的结果,标记服务器端的处理是否正常,通知出现的错误等工作
类别 | 原因短语 | |
---|---|---|
1XX | Informational(信息性状态码) | 接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
HTTP状态码多达60多种,但是常用的就14种
2XX成功
200:表示从客户端发来的请求在服务器端被正常处理了
204:该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。另外,也不允许返回任何实体的主体。比如从浏览器发出请求处理后,返回204响应。那么浏览器显示的页面不发生更新。一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用
206:该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求
3XX重定向
301:永久性重定向。该状态码表示请求的资源已被分配了新的 URI,以后 应使用资源现在所指的 URI。也就是说,如果已经把资源对应的 URI 保存为书签了,这时应该按 Location 首部字段提示的 URI 重新保存。
302: 临时性重定向。该状态码表示请求的资源已被分配了新的 URI,希望 用户(本次)能使用新的 URI 访问。
303:303 状态码和 302 Found 状态码有着相同的功能,但 303 状态码明确 表示客户端应当采用 GET 方法获取资源。303只能用GET方法来请求
304: 该状态码表示客户端发送附带条件的请求时,服务器端允许请求访 问资源,但未满足条件的情况。304 状态码返回时,不包含任何响应 的主体部分。304 虽然被划分在 3XX 类别中,但是和重定向没有关 系。
307: 临时重定向
4XX客户端错误
- 400:该状态码表示请求报文中存在语法错误。当错误发生时,需修改请求 的内容后再次发送请求
- 401:该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、 DIGEST 认证)的认证信息。另外若之前已进行过 1 次请求,则表示 用 户认证失败
- 403:该状态码表明对请求资源的访问被服务器拒绝了。服务器端没有必要 给出拒绝的详细理由,但如果想作说明的话,可以在实体的主体部分
- 404:该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服 务器端拒绝请求且不想说明理由时使用。
5XX服务端错误
- 500:该状态码表明服务器端在执行请求时发生了错误。也有可能是 Web 应用存在的 bug 或某些临时的故障。
- 503:该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法 处理请求。如果事先得知解除以上状况需要的时间,最好写入 RetryAfter 首部字段再返回给客户端。
HTTP协作的Web服务器
通信数据转发程序 :代理、网关、隧 道
HTTP 通信时,除客户端和服务器以外,还有一些用于通信数据转发 的应用程序,例如代理、网关和隧道。它们可以配合服务器工作。
这些应用程序和服务器可以将请求转发给通信线路上的下一站服务 器,并且能接收从那台服务器发送的响应再转发给客户端。
- 代理
- 代理是一种有转发功能的应用程序,它扮演了位于服务器和客户 端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时 也接收服务器返回的响应并转发给客户端。
- 网关
- 网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请 求时,它就像自己拥有资源的源服务器一样对请求进行处理。有时客 户端可能都不会察觉,自己的通信目标是一个网关。
- 隧道
- 隧道是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方 通信连接的应用程序。
代理
代理服务器的基本行为就是接收客户端发送的请求后转发给其他服务 器。代理不改变请求 URI,会直接发送给前方持有资源的目标服务 器。
持有资源实体的服务器被称为源服务器。从源服务器返回的响应经过 代理服务器后再传给客户端。
图:每次通过代理服务器转发请求或响应时,会追加写入 Via 首 部信息
在 HTTP 通信过程中,可级联多台代理服务器。请求和响应的转发会 经过数台类似锁链一样连接起来的代理服务器。转发时,需要附加 Via 首部字段以标记出经过的主机信息。
缓存代理
代理转发响应时,缓存代理(Caching Proxy)会预先将资源的副本 (缓存)保存在代理服务器上。
当代理再次接收到对相同资源的请求时,就可以不从源服务器那里获 取资源,而是将之前缓存的资源作为响应返回。
透明代理
转发请求或响应时,不对报文做任何加工的代理类型被称为透明代理 (Transparent Proxy)。反之,对报文内容进行加工的代理被称为非 透明代理。
网关
图:利用网关可以由 HTTP 请求转化为其他协议通信
网关的工作机制和代理十分相似。而网关能使通信线路上的服务器提 供非 HTTP 协议服务。
利用网关能提高通信的安全性,因为可以在客户端与网关之间的通信 线路上加密以确保连接的安全。比如,网关可以连接数据库,使用 SQL 语句查询数据。另外,在 Web 购物网站上进行信用卡结算时, 网关可以和信用卡结算系统联动。