在地址栏输入网址后:html
GET /index.html HTTP1.1
,准备发起网络请求1991年提出,最初的目的只是为了传输体积很小的HTML文件,所以称为超文本传输协议。特色:浏览器
GET /index.html
,没有请求头和请求体1994年出现了拨号上网,同年网景推出了浏览器,万维网进入了高速发展的阶段。为支持多种类型的文件下载HTTP/1.0引入了请求头和响应头。引入了状态码、提供了Cache机制来缓存下载过的资源、加入了用户代理字段。缓存
例如HTTP请求头告诉服务器本身但愿服务器返回的文件类型、压缩方法、文件的编码方式、语种:安全
accept: text/html
accept-encoding: gzip, deflate, br
accept-Charset: ISO-8859-1,utf-8
accept-language: zh-CN,zh
复制代码
服务器返回本身最终选择的方式,如压缩方法、文件类型:bash
content-encoding: br
content-type: text/html; charset=UTF-8
复制代码
HTTP/1.0中每一对请求响应都须要单独的TCP链接,HTTP/1.1增长了持久链接,在一个TCP链接上进行屡次请求和响应。服务器
默认是Connection: keep-alive
,即开启,设置Connection: close
手动关闭。cookie
配合Keep-Alive: timeout=5, max=1000
来设定链接时长。其中timeout指定一个空闲链接须要保持打开状态而最小时长(单位:秒)。max指定这次链接的最大请求数。网络
目前浏览器对于同一域名容许最多同时创建6个TCP持久链接。并发
管线化指将多个HTTP请求批量提交给服务器,服务器依然根据请求顺序来回复浏览器的请求。因为种种缘由,这个技术的尝试失败了。post
HTTP/1.0中一个IP地址只能绑定一个域名,所以服务器只能支持一个域名。随着虚拟主机技术的发展,须要实现一台物理主机上绑定多个各自拥有域名的虚拟主机。HTTP/1.1在请求头中增长了Host字段,用来表示当前域名,供服务器区分。
HTTP/1.0中须要在响应头中设置完整的数据大小如Content-Length: 901
,以便浏览器根据数据大小准确接收数据。但对于动态生成的内容,传输前不知道最终大小,致使浏览器没法正确接收全部数据。
HTTP/1.1引入了Chunk transfer机制,服务器将数据分割成若干大小的数据块,每一个数据块发送时都会附上数据块的长度,最后使用一个零长度的块来结束。这样就能够支持动态内容了。
用户登陆时,服务器验证用户登陆信息正确后,会生成一段表示用户身份的字符串,并写入响应头Set-Cookie字段里,而后发送给浏览器,如Set-Cookie: UID=3431uad;
。
浏览器将Set-Cookie字段中的值保存到本地,当用户再次访问服务器时,浏览器会读取以前保存的Cookie数据并写入请求头的Cookie字段中,如Cookie: UID=3431uad;
。
服务器根据Cookie字段中的值查找该用户的信息,判断是否已登陆,而后生成包含该用户信息的页面数据,返回给浏览器。
HttpOnly:Set-Cookie: id=a3fWa; HttpOnly
。禁止JavaScript经过document.cookie访问cookie,以阻止XSS攻击。
SameSite: Set-Cookie: id=a3fWa; SameSite=Strict
。SameSite有三个值:
TCP通道中,须要等待前面的请求返回后才能进行下一次请求,若是某个请求由于某些缘由没有及时返回,就会阻塞后面的全部请求,这就是队头阻塞的问题。
2015年5月正式发布HTTP/2协议规范,该协议使用多路复用机制,实现一个域名只使用一个TCP长链接,并消除了队头阻塞问题。多路复用技术能充分利用带宽,最大限度规避了TCP慢启动所带来的问题,使得页面资源的传输速度获得了大幅提高。 使用HTTP/2能带来20% ~ 60%的效率提高。
HTTP/2添加了一个二进制分帧层,将通过的请求转换为一个个带有请求ID编号的帧,服务器接收到全部帧以后,将全部相同ID的帧合并为一条完整的请求信息,处理完请求后,将响应也一样用二进制分帧层转换为一个个带有请求ID编号的帧,浏览器接收到响应帧后根据ID编号将数据提交给对应的请求。
浏览器能够随时发送请求,而没必要等待前一个请求接收到响应以后;一样,服务器也能够按需决定优先返回哪些内容,而没必要在乎顺序,由于每份数据都有ID来标识。这样就实现了资源的并行传输。
HTTP/2解决了应用层面的队头阻塞问题,但只要仍是基于TCP,就避免不了TCP的队头阻塞问题。而TCP在设计之初就是为了单连接而设计。
HTTP/3基于UDP协议实现了相似于TCP的多路复用数据流、传输可靠性等功能,这套功能被称为QUIC协议。