本文内容基本来自于《图解HTTP》一书,只是对其中个人相对重要的内容进行记录,以便日后查找。
协议:不同的硬件、操作系统之间的通信所需要的规则被称为协议。
TCP/IP协议族:互联网相关的各类协议族的总称。
TCP/IP按层次分为4层,分别是应用层、传输层、网络层和数据链路层。层次化的好处在于在规划好各层接口后,在改变设计时不需要顾虑整体,只需把变动的层替换掉即可,也使得各层在设计上变得相对简单。
- 应用层:应用层决定了向用户提供应用服务时通信的活动。(HTTP协议位于该层)
- 传输层:传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。(有TCP和UDP两个性质不同的协议)
- 网络层(又名网络互连层):网络层用来处理在网络上流动的数据包 。数据包是网络传输的最小数据单位。网络层所起的作用就是在众多的选项内选择一条传输路线。
-
链路层(又名数据链路层、网络接口层):用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(网卡)及光纤等物理可见部分。
IP(网际协议):位于网络层,用于把各种数据包传送给对方。
传送需要IP地址(节点被分配到的地址)和MAC地址(网卡所属的固定地址),IP地址可变换,MAC地址基本上不会更改。根据ARP协议,根据IP地址查出MAC地址,通过路由中转最终送达。
TCP三次握手:发送端SYN--接收端SYN/ACK--发送端ACK
TCP四次挥手:发送端FIN--接收端ACK--接收端FIN--发送端ACK
DNS:提供通过域名查找IP地址,或逆向从IP地址反查域名的服务。
HTTP协议报文分为请求报文和响应报文两类。而请求报文是由请求方法、请求URI、协议版本、可选的请求首部字段和内容实体构成。响应报文是由协议版本、状态码、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成。
- 报文:是HTTP通信中的基本单位,由8位组字节流组成,通过HTTP通信传输。
-
实体:作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成。
通常,报文主体等于实体主体,只有当传输中进行编码操作时,实体主体的内容发生变化,才导致它和报文主体产生差异。
HTTP协议是无状态协议,自身不对发送过的请求和响应之间的通信状态进行保存。但可以通过在URL带参数查询或通过Cookie技术,可以在请求和响应报文中写入Cookie信息来控制客户端的状态。
Cookie:首次请求时,服务器会生成Cookie信息,并在响应中添加Cookie信息后返回,当再次向同一个服务器发送请求时,客户端会在请求报文中添加之前保存过的Cookie信息。
HTTP/1.1 中可使用的方法:GET、POST、PUT、HEAD、DELETE、OPTIONS、
TRACE、CONNECT。
常用的方法有GET(获取资源)、POST(更新资源)、PUT(传输文件)、HEAD(类似于GET,但不返回报文主题)、DELETE(删除文件)。
在HTTP/1.1中,所有的连接默认都是持久连接。而持久连接使得管线化得以实现,客户端发送请求后无需等待响应即可发送下一个请求。
常用状态码
- 2xx 成功
- 200 请求处理成功
- 204 请求处理成功,但没有资源可返回
- 206 成功执行范围请求
- 3xx 重定向
- 301 资源的资源已被永久分配了新的uri
- 302 和301类似,但是302状态码代表的资源不是被永久移动,只是临时性质的。
-
303 和302类似,但是明确要求客户端改用GET请求
当301、302返回时,几乎所有的浏览器都会把POST改成GET,但标准是禁止将POST改成GET。 - 304 表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况
- 307 类似于302,但会遵照浏览器标准,不会从POST变成GET
- 4xx 客户端错误
- 400 请求报文中存在语法错误
- 401 表示发送的请求需要有通过HTTP认证的认证信息,初次接收到401响应,会弹出认证用的对话窗口。第二次表示用户认证失败
- 403 表示对请求资源的访问被服务器拒绝了(未获得文件系统的访问授权,访问权限出现问题等情况都可能是发生403的原因)
- 404 服务器上无法找到请求的资源,也可以在服务器端拒绝请求且不想说明理由时使用。
- 5xx 服务器本身发生错误
- 500 表示服务器端在执行请求时发生了错误
- 503 表示服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。如果事先知道解除以上状态需要的时间,最好写入RetryAfter首部字段再返回给客户端
HTTP/1.1规范定义了如下47种首部字段
通用首部字段
首部字段名 | 说明 |
---|---|
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客户端程序的信息 |
响应首部字段
首部字段名 | 说明 |
---|---|
Accept-Ranges | 是否接受字节范围请求 |
Age | 推算资源创建经过时间 |
ETag | 资源的匹配信息 |
Location | 令客户端重定向至指定URI |
Proxy-Authenticate | 代理服务器对客户端的认证信息 |
Retry-After | 对再次发起请求的时机要求 |
Server | HTTP服务器的安装信息 |
Vary | 代理服务器缓存的管理信息 |
WWW-Authenticate | 服务器对客户端的认证信息 |
实体首部字段
首部字段名 | 说明 |
---|---|
Allow | 资源可支持的HTTP方法 |
Content-Encoding | 实体主体适用的编码方式 |
Content-Language | 实体主体的自然语言 |
Content-Length | 实体主体的大小(单位:字节) |
Content-Location | 替代对应资源的URI |
Content-MD5 | 实体主体的报文摘要 |
Content-Range | 实体主体的位置范围 |
Content-Type | 实体主体的媒体类型 |
Expires | 实体主体过期的日期时间 |
Last-Modified | 资源的最后修改日期时间 |
通信的加密
-
HTTPS:超文本传输安全协议,用SSL建立安全通信线路后,就可以在这条线路上进行HTTP通信了。而且SSL提供了证书这一途径,可用于确定双方身份。HTTPS采用共享密钥加密和公开密钥加密两者并用的混合加密机制
HTTPS既可防止被窃听,还可以防止被篡改。
- 将参与通信的内容本身加密(报文首部不会被加密,报文主体加密),但仍有被篡改的风险。
加密方式:共享密钥加密和公开密钥加密方式。
共享密钥加密双方共用一个密钥,但密钥的传递过程存在风险。公开密钥分为公钥和私钥,发送方通过公钥加密,接收方通过私钥解密,极难破解。
证书:用以证明服务端公钥的真实性。方式--服务端向双方信赖的第三方数字证书认证机构提出公开密钥的申请。第三方则用自己的私有密钥向服务端的公开密钥署数字签名并颁发公钥证书。客户端拿到公钥证书后,使用第三方的公钥向公钥证书签名,以确认服务器公钥的真实性。
SPDY,Google2010年发布,旨在解决HTTP的性能瓶颈,缩短Web页面的加载时间(50%)。其没有完全改写HTTP协议,而是在TCP/IP的应用层与运输层之间通过新加会话层的形式运作。同时,为了安全性,规定通信中使用SSL。由于以会话层控制数据的流动,且仍是采用HTTP建立通信,因此可照常使用GET和POST等方法、Cookie以及HTTP报文等。
优势:
- 压缩HTTP首部
- 推送功能。服务器可直接发送数据而不必等待客户端的请求。
- 服务器提示功能。服务器可以主动提示客户端请求所需的资源。
至于HTTP2.0就不过多赘述,可以参考HTTP2.0主要改动,写得很详细。