HyperText Transfer Protocol
,超文本传输协议,是目前互联网上应用最普遍的一种网络协议,全部的www
文件都必须遵照该标准。而Http
又使用了可靠的数据传输协议TCP
协议,不会产生数据丢失和损坏。html
计算机和网络设备相互通讯,必须知足的一种规则,咱们称之为协议(
protocal
)
IP协议,位于网络层,做用是把各类数据包发送给对方,经过IP地址和MAC地址来保证数据传达。怎么保证呢?IP地址指明了节点被分配的地址,MAC地址是网卡所属的固定地址,彼此可进行配对,IP地址可变,但MAC地址基本不变。
ARP(Address Resolution Protocol)
协议是一种解析地址的协议,可根据IP地址解析出对应的MAC地址。web
TCP协议是如何作到可靠的数据传输的?
首先,TCP位于传输层,为了方便传输,将大块的数据分割成以报文为单位的数据包进行管理,即所谓的字节流服务。算法
三次握手策略(three-way handshaking
)。TCP协议将数据发送出去后,必定会向对方确认数据是否送达,不然会按顺序从新发送相同的数据包。浏览器
字段 | 含义 |
---|---|
URG |
紧急指针是否有效。为1,表示某一位须要被优先处理 |
ACK |
确认号是否有效,通常置为1。 |
PSH |
提示接收端应用程序当即从TCP缓冲区把数据读走。 |
RST |
对方要求从新创建链接,复位。 |
SYN |
请求创建链接,并在其序列号的字段进行序列号的初始值设定。创建链接,设置为1 |
FIN |
但愿断开链接。 |
三次握手流程缓存
四次挥手流程安全
在HTTP1.1中,默认链接是持久链接的(即http keep-alive),特色是只要任意一端没有明确断开链接,则保持TCP链接状态。这样就能够作到同时并行的发送多个请求,而不须要一个个的等待响应。服务器
DNS(Domain Name System)
也位于应用层的协议,它提供域名到IP地址的解析服务。
URL(Uniform Resource Locator)
,网页地址
URI(Uniform Resource Identifier)
,统一资源标识符
Connection:keep-alive
可让TCP链接保持打开,浏览器可继续经过相同的链接发送请求。其实HTTP1.1全部的请求都是默认保持持续链接的cookie
分为请求和响应报文。由多行(CR+LF做为换行符)数据结构构成的字符串文本,大体可分为报文首部和报文主体两部分。网络
# 请求方法 URL 协议/版本 GET /u013870094/article/details/79098628 HTTP/1.1 # 用于指定被请求资源的Internet主机和端口号 Host: blog.csdn.net # 表示是否须要持久链接。 Connection: keep-alive # 防止页面被缓存,只有一个用法, Pragma: no-cache Pragma: no-cache # 这个用来指定Response-Request遵循的缓存机制 # Cache-Control:Public 能够被任何缓存所缓存,多用户间共享 # Cache-Control:Private 内容只缓存到私有缓存中,不能在用户间共享 # Cache-Control:no-cache 全部内容都不会被缓存 # Cache-Control: max-age=x:缓存时间 以秒为单位 Cache-Control: no-cache Upgrade-Insecure-Requests: 1 # 览器的名称和版本等信 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36 # 浏览器能够接受的媒体类型(MIME类型) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3 # 提供了Request的上下文信息的服务器,告诉服务器我是从哪一个连接过来的, Referer: https://blog.csdn.net/u013870094/article/details/79098628 # 浏览器申明本身接收的编码方法,一般指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate) Accept-Encoding: gzip, deflate, br # 浏览器申明本身接收的语言。 Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 Cookie: xxxxx
HTTP/1.1 200 OK Date: Wed, 23 Oct 2019 02:14:16 GMT Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: keep-alive Server: openresty Vary: Accept-Encoding Content-Encoding: gzip Strict-Transport-Security: max-age=86400
先简单介绍下,后续有必要仔细研究下原理。数据结构
Expires,Cache-Control,Last-Modified/Etag
向服务器请求,此时服务器记录第一次请求的Last-Modified/Etag
Expires,Cache-Control,If-Modified-Since/Etag
Last-Modified/Etag
与If-Modified-Since/Etag
判断资源未发生变化,返回304响应队头阻塞是指当顺序发送的请求序列中的一个请求由于某种缘由被阻塞时,在后面排队的全部请求也一并被阻塞,会致使客户端迟迟收不到数据。Chrome默认在同一个域名下,容许同时创建6个TCP持久链接,在当前请求没有结束以前,其余的请求只能处于被阻塞的状态;
解决办法:
Spriting
合并多张小图为一张大图HTTP/2是现行HTTP协议(HTTP/1.x)的替代,但它不是重写,HTTP方法/状态码/语义都与HTTP/1.x同样。HTTP/2基于SPDY,专一于性能,最大的一个目标是在用户和网站间只用一个链接(connection)。
HTTP/2 将请求和响应数据分割为更小的帧,而且它们采用二进制编码。
它把TCP协议的部分特性挪到了应用层,把原来的"Header+Body"的消息"打散"为数个小片的二进制"帧"(Frame),用"HEADERS"帧存放头数据、"DATA"帧存放实体数据。HTP/2数据分帧后"Header+Body"的报文结构就彻底消失了,协议看到的只是一个个的"碎片"。
HTTP/2 中,同域名下全部通讯都在单个链接上完成,该链接能够承载任意数量的双向数据流。每一个数据流都以消息的形式发送,而消息又由一个或多个帧组成。多个帧之间能够乱序发送,根据帧首部的流标识能够从新组装。
采用HPACK
算法压缩头部,压缩率50%-90%;
同时,同一个域名下的两个请求,只会发送差别数据,减小冗余的数据传输,下降开销。
这样作直观的好处是:
指的是服务端能够新建“流”主动向客户端发送消息,提早推送客户端须要的静态资源,减小等待的延迟。
为了兼容,HTTP2也是明文的,只不过格式是二进制的,但HTTP2都是https协议的,跑在TSL上面。
TCP+TLS创建链接的时间是主要瓶颈
没有从根本上解决头阻塞问题,一旦遇到丢包,那么TCP协议仍是会从新发送数据。