因为以前太忙了,老是没有时间把本地写好的文章梳理整理后发出去。近期有时间了,才慢慢的整理后发出来(本地写的大多数时候是为了本身能看,哈哈哈)。html
文章首发于 HTTP 入门体检。ios
不管是大系统仍是小项目,不管是移动端仍是PC端,不管是大数据仍是云计算,从总体到我的,网络协议一直都是绕不过去的坎,它在咱们职业生涯中有着举足轻重的地位。技术浪潮一浪接一浪,不少时候咱们盲目追求新技术却忘记了新技术的出现都是要依赖于繁琐复杂且难啃的基层技术,新技术只是为了更好更快更稳的开发,针对业务需求相对进行了封装罢了,一层一层剥下来,它仍是原来的它。咱们先来入门一下 HTTP,OSI模型的应用层。git
网络有七层协议层:应用层、表示层、会话层、(安全层 - SSL/TLS)、传输层、网络层、数据链路层、物理层。因为表示层跟会话层没有独立实现过,而是跟应用层一块儿实现的github
应用层决定了向用户提供应用服务时通讯的活动。(DNS、HTTP、HTTPS、RTMP、FTP);web
传输层对上层应用层,提供处于网络链接中的两台计算机之间的数据传输。(TCP、UDP)。算法
网络层用来处理在网络上流动的数据包。数据包是网络传输额最小单位。(IP)编程
链路层是用来链接网络的硬件部分。包括控制操做系统、驱动、网卡等。浏览器
物理层主要是定义物理设备如何传输数据。缓存
当咱们购物时,会先去 DNS 或 HTTPDNS 查找 IP 地址。知道目标 IP 地址,浏览器就会打包请求,若是使用 HTTPS ,则采起加密传输。安全
一、应用层:浏览器经过 socket 编程,将其打包传输给下一层传输层; 二、传输层:这里采用TCP协议(PS:它有两个端口,一个是浏览器监听端口,一个是服务器监听端口,操做系统每每经过端口来判断数据包应该往哪一个进程走)。TCP将应用层收到的数据包进行~分割~,并在报文上打上标记序号及端口号转发给网络层; 三、网络层:接收到传输层的数据包,在该层有 本地IP地址 以及 目标IP地址,将IP地址封装后转发给链路层; 四、链路层:经过ARP协议,获取本地MAC地址,发送给网关物理层(默认IP:192.168.1.1)。 5:物理层:因为有MAC地址,IP 数据包能达到网关。如路由器,会根据路由表,来判断目标 IP 怎么走。
注
IP 地址:指明了节点被分配到的地址,可变。 MAC 地址:指网卡所属的固定地址,基本不变。 IP 间的通讯依赖 MAC 地址。
ARP 协议:解析地址的协议,根据 IP地址 反查出对应的 MAC地址。
方法 | 描述 |
---|---|
GET | 获取指定资源,通常来讲 GET 请求只用于资源数据的请求。 |
POST | 传输实体主体,向指定资源提交数据,如表单提交、资源建立等。 |
PUT | 传输资源,向指定资源位置上传最新内容,如资源更新等。 |
DELETE | 请求服务器删除置顶的 URI 所标识的资源,简单来讲就是删除资源。 |
PATCH | 跟 PUT 方法有些相似,都是更新资源。可是 PATCH 主要是更新部分资源, 而 PUT 则是总体更新;当资源不存在时,PATCH 会建立新资源,而 PUT只会 在已有的资源进行更新。 |
HEAD | 同 GET 方法,但 HEAD 经常使用于获取报文首部,查看服务器性能。 |
OPTIONS | 该方法同 HEAD,可是 OPTIONS 用来询问服务器返回该资源所支持的方法。 |
状态码大类 | 状态码小类 | 描述 |
---|---|---|
1xx | 信息性状态码,接收到请求而且继续处理。 | |
2xx | 成功状态码。 | |
200 | 服务器已成功处理了请求。 | |
201 | 服务器已接收请求,但还没有处理,客户端能够经过该状态码进行轮询。 | |
203 | 服务器已成功处理了请求,但可能未受权。 | |
204 | 服务器成功处理了请求,但没有返回任何内容,如删除成功。 | |
206 | 服务器成功处理了部分 GET 请求,如媒体多端请求。 | |
3xx | 重定向状态码。 | |
301 | 永久性重定向。 | |
302 | 临时性重定向。 | |
303 | 同302,但多了一个标准,就是明确要求客户端采用 GET 方法。 | |
注:30一、30二、303 响应后,浏览器都会把 POST 改成 GET,并删除请求主体,等到再次请求时才发送。 | ||
304 | 资源没有发生变化,该状态码跟重定向没有什么关系。 | |
4xx | 客户端错误状态码。 | |
400 | 请求错误,服务器不理解请求的语法,简单来讲就是错误的传参致使的报错。 | |
401 | 请求不经过身份验证,如未登陆或令牌错误。 | |
403 | 请求经过身份验证,可是未受权,如权限管理越级访问。 | |
404 | 请求服务器不存在的资源。 | |
405 | 请求方法不经过,如该用 POST 方法的请求用了 PUT。 | |
406 | 请求的资源格式不正确,如请求 JSON 格式数据,服务器只有 XML 格式数据。 | |
409 | 请求发生冲突,常见于修改内容在服务器上是惟一的,如身份证ID。 | |
410 | 请求的资源曾经存在过,以下架的视频。 | |
413 | 请求体超过服务器的限制,如上传资源 10M,服务器限制 5M。 | |
414 | 请求 URI 过长。 | |
415 | 不支持媒体类型,如上传 PNG 文件,而服务器规定 JPG。 | |
5xx | 服务端错误状态码。 | |
500 | 服务器发生错误,但缘由未明。 | |
502 | 网关错误,如请求需转发到B服务器,而B服务器报错时就会报网关错误。 | |
503 | 服务不可用,服务器重启或维护之类不在状态。 | |
504 | 网关超时,同502,只是B服务器久久不回应。 |
q,表示权重值,默认值1.0,区间在0~1。如 Accept-Language:zh-CN,en-US;q=0.8,en;q=0.6
,表示浏览器优先支持 zh-CN 。
通用首部字段指的是请求报文以及响应报文都会使用到的首部。
常见缓存请求指令 | 说明 |
---|---|
no-cache | 强制向服务器再次验证 |
no-store | 不缓存请求或响应的任何内容 |
max-age=(秒) | 响应的最大 Age 值 |
max-stale=[秒] | 接收已过时的响应 |
min-fresh=(秒) | 指望在指定时间内的响应仍有效 |
常见缓存响应指令 | 说明 |
---|---|
public | 可向任意方提供响应的缓存 |
private | 仅向特定用户返回响应 |
no-cache | 缓存前必须先确认其有效性 |
no-store | 不缓存请求或响应的任何内容 |
max-age=(秒) | 响应的最大 Age 值 |
s-maxage=(秒) | 公共缓存服务器响应的最大 Age 值 |
must-revalidate | 可缓存但必须再向源服务器进行确认 |
Connection: Close
:断开时将 Connection 设置为Close;Connection: Keep-Alive
:链接保持持久化;Upgrade: TLS/1.0
Connection: Upgrade (必须指定为Upgrade)
复制代码
text/html
、image/jpeg
;ios-8895-5,utf-8;q=0.8
;gzip,deflate
;zh-cn,zh;q=0.7
;www.baidu.com
;// request body
GET /index.html
If-Range: "123456"
Range: bytes=5001-10000
// response body(匹配状况下)
206 Partial Content
Content-Range: bytes 5001-10000/1000
// response body(不匹配状况下)
200 OK
ETag: "45678"
复制代码
W/
,如:ETag: W/"xxx-1234"
;Retry-After: 120
;Server: Apache/xxxx (Unix)
;实体首部字段是包含在请求报文和响应报文中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息,这里主要列举下响应报文补充字段。
zh-cn
;https://www.baidu.com/
,返回资源 https://www.baidu.com/index.html
;Content-Range: bytes 5001-10000/10000
,单位字节;Accept
;Cache-Control
有指定 max-age
指令时,会优先处理 max-age
;DENY
为拒绝;SAMEORIGIN
:尽在同源域名下匹配时许可;0
为将XSS过滤设置成无效状态,1
则相反;X-Requested-With: XMLHttpRequest
;X-Do-Not-Track
,请求某个网页应用程序中止跟踪某个用户。0
表示 DNT
被禁用,1
则相反;X-Csrf-Token:i8XNjC4b8KVok4uw5RftR38Wgp2BFwql
;在 HTTP 1.1 以前,每一个 HTTP 请求都要求打开一次 TCP 链接,而且使用一次以后就断开这个 TCP 链接,每次这样都会形成资源的浪费。
HTTP/1.1 keep-alive
:只要任意一端没有明确提出断开链接,则保持 TCP 链接状态,即在一次 TCP 链接中能够持续发送多份数据而不会断开链接,这样就能够减小 TCP 链接创建的次数,意味着能够减小 TIME_WAIT 状态链接。可是,长时间的 TCP 链接容易致使系统资源无效占用,因此正确地设置 keep-alive timeout 时间很是重要。
为何须要持久链接?为何 TCP 的创建耗费时间?这里就须要说到 TCP 的三次握手跟四次挥手了。
在客户端和服务器创建 HTTP 请求的发送和返回的过程当中,在这过程当中是须要建立 TCP Connection,由于 HTTP 只有请求和响应这个概念,而 TCP 起到了传输数据包的做用。在 HTTP 1.0 版本,TCP 传输完毕以后就关闭了,而在 HTTP 1.1 版本,则 TCP 上面是能够有多个 HTTP 请求的。
seq(Sequence Number):序列号; ack(Acknowledgement Number):确认序号
SYN=1, seq=X
:客户端发送一个 TCP 的 SYN 标志位为1的包,指明客户端准备链接服务器的端口。而 seq,为初始序列号X,X是随机的,这样为了网络安全。发送完毕以后客户端就进入 SYN_SEND
状态;SYN=1, ACK=1, seq=y, ack=x+1
:服务器返回确认包(SYN=1, ACK=1),同时服务器随机生成 seq 序列号,并将确认序号 ack 设置为客户请求序号加1,即 ack=x+1。完毕以后,服务器进入 SYN_RCVD
状态;ACK=1, ack=y+1, seq=x+1
:客户端收到服务器的数据后,会检查 ack 是否等于 x+1,ACK标志位为1。若是正确则会再次发送确认包(ACK=1),而且把服务器发来的 ack 序号在 seq 的基础上加1,即 ack=y+1
,而后再设置 seq=x+1
。发送完毕后,客户端和服务器都进入了 ESTABLISHED
状态,TCP握手结束。关闭TCP链接,不管是客户端仍是服务器,只要执行 close
操做,就能够发起挥手行为。之因此有4次,是由于 TCP 链接的拆除须要发送4个包。咱们在如下视图默认为客户端向服务器发起 close
操做。其中seq
/ack
同上。
FIN=1, seq=x
:客户端发送 FIN 包,表示客户端已经没有数据能够发送了,可是仍然能够接收数据,这时候客户端进入 FIN+WAIT_1
状态;ACK=1, ack=X+1
:服务器收到客户端的 FIN 包,随后反手就是一个确认包,表示服务器已经收到客户端关闭链接的请求,可是还没作到真正的关闭;FIN=1, seq=y
:服务器准备关闭链接时,再次向客户端发送结束链接的响应。发送完毕以后,服务器进入 LAST_ACK
状态,等待客户端最后的确认包ACK
;ACK=1, ack=y+1
:客户端收到服务器的结束响应,而后客户端就发送最后的确认包 ACK
,服务器收到后就开始关闭链接,进入 CLOSED
状态;客户端等待 **2MSL(MSL(Maximum Segment Lifetime): 报文段最大生存时间)**后,再也没有收到服务器的 ACK
,认为服务器已经正常关闭了,随后客户端也关闭链接,进入CLOSED
状态。不只仅 HTTP,任何未加密的协议都存在如下的不足:
-> HTTP 加密处理 + 认证 + 完整性保护 = HTTPS 在上面提到网络协议层的时候,有一层是安全层,该层就是 SSL协议/TLS协议。HTTP 是直接与TCP通讯,而HTTPS,则演变成了先和 SSL 通讯,再由 SSL 和 TCP 通讯了。
注
SSL 还能够配合其余应用层协议,如SMTP,Telnet;
加密和解密共用一个密钥称为对称加密,而使用公开密钥+私有密钥则为非对称加密。
HTTPS 则采用对称加密和非对称加密二者并用的混合加密机制。由于不管是对称加密仍是非对称加密,都是没法直接保证通讯的安全性,如没法证实公开密钥就是货真价实的。所以须要数字证书认证机构。
注
多数浏览器开发商发布版本会事先植入经常使用认证机关的公开密钥。
Pre-master secret
的随机字符串;Pre-master secret
密钥加密;注
在应用层发送数据时会附加 MAC(Message Authentication Code)的报文摘要来检查报文是否遭到篡改,从而保护报文的完整性。
安全性在网络通讯获得了保证,可是HTTPS也存在HTTPS 处理速度慢(SSL 通讯慢,并且消耗CUP和内存资源)以及证书认证贵 的缺点。
在这里简单的说下,相比之下,HTTP 1.1 和 HTTP 2有什么优化。
注
HTTP 是一种不保存状态,即无状态协议,它不会对请求和响应作持久化处理。所以才会有了Cookie、Session技术的引进。
Session的实现对Cookie有依赖关系,前者是保存在服务器,由于会占用服务器CPU和内存资源,可是相对安全;相反的后者是保存在客户端的,在响应报文内携带Set-Cookie首部字段,告知客户端保存,并且安全性较弱。
有关网络协议知识点太多了,在这里也只是借用巨人的肩膀来简单的理清网络协议的大概思路。每个细节,每个原理真真正正要较真起来,均可以单独写一篇文章,之因此有这篇文章的存在,是由于后续的文章都须要或多或少的网络协议知识,也是为了之后方便本身记忆,不用处处查找资料。这里的知识点可能会有所纰漏错误,也有可能在这里说得不明不白模糊不清,这以后会慢慢优化补上。