你可知道当在浏览器地址栏输入URL("网址”)后,Web网页是如何显示的吗?
其实,当你按下回车后,浏览器(客户端)帮你给服务器发送了请求,服务器收到请求后给出相应的响应,
之后,浏览器再把响应内容进行解析,就显现出一个个丰富多彩的网页,
在这个过程中,Web使用了一种名为HTTP(HyperText Transfer Protocol,超文本传输协议),完成从客户端到服务器端的一系列操作。协议,指的是规则的约定,说白了就是“规矩”。
URL(Universal Resource Locator,统一资源定位符)是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。
其基本格式为:scheme://host[:port]/path/…/[?query-string][#anchor]
- scheme:协议(例如:http, https, ftp)
- host:服务器的IP地址或者域名
- port:服务器的端口(如果是走协议默认端口,缺省端口80)
- path:访问资源的路径
- query-string:参数,发送给http服务器的数据
- anchor:锚(跳转到网页的指定锚点位置)
HTTP报文
用于HTTP协议交互的信息被称为HTTP报文。客户端的HTTP报文叫做请求报文,服务器端的HTTP报文叫做响应报文。其格式分别如下:
- 请求报文
请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1
。
HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。
请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
- User-Agent:产生请求的浏览器类型。
- Accept:客户端可识别的内容类型列表。
- Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机
最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。
- 响应报文
HTTP响应也由三个部分组成,分别是:状态行、消息报头、响应正文。
状态行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。
常见的状态码如下:
- 200 OK:客户端请求成功。
- 400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
- 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
- 403 Forbidden:服务器收到请求,但是拒绝提供服务。
- 404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
- 500 Internal Server Error:服务器发生不可预期的错误。
- 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。
HTTP首部
四种HTTP首部字段类型:
- 通用首部字段(General Header Fields): 请求报文和响应报文两方都会使用的首部;
- 请求首部字段(Request Header Fields): 从客户端向服务器发送请求报文时使用的首部。补充了请求的附加内容,客户端的信息,响应内容相关的优先级等信息。
- 响应首部字段(Response Header Fields): 从服务器向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。
- 实体首部字段(Entity Header Fields): 针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息。
通用首部字段
首部字段名 | 说明 |
---|---|
Cache-Control | 控制缓存的行为 |
Connection | 逐跳首部,连接的管理 |
Date | 创建报文的日期时间 |
Pragna | 报文指令 |
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 | 对请求中的URL的原始获取方法 |
TE | 传输编码的优先级 |
User-Agent | HTTP客户端程序的信息 |
响应首部字段
首部字段名 | 说明 |
---|---|
Accept-Ranges | 是否接受字节范围请求 |
Age | 推算资源创建经过时间 |
ETag | 资源的匹配信息 |
Location | 令客户端重定向至指定的URL |
Proxy-Authenticate | 代理服务器对客户端的认证信息 |
Rety-After | 对再次发起请求的时机要求 |
Server | HTTP服务器的安装信息 |
Vary | 代理服务器缓存的管理信息 |
WWW-Authenticate | 服务器对客户端的认证信息 |
实体首部字段
首部字段名 | 说明 |
---|---|
Allow | 资源科支持的HTTP方法 |
Content-Encoding | 实体主体适用的编码方式 |
Content-Language | 实体主体的自然语言 |
Content-Length | 实体主体的大小(单位:字节) |
Content-Location | 替代对资源的URL |
Content-MD5 | 实体主体的报文摘要 |
Content-Range | 实体主体的位置范围 |
Content-Type | 实体主体的媒体类型 |
Expires | 实体主体过期的日期时间 |
Last-Modified | 资源的最后修改日期时间 |
为Cookie服务的首部字段
首部字段名 | 说明 | 首部类型 |
---|---|---|
Set-Cookie | 开始状态管理所有的Cookie信息 | 响应首部字段 |
Cookie | 服务器接收到的Cookie信息 | 请求首部字段 |
Set—Cookie字段的属性
属性 | 说明 |
---|---|
NAME=VALUE | 赋予Cookie的名称和其值 |
expires=DATE | Cookie的有效期(若不mingque指定则默认为浏览器关闭前为止) |
path=PATH | 将服务器上的文件目录作为Cookie的适用对象(若不指定则默认为文档所在的目录) |
domain=域名 | 作为Cookie适用对象的域名(若不指定则默认为创建Cookie的服务器的域名) |
Scure | 仅在HTTPS安全通信时才会发送Cookie |
HttpOnly | 加以限制,使Cookie不能被JavaScript脚本访问 |
详情请看:
https://zh.wikipedia.org/wiki/HTTP%E5%A4%B4%E5%AD%97%E6%AE%B5
代理、网关、隧道
代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接受服务器返回的响应并转发给客户端。
网关是转发其他服务器通信数据的服务器,接收从客户端所发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。
隧道是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。
HTTPS
HTTP的缺点
- 通信使用明文(不加密),内容可能会被窃听;
- 不验证通信方的身份,因此可能遭遇伪装;
- 无法证明报文的完整性,所以可能已遭篡改。
HTTP + 加密 + 认证 + 完整性保护 = HTTPS
HTTPS并非是应用层的一种新协议。只是普通HTTP通信接口部分用SSL和TLS协议替代而已。
SSL是独立于HTTP的协议,所以不光是HTTP协议,其他运行在应用层的SMTP和Telnet等协议均可配合SSL协议使用。所以说SSL是当今世界上应用最为广泛的网络安全技术。
- 由于HTTPS需要做服务器、客户端双方加密及解密处理,因此会消耗CPU和内存等硬件资源;
- 和HTTP相比,SSL通信部分消耗网络资源。而SSL通信部分,又因为要对通信进行处理,所以时间上有延迟了;
- 和HTTP相比,网络负载和速度上会变慢2~100倍。
为什么不一直使用HTTPS?
- 一个原因与纯文本通信相比,加密通信会消耗更多的CPU及内存资,能够处理的请求数量必定会减少;
- 另一个原因,想要节约购买证书的开销也是原因之一。
因此,如果是非敏感信息则使用HTTP通信,只有在包含个人信息等敏感数据时,才利用HTTPS加密通信。
最后,如果你想了解更多有关内容,推荐阅读《图解HTTP》、《HTTP权威指南》等一些资料。