- DNS域名解析
- 发起TCP链接
- 发送HTTP请求
服务器处理请求并返回HTTP报文浏览器解析渲染页面链接结束
域名系统(英文:DomainNameSystem,缩写:DNS)是互联网的一项服务。它做为将域名和IP地址相互映射的一个分布式数据库,可以令人更方便地访问互联网css
- 系统会检查浏览器缓存中有没有这个域名对应的解析过的 IP 地址,若是缓存中有,这个解析过程就将结束。浏览器缓存是受这个域名的失效时间和缓存的空间大小控制的。
- 若是用户的浏览器缓存中没有,浏览器会查找操做系统缓存中即为本地的 Host 文件
- 路由器也可能会有缓存。
- 操做系统将域名发送至本地域名服务器, 本地域名服务器查询本身的 DNS 缓存,查找成功则返回结果,失败则发起一个迭代 DNS 解析请求
一、本地域名服务器 向 根域名服务器,其虽然没有每一个域名的的具体信息,但存储了负责每一个域,如 com、net、org等的解析的顶级域名服务器的地址)发起请求,此处,根域名服务器 返回 com 域的顶级域名服务器的地址;
二、本地域名服务器 向 com 域的顶级域名服务器发起请求,返回 baidu.com 域名服务器地址;
三、本地域名服务器向 baidu.com 域名服务器发起请求,获得 www.baidu.com 的 IP 地址;- 本地域名服务器 将获得的 IP 地址返回给操做系统,同时本身也将 IP 地址缓存起来; 操做系统将 IP 地址返回给浏览器,同时本身也将 IP 地址缓存起来;
- 至此,浏览器已经获得了域名对应的 IP 地址。
- 应用层:决定向用户提供应用服务时通讯的活动。TCP/IP 协议族内预存了各种通用的应用服务。好比:FTP、DNS、HTTP 协议。
- 传输层:传输层对上层应用层,提供处于网络链接中的两台计算机之间的数据传输。在传输层有两个性质不一样的协议,分别是 TCP (Transmission Control Protocol,传输控制协议) 和 UDP (User Data Protocol,用户数据报协议)
- 网络层:网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了经过怎样的路径到达对方计算机,并把数据包传送给对方。与对方计算机经过多台计算机或网络设备进行传输时,网络层所起的做用就是在众多的选项内选择一条传输路线。
- 数据链路层: 在物理层提供比特流服务的基础上,创建相邻结点之间的数据链路,经过差错控制提供数据帧 (Frame)在信道上无差错的传输,并进行各电路上的动做系列。数据的单位称为帧 (frame)
- 物理层:物理层创建在物理通讯介质的基础上,做为系统和通讯介质的接口,用来实现数据链路实体间透明的比特 (bit) 流传输。只有该层为真实物理通讯,其它各层为虚拟通讯。
TCP协议全称是传输控制协议是一种面向链接的、可靠的、基于字节流的传输层通讯协议,由 IETF 的RFC 793定义。TCP 是面向链接的、可靠的流协议。流就是指不间断的数据结构,你能够把它想象成排水管中的水流。html
- 一、第一次握手:客户端发送syn包(Seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
- 二、第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时本身也发送一个SYN包(Seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
- 三、第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
- 握手过程当中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP链接一旦创建,在通讯双方中的任何一方主动关闭链接以前,TCP 链接都将被一直保持下去。
面向链接,是指发送数据以前必须在两端创建链接。创建链接的方法是“三次握手”,这样能创建可靠的链接。创建链接,是为数据的可靠传输打下了基础。git
每条TCP传输链接只能有两个端点,只能进行点对点的数据传输,不支持多播和广播传输方式。github
TCP不像UDP同样那样一个个报文独立地传输,而是在不保留报文边界的状况下以字节流方式进行传输。web
对于可靠传输,判断丢包,误码靠的是TCP的段编号以及确认号。TCP为了保证报文传输的可靠,就给每一个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。而后接收端实体对已成功收到的字节发回一个相应的确认(ACK);若是发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。算法
当网络出现拥塞的时候,TCP可以减少向网络注入数据的速率和数量,缓解拥塞数据库
TCP容许通讯双方的应用程序在任什么时候候都能发送数据,由于TCP链接的两端都设有缓存,用来临时存放双向通讯的数据。固然,TCP能够当即发送一个数据段,也能够缓存一段时间以便一次发送更多的数据段(最大的数据段大小取决于MSS)浏览器
UDP协议全称是用户数据报协议,在网络中它与TCP协议同样用于处理数据包,是一种无链接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送以后,是没法得知其是否安全完整到达的。缓存
首先 UDP 是不须要和 TCP同样在发送数据前进行三次握手创建链接的,想发数据就能够开始发送了。而且也只是数据报文的搬运工,不会对数据报文进行任何拆分和拼接操做。具体来讲就是:安全
- 在发送端,应用层将数据传递给传输层的 UDP 协议,UDP 只会给数据增长一个 UDP 头标识下是 UDP 协议,而后就传递给网络层了
- 在接收端,网络层将数据传递给传输层,UDP 只去除 IP 报文头就传递给应用层,不会任何拼接操做
UDP 不止支持一对一的传输方式,一样支持一对多,多对多,多对一的方式,也就是说 UDP 提供了单播,多播,广播的功能。
发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。所以,应用程序必须选择合适大小的报文
首先不可靠性体如今无链接上,通讯都不须要创建链接,想发就发,这样的状况确定不可靠。 而且收到什么数据就传递什么数据,而且也不会备份数据,发送数据也不会关心对方是否已经正确接收到数据了。 再者网络环境时好时坏,可是 UDP 由于没有拥塞控制,一直会以恒定的速度发送数据。即便网络条件很差,也不会对发送速率进行调整。这样实现的弊端就是在网络条件很差的状况下可能会致使丢包,可是优势也很明显,在某些实时性要求高的场景(好比电话会议)就须要使用 UDP 而不是 TCP。UDP只会把想发的数据报文一股脑的丢给对方,并不在乎数据有无安全完整到达。
UDP 头部包含了如下几个数据:
- 两个十六位的端口号,分别为源端口(可选字段)和目标端口
- 整个数据报文的长度
- 整个数据报文的检验和(IPv4 可选 字段),该字段用于发现头部信息和数据中的错误
QUIC(Quick UDP Internet Connection)是谷歌制定的一种基于UDP的低时延的互联网传输层协议。在2016年11月国际互联网工程任务组(IETF)召开了第一次QUIC工做组会议,受到了业界的普遍关注。这也意味着QUIC开始了它的标准化过程,其最终目的是在web上代替TCP和TLS协议,成为新一代传输层协议
QUIC很好地解决了当今传输层和应用层面临的各类需求,包括处理更多的链接,安全性,和低延迟。QUIC融合了包括TCP,TLS,HTTP/2等协议的特性,但基于UDP传输。QUIC的一个主要目标就是减小链接延迟,当客户端第一次链接服务器时,QUIC只须要1RTT(Round-Trip Time)的延迟就能够创建可靠安全的链接,相对于TCP+TLS的1-3次RTT要更加快捷。以后客户端能够在本地缓存加密的认证信息,在再次与服务器创建链接时能够实现0-RTT的链接创建延迟。QUIC同时复用了HTTP/2协议的多路复用功能(Multiplexing),但因为QUIC基于UDP因此避免了HTTP/2的线头阻塞(Head-of-Line Blocking)问题。由于QUIC基于UDP,运行在用户域而不是系统内核,使得QUIC协议能够快速的更新和部署,从而很好地解决了TCP协议部署及更新的困难
HTTP(超文本传输协议) 是一种用于分布式、协做式和超媒体信息系统的应用层协议。HTTP 是互联网数据通讯的基础。它是由万维网协会(W3C)和互联网工程任务组(IETF)进行协调制定了 HTTP 的标准,最终发布了一系列的 RFC,而且在1999年6月公布的 RFC 2616,定义了 HTTP 协议中现今普遍使用的一个版本——HTTP 1.1。
HTTP 属于 TCP/IP 模型中的应用层协议,当浏览器与服务器进行互相通讯时,须要先创建TCP 链接,以后服务器才会接收浏览器的请求信息,当接收到信息以后,服务器返回相应的信息。最后浏览器接受对服务器的信息应答后,对这些数据进行解释执行(下图http 1.0 请求模式)
HTTP 1.0 时,浏览器每次访问都要单独创建链接,这会形成资源的浪费。
后来HTTP 1.1管线化(pipelining)理论,客户端能够同时发出多个HTTP请求,能够在一次链接中处理多个请求,而且将多个请求重叠进行
HTTP Pipelining实际上是把多个HTTP请求放到一个TCP链接中一一发送,而在发送过程当中不须要等待服务器对前一个请求的响应;只不过,客户端仍是要按照发送请求的顺序来接收响应!
2012年google如一声惊雷提出了SPDY的方案,优化了HTTP1.X的请求延迟,解决了HTTP1.X的安全性。具体以下:
HTTP/2(超文本传输协议第2版,最初命名为HTTP 2.0),是HTTP协议的的第二个主要版本,使用于万维网。HTTP/2是HTTP协议自1999年HTTP 1.1发布后的首个更新,主要基于SPDY协议(是Google开发的基于TCP的应用层协议,用以最小化网络延迟,提高网络速度,优化用户的网络使用体验)
HTTP2.0和SPDY的区别:
- HTTP2.0 支持明文 HTTP 传输,而 SPDY 强制使用 HTTPS
- HTTP2.0 消息头的压缩算法采用 HPACK http2.github.io/http2-spec/… SPDY 采用的 DEFLATE zh.wikipedia.org/wiki/DEFLAT…
- 简单、快速、灵活:当用户想服务器发送请求时,只需传送请求方法和路径便可,HTTP 容许传输任意类型的数据对象。而且HTTP协议简单易用,HTTP 服务器规模小,保证了网络通讯的速度;
- 无链接、无状态:HTTP协议限制每次链接只处理单个请求,当服务器收到用户请求后就会断开链接,保证了传输时间的节省。同时HTTP协议对事务处理没有记忆能力,若是后续的请求须要使用前面的信息就必须重传数据;
- 管线化和内容编码:随着管线化技术的出现,HTTP 请求比持久性链接速度更快,而且当某些报文的内容过大时,为了减小传输的时间,HTTP 会采起压缩文件的方式;
- HTTP 支持客户/服务器模式
HTTP 协议因为其简单快速、占用资源少,一直被用于网站服务器和浏览器之间进行数据传输。可是在数据传输的过程当中也存在很明显的问题,因为 HTTP 是明文协议,不会对数据进行任何方式的加密。当黑客攻击窃取了网站服务器和浏览器之间的传输报文的时,能够直接读取传输的信息,形成网站、用户资料的泄密。所以 HTTP 不适用于敏感信息的传播,这个时候须要引入 HTTPS(超文本传输安全协议)。
HTTPS是一种以计算机网络安全通讯为目的的传输协议。在HTTP下加入了SSL/TLS层,从而具备了保护交换数据隐私和完整性和提供对网站服务器身份认证的功能,简单来讲它就是安全版的 HTTP 。
HTTPS在进行数据传输以前会与网站服务器和Web浏览器进行一次握手,在握手时肯定双方的加密密码信息。具体过程以下:
- 一、Web 浏览器将支持的加密信息发送给网站服务器
- 二、网站服务器会选择出一套加密算法和哈希算法,将验证身份的信息以证书(证书发布CA机构、证书有效期、公钥、证书全部者、签名等)的形式发送给Web浏览器;
- 三、当 Web 浏览器收到证书以后首先须要验证证书的合法性,若是证书受到浏览器信任则在浏览器地址栏会有标志显示,不然就会显示不受信的标识。当证书受信以后,Web 浏览器会随机生成一串密码,并使用证书中的公钥加密。以后就是使用约定好的哈希算法握手消息,并生成随机数对消息进行加密,再将以前生成的信息发送给网站;
- 四、当网站服务器接收到浏览器发送过来的数据后,会使用网站自己的私钥将信息解密肯定密码,而后经过密码解密Web浏览器发送过来的握手信息,并验证哈希是否与Web浏览器一致。而后服务器会使用密码加密新的握手信息,发送给浏览器;
- 五、最后浏览器解密并计算通过哈希算法加密的握手消息,若是与服务发送过来的哈希一致,则此握手过程结束后,服务器与浏览器会使用以前浏览器生成的随机密码和对称加密算法进行加密交换数据。
为了保护数据的安全,HTTPS 运用了非对称加密:加密使用的密钥和解密使用的密钥是不相同的,分别称为:公钥、私钥,公钥和算法都是公开的,私钥是保密的。非对称加密算法性能较低,可是安全性超强,因为其加密特性,非对称加密算法能加密的数据长度也是有限的。
例如:RSA、DSA、ECDSA、 DH、ECDHE 等。
可是当网站传输协议从 HTTP 到 HTTPS 以后,数据传输真的安全了吗?
因为用户习惯,一般准备访问某个网站时,在浏览器中只会输入一个域名,而不会在域名前面加上 http:// 或者 https://,而是由浏览器自动填充,当前全部浏览器默认填充的都是http://。通常状况网站管理员会采用了 301/302 跳转的方式由 HTTP 跳转到 HTTPS,可是这个过程总使用到 HTTP 所以容易发生劫持,受到第三方的攻击。
这个时候就须要用到 HSTS(HTTP 严格安全传输)
HSTS(HTTP Strict-Transport-Security)它是一个Web安全策略机制,由国际互联网工程组织 IETF 正在推行一种新的 Web 安全协议,网站采用 HSTS 后,用户访问时无需手动在地址栏中输入 HTTPS,浏览器会自动采用 HTTPS 访问网站地址,从而保证用户始终访问到网站的加密连接,保护数据传输安全。
HSTS 主要是经过服务器发送响应头的方式来控制浏览器操做:
一、首先在服务器响应头中添加 HSTS 响应头: Strict-Transport-Security: max-age=expireTime [; includeSubDomains] [; preload]
此响应头只有在 https 访问返回时才生效,其中[ ]中的参数表示可选 二、设置 max-age 参数,时间设置不宜过长,建议设置时间为 6 个月;
三、当用户下次使用 HTTP 访问,客户端就会进行内部跳转,而且可以看到 307 Redirect Internel 的响应码;
四、网站服务器变成了 HTTPS 访问源服务器。
开启 HSTS 后网站能够有效防范中间人的攻击,同时也会省去网站 301/302 跳转花费的时间,大大提高安全系数和用户体验。
虽然 HSTS 能够很好的解决 HTTPS 降级攻击,可是对于 HSTS 生效前的首次 HTTP 请求,依然没法避免被劫持。浏览器厂商们为了解决这个问题,提出了 HSTS Preload List 方案。具体作法是在浏览器内置一份能够按期更新的列表,对于列表中的域名,即便用户以前没有访问过,也会使用 HTTPS 协议
若是要想把本身的域名加进这个预载入列表,须要知足如下条件:
- 提供有效的证书。
- 将全部 HTTP 流量重定向到 HTTPS。
- 确保全部子域名都启用了 HTTPS,特别是 www 子域。
- 输出 HSTS 响应头:
一、max-age 至少须要 1 年(31536000 秒)。
二、必须指定 includeSubdomains 参数;
三、必须指定 preload 参数;
四、若是您正在从 HTTPS 站点提供额外的重定向,则该重定向必须仍具备 HSTS 标头(而不是其重定向到的页面)。
发送HTTP请求的过程就是构建HTTP请求报文并经过TCP协议中发送到服务器指定端口 请求报文由请求行,请求头,请求体组成
请求行(Request Line)分为三个部分:请求方法、请求地址和协议及版本,以CRLF(rn)结束。 HTTP/1.1 定义的请求方法有8种:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE,最常的两种GET和POST,若是是RESTful接口的话通常会用到GET、POST、DELETE、PUT。
请求头
HTTP 客户端向代理发送请求报文,代理服务器须要正确地处理请求和链接(例如正确处理 Connection: keep-alive),同时向服务器发送请求,并将收到的响应转发给客户端。
客户端经过代理访问 A 网站,对于 A 来讲,它会把代理当作客户端,彻底察觉不到真正客户端的存在,这实现了隐藏客户端 IP 的目的。固然代理也能够修改 HTTP 请求头部,经过 X-Forwarded-IP 这样的自定义头部告诉服务端真正的客户端 IP。但服务器没法验证这个自定义头部真的是由代理添加,仍是客户端修改了请求头,因此从 HTTP 头部字段获取 IP 时,须要格外当心。
对于客户端来讲,实际上访问的是代理,代理收到请求报文后,再向真正提供服务的服务器发起请求,并将响应转发给浏览器。这种状况通常被称之为反向代理,它能够用来隐藏服务器 IP 及端口。通常使用反向代理后,须要经过修改 DNS 让域名解析到代理服务器 IP,这时浏览器没法察觉到真正服务器的存在,固然也就不须要修改配置了。反向代理是 Web 系统最为常见的一种部署方式。
HTTP 客户端经过 CONNECT 方法请求隧道代理建立一条到达任意目的服务器和端口的 TCP 链接,并对客户端和服务器之间的后继数据进行盲转发。
客户端经过代理访问 A 网站,浏览器首先经过 CONNECT 请求,让代理建立一条到 A 网站的 TCP 链接;一旦 TCP 链接建好,代理无脑转发后续流量便可。因此这种代理,理论上适用于任意基于 TCP 的应用层协议,HTTPS 网站使用的 TLS 协议固然也能够。这也是这种代理为何被称为隧道的缘由。对于 HTTPS 来讲,客户端透过代理直接跟服务端进行 TLS 握手协商密钥,因此依然是安全的
强缓存
用户发送的请求,直接从客户端缓存中获取,不发送请求到服务器,不与服务器发生交互行为。
协商缓存
用户发送的请求,发送到服务器后,由服务器断定是否从缓存中获取资源。
二者共同点:客户端得到的数据最后都是从客户端缓存中得到。
二者的区别:从名字就能够看出,强缓存不与服务器交互,而协商缓存则须要与服务器交互。