什么是http呢? http概念中总是存在模糊的概念,对此并不充分理解。 现在我们将结合系统和计算机的一些网络通信基础来彻底了解HTTP。
定义http://WWW.sina.com/:全名是超文本传输协议(Hypertext transfer protocol ),是用于将超文本从www服务器传输到本地浏览器的传输协议
ww服务器传输协议? 那万维网是什么? 下图是关系图。
可见,万维网是互联网提供的服务之一,互联网上有FTP、E-mail等多种服务。
百度百科对万维网的说明如下。
ww是基于客户端/服务器方式的信息发现技术和超文本技术的集成。 ww服务器使用超文本标记语言(HTML )将信息组织为字符和字符组合的超文本,并使用链接从一个站点跳转到另一个站点。 这完全摆脱了传统搜索工具只能一步一步地沿特定路径搜索信息的限制。 万维网(www )是存储在互联网计算机上的庞大文档的集合。
从这里可以看出,WWW是web文档的集合,提供web服务。
那么什么是TCP呢? 为什么是APP应用层通信协议? 还有其他协议吗? 下图是实现数据通信的分层概念。
可以看到,每个层的TCP/IP协议栈都有不同的角色协议,HTTP位于APP应用层中,位于传输层中的TCP之上。
在客户端和服务端的请求和响应相互传输数据之前,首先进行TCP连接。
HTTP
首次:客户端向服务器端发送syn(syn )同步(表示会话发起请求) ) SEQ=x )消息,客户端状态从closed进入syn_send。 第二次:服务器端接收SYN消息,响应syn(seq=y ) ack (x1 )消息,服务器状态从侦听状态变为syn_received状态。 第三次:客户端从服务器端接收SYN消息,响应一条ack(ack=y1 )消息,客户端进入established状态。 最后,服务器收到一个确认消息段,服务器状态为syn_received到established (连接完成)建立连接的三次握手:
一个由TCP连接的特性决定,一次RT (往返)完成一个TCP动作。 也就是说,一次请求手机的SEQ必须得到一个ACK。
另外,是防止失效的消息制作连接。 由于从因特网链路发送的消息可能被互连的网络设备阻止,因此客户端在经过一段时间后到达服务器并超过了传输时间(RTO ),因此客户端处于syn meme (同步)状态如果只有两次握手,服务器每次收到包含重发SYN消息的SYN消息时,都会创建额外的连接并浪费服务器资源。 如果存在第三次握手,则客户端可以识别与来自服务端的SYN和ACK消息相对应的请求连接是否在客户端生存,如果存在,则发送第三次握手,确认连接的建立。为什么是三次握手呢?而不是两次呢?首次:客户端的APP应用程序通知服务器TCP数据发送完成后,TCP会向服务器发送带有FIN标签的消息段(FIN为英语finish ),客户端状态为een 第二次:服务器收到该FIN段后,并没有立即通过FIN段回复客户机,而是首先向客户机发送确认号ACK,同时通知自己对方请求关闭连接。 (先发送ACK是为了防止dddxz,对方再发送FIN段)。 服务端的状态从established变为close-wait,客户端收到ack消息后,状态从fin-wait-1变为fin-wait-2。 第三次:服务器APP应用程序对TCP说:“我将完全关闭连接。 TCP向客户端发送FIN消息段。 服务端的状态从关闭等待变为最后确认。 第四次:客户端收到此FIN消息段后,向服务器发送一个ACK,指示连接已完全释放。 客户端状态从fin-wait-2更改为time-wait,服务端收到ack消息后关闭直接连接,状态从last-ack更改为closed客户端后最多经过两次消息生存时间
假设为2次,客户端发送fin消息,服务端接收到fin后返回ack消息,客户端接收到ack消息后断开连接。 但是,如果服务器没有关闭,也没有发送完成的消息,则向客户端发送数据消息时,您会发现客户端已断开。 例如,在浏览器中输入地址将建立与服务器的连接,服务器将根据TCP将数据分成多个段发送到客户端。 在所有发送尚未完成之前,客户端会两次挥手断开连接,而服务器尚未发送的段会抛出客户端失去连接的异常。
如果是第三次,则在第二次握手时服务器会确认收到了Fin的回复,并将未发送的数据发送给客户端。 第三次握手时第一次关闭连接并发送FIN。 如果合并了第二次和第三次握手,则如果服务端有未发送的数据,则在所有数据传输完成之前无法实现第三次握手,但这一时间不确定,客户端的退出消息将在很长时间内不再返回
应而进行超时重传,造成了不必要的资源浪费和更意想不到的问题。 HTTP版本HTTP0.9: HTTP协议的最初版本,功能简陋,仅支持请求方式GET,并且仅能请求访问HTML格式的资源。
HTTP1.0
1.增加了请求方式POST和HEAD
2.且支持多种格式资源文件
3.支持cache
4.增加了头信息
注意:每次TCP连接只能发送一个请求,当服务器响应后就会关闭这次连接,下一个请求需要再次建立TCP连接,就是不支持keepalive。
HTTP1.1:
1.新增了请求方式PUT、PATCH、OPTIONS、DELETE等,
2.引入了持久连接,即TCP连接默认不关闭,可以被多个请求复用,Connection:keep-alive;
3.身份认证机制
4.支持文件断点续传
5.新增了24个错误状态响应码
HTTP2.0:
1.增加双工模式,即不仅客户端能够同时发送多个请求,服务端也能同时处理多个请求,解决了队头堵塞的问题
2.头信息压缩机制。HTTP请求和响应中,状态行和请求/响应头都是些信息字段,并没有真正的数据,因此在2.0版本个性的糖豆所有的信息字段建立一张表,为表中的每个字段建立索引,客户端和服务端共同使用这个表,他们之间就以索引号来表示信息字段
3.增加服务器推送的功能,即不经请求服务端主动向客户端发送数据。
到这里我们已经清楚了什么是HTTP。
HTTP有哪些特性? HTTP是无连接的:限制每次连接只处理一个请求。HTTP是媒体独立的:只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。HTTP是无状态的:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。即每一个请求都拥有自己的请求体,期望接收到唯一的对应的响应体,而每一次的请求都相互独立,与上一次或下一次的请求毫无关系。(无连接跟无状态是统一相互理解的) HTTP请求报文和响应 请求报文1.请求行:请求方法 URL 协议版本rn
2.请求头:头部字段名:值rn…(User-Agent/Host/Connection/Cache-Control/Cookie/Accept)
3.空行:rn
4.请求数据
HTTP0.9支持定义GET;
HTTP1.0支持定义三种:GET, POST 和 HEAD
HTTP1.1 支持:GET、POST 、 HEAD、OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT总共九种
1.状态行:协议版本 状态码 状态信息rn
2.响应头:头部字段名:值rn…(Content-Type/Date/Server/Cache-Control/Connection)
3.空行:rn
4.响应数据
HTTPS (Secure Hypertext Transfer Protocol)安全超文本传输协议,是一个安全通信通道,它基于HTTP开发用于在客户计算机和服务器之间交换信息。它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版,是使用TLS/SSL加密的HTTP协议。 HTTP协议采用明文传输信息,存在信息窃听、信息篡改和信息劫持的风险,而协议TLS/SSL具有身份验证、信息加密和完整性校验的功能,可以避免此类问题发生。
TLS/SSL全称安全传输层协议Transport Layer Security, 是介于TCP和HTTP之间的一层安全协议,不影响原有的TCP协议和HTTP协议
TLS/SSL是在传输层上的,它基于TCP与HTTP之间。
HTTPS和HTTP的区别是什么? HTTPS是加密传输协议,HTTP是名文传输协议;HTTPS需要用到SSL证书,而HTTP不用;HTTPS比HTTP更加安全,对搜索引擎更友好,利于SEO;HTTPS标准端口443,HTTP标准端口80;HTTPS基于传输层,HTTP基于应用层;HTTPS在浏览器显示绿色安全锁,HTTP没有显示; TLS/SSL握手过程TSL/SSL的握手过程非常复杂,分初次握手,有session ticket会话缓存握手,重建连接这些情况。这里只说初次验证证书握手,可使用wireshark进行抓包验证加深理解,如下图是我画的基本流程:
所以在TCP三次握手之后,就会进行这个TSL/SSL握手。具体参考这里深入了解。
明白了HTTP以及HTTPS,那我们在浏览器输入URL后的整个流程又是怎么样的呢?
首先我们要清楚什么是URL?是否有印象什么是URI?URI:Uniform Resource Identity统一资源标识符,是一个用于标识某一互联网资源名称的字符串
URL:Uniform Resource Locator统一资源定位符,是因特网的万维网服务程序上用于指定信息位置的表示方法
URL指的是一个网站的入口地址,而这个网站的某个文件访问路径,则是URI。
例如:http://xxx.com是一个URL,http://xxx.com/xxx.jpeg称它为URI。
protocol // hostname[:port] / path / [;parameters][?query]#fragment
protocol协议(例如:http://和https://或者file:///);hostname主机port端口path路径parameters,用于指定特殊参数的可选项query,传递参数,可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开fragment锚点指定我们在浏览器输入URL,这个URL是WWW的统一资源定位标志,就是指网络地址,我们俗称网址。这个URL定位了在互联网上的某个网站。所以我们在浏览器输入某个URL,我们清楚的知道我是想访问这个URL定位的那个网站,这个URL是找到他们的“地址”。 浏览器输入URL后的整个流程
虽然我们知道了URL的地址组成,但我们现实中拿到的URL是一个域名地址,而输入URL域名地址后首先就是DNS域名解析拿到真实IP。
什么是DNS?DNS:英文:Domain Name System,缩写:DNS,域名系统,是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。域名系统(Domain Name System,DNS)是Internet上解决网上机器命名的一种系统。采用了域名系统来管理名字和IP的对应关系。
所以有了这个域名,我们就可以拿到这个网站对应的IP了,也就是它的主机,从而找到目标服务器。
域名是怎么样的?首先域名的语法是:xxx.xxx.xxx,从右到左,以“.”符号隔开分别对应为:三级域名.二级域名.顶级域名。DNS规定,域名中的标号都有英文和数字组成,每一个标号不超过63个字符。
DNS解析过程图示
输入URL后的整个流程如下图所示:
页面解析大致渲染过程:解析DOM生成DOM树->解析css生成CSSOM树->合成render树->计算布局->绘制页面。
其中浏览器有GUI线程、js线程和其他线程,但在一个时间里,只能运行一个线程,也就是说这些线程是互斥的,会有阻塞的情况出现。
其中解析构建DOM树的时候并不会等所有的HTML都解析完再去解析CSS渲染,浏览器为了更快的显示页面,会边构建边渲染,而每次遇到js都会停下GUI渲染,运行JS线程,当遇到js修改DOM或CSS时会引起重绘或重排。直到js执行完毕后继续GUI线程,具体查看这里。所以我们通常会把JS放在最低部,为避免阻塞渲染。
整个流程环环相扣,可以延伸的地方实在太多,一个篇幅肯定无法涵盖。其实在HTTP请求后我们加载的资源,这里又可以引伸出HTTP缓存的知识,而在页面渲染中可以延伸出要如何优化页面的知识,还有网络协议等更底层的计算机知识。
这篇总结有点长,是我对于HTTP知识的疑惑后学习整理出来的,若有错误请大佬指出。