在浏览器中输入域名进行网站访问,实质是将域名发送给DNS服务器进行IP地址的解析( 具体解析过程可查看《Netty-网络域解析与协议》章节 ),浏览器拿到IP地址与Web服务器进行通信,通信的协议就是HTTP协议。
WEB服务器收到请求后将后端响应结果返回给浏览器,浏览器将结果进行渲染后进行展示
浏览器访问域名对应解析流程
HTTP:
超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器
Web:
WEB是一种基于超文本和HTTP、全球性动态交互、跨平台的分布式图形信息系统,是建立于 Internet 上的一种网络服务,为浏览者在Internet上查找和浏览信息提供了图形化的、易于访问的直观界面,其中的文档及超级链接将Internet上的信息节点组织成一个互为关联的网状结构
TCP/IP协议:
是一系列与互联网相关联的协议的总称,HTTP协议建立与TCP/IP协议之上,分为四层:应用层、传输层、 网络层、数据链路层
应用层:可以通过系统调用与传输层检通信,例如 FTP、DNS、HTTP
传输层:通过系统调用向应用层提供处于网络连接中的两台计算机之间的数据传输功能,例如 TCP、UDP
网络层:用来处理在网络上流动的数据包,数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(传输路线)到达对方计算机,并把数据包传输给对方
链路层:用来处理连接网络的硬件部分,包括控制操作系统、硬件设备驱动、网络适配器(NIC)以及光纤等物理可见部分。硬件上的范畴均在链路层的作用范围之内。
发送端发送数据时, 数据会从上层传输到下层,且每经过一层都会被打上该层的头部信息。而接收端接收数据时,数据会从下层传输到上层,传输前会把下层的头部信息删除
TCP/IP协议示意图
创建连接(三次握手):
第一次握手:客户端发送带有SYN标志的连接请求报文段,然后进入 SYN SEND 状态,等待服务端的确认
第二次握手:服务端接收到客户端的 SYN 报文段后创建 ACK信息(对客户端SYN报文段进行确认)、SYN请求信息,最终放到同一个报文段(SYN+ ACK报文段)一并发送给客户端,此时服务端将会进入 SYN_RECV 状态
第三次握手:客户端接收到服务端的 SYN+ ACK 报文段后,会向服务端发送ACK确认报文段,这个报文段发送完毕后,客户端和服务端都进入 ESTABLISHED 状态,至此完成TCP三次握手
三次握手步骤
流程解析:
需要使服务端与客户端都确认双发的收发能力处于正常状态
第一次握手:对服务端而言,可确认客户端发送能力与自身接收能力;对客户端而言无法确认任何信息
第二次握手:对客户端而言,可确认服务端接收与发送能力( 接收客户端SYN、发送SYN+ ACK报文 )、自身发送能力与接收能力(SYN发送、服务端ACK接收)
对服务端而言,无法确认自己发送能力与客户端接收能力,因此需要第三次握手
第三次握手:对服务端,可确认自己发送能力与客户端接收能力。双方完成对方与自身收发能力的确认
客户端 | 服务端 | |
---|---|---|
第一次握手 | 无法确认任何信息 | 确认客户端发送能力与自身接收能力 |
第二次握手 | 确认双方收发能力 | 无法确认自己发送能力与客户端接收能力 |
第三次握手 | / | 确认双方收发能力 |
断开连接(四次握手):
流程解析:
第一次挥手:当客户端的数据都传输完成后,客户端向服务端发出包含FIN标志位的连接释放报文(当然数据没发完时也可以发送连接释放报文并停止发送数据),需要注意的是客户端发出FIN后就不能发数据了,但是还可以正常收数据。(客户端告诉服务端我的数据发完了)
第二次挥手:服务端收到客户端发的FIN报文后给客户端回复确认报文,确认报文包含ACK标志位。此时服务端处于关闭等待状态,而不是立马给客户端发FIN报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完。(服务端告诉客户端你的断开请求我收到了)
第三次挥手:服务端将最后的数据发送完毕后向客户端发出连接释放报文,报文包含FIN和ACK标志位,用来关闭服务器端到客户端的数据传送,也就是告诉客户端,我的数据也发送完了,此时服务端处于断开等待状态。(服务端告诉客户端我的数据也发完了)
第四次挥手:客户端收到服务端发的FIN报文后,向服务端发出确认报文,确认报文包含ACK标志位,客户端发出确认报文后不是立马释放TCP连接而是要经过2MSL(最长报文段寿命的2倍时长),服务端一旦收到客户端发出的确认报文就会立马释放TCP连接,所以服务端结束TCP连接的时间要比客户端早一些。
TCP握手协议完整流程示意图
HTTP协议:
特点:
1、支持客户/服务器模式(由客户端向服务器发出请求,服务器端响应请求,并进行对应服务),常用请求方法有 GET、POST、PUT 等
2、允许传输任意类型的数据对象
3、具有无连接特性(每次连接只处理一次请求。收到客户端应答后就断开连接,好处是可以节省传输时间)
4、无状态(对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息必须重传,可能导致每次连接传送的数据量增大)
报文解析:
请求报文详情
响应报文详情
报文头:
通用报文头:
Connection: 值为 keep-alive 的含义为当网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接
参数名称 | 含义 |
---|---|
Cache-Control | 缓存控制 |
Date | 日期 |
Connection | 连接的管理 |
Pramga | 报文指令 |
Trailer | 报文末端的首部一览 |
Via | 代理服务器的相关信息 |
Upgrade | 升级为其他协议 |
Warning | 错误通知 |
请求专用报文:
Accept:例如为 text/html 时代表浏览器可以接受服务器回发的类型为 text/html,也就是常说的html文档,如果服务器无法返回text/html类型的数据,服务器应该返回406错误(Non Acceptable)
如果想要给显示的媒体类型增加优先级,则使用q=来额外表示权重值);重值q的范围是0~1(可精确到小数点后3位),且1为最大值。不指定权重q值时,默认权重为q=1.0。当服务器提供多种内容时,将会首先返回权重值最高的媒体类型。
Accept: text/html,application/xml;q=0.9,image/webp;q=0.8 优先返回顺序 text/html > application/xml > image/webp
Host:用于指定被请求支援的Internet主机和端口号,通常从HTTP URL中提取出来
User-Agent:告诉Http服务器客户端使用的操作系统和浏览器版本名称
参数名称 | 含义 |
---|---|
Accept | 请求方能解析识别的类型 |
Accept-Charset | 优先的内容编码 |
Accept-Enconding | 浏览器声明自己的接收方法 |
Accept-Language | 浏览器声明自己接收的语言 |
Expect | 期待服务器的特定行为 |
Host | 请求资源所在服务器 |
If-Match | 比较实体标记 |
Range | 实体的字节传输范围 |
User-Agent | HTTP客户端程序的信息 |
Max-Forwards | 最大传输逐跳数 |
Referer | 告诉服务器当前请求是哪个页面连接过来的 |
响应报文:
参数名称 | 含义 |
---|---|
Accept-Ranges | 是否接受字节请求范围 |
Age | 推算资源创建经过时间 |
ETag | 资源匹配信息 |
Location | 令客户端重定向到指定URL |
WWW-Authenticate | 服务器对客户端的认证信息 |
实体报文:
参数名称 | 含义 |
---|---|
Allow | 资源可支持的HTTP方法 |
Content-Encoding | 实体主体适用的编码方式 |
Content-Language | 实体主体的自然语言 |
Content-Length | 实体主体的大小(单位:字节) |
Content-Type | 实体主体的媒体类型 |
Last-Modified | 资源的最后修改日期时间 |
请求方式:
GET:用来请求访问已被URL识别的资源,指定的资源经服务器解析后返回响应内容,参数挂在URL上,有长度限制
POST:传输内容的主体,用来提交大批量的表单数据,内容无大小限制
PUT:相较于POST具有幂等性,在HTTP1.1没有验证机制,作用于传输数据,已不常用
HEAD:类似GET,只请求报文头,一般用于测试超链接的可用性
DELETE:在HTTP1.1中和PUT一样没有验证机制,请求服务器删除请求的资源
OPTIONS:查询针对请求URI指定资源支持的方法
TRACE:回显服务器收到的请求,用于测试或诊断,容易引起CST攻击,不常用
CONNECT:开启客户端与请求资源之间双向沟通的通道,可用于创建隧道,HTTP代理服务功能常用
状态码:
表示超文本传输协议响应状态的3位代码
状态码 | 状态英文名称 | 描述 |
---|---|---|
200 | OK | 请求一成功 |
202 | Accepted | 已接受请求但处理未完成 |
206 | Partial Content | 服务器成功处理部分GET请求 |
301 | Moved Permanently | 请求的资源已被永久移动到新URI |
302 | Found | 临时移动,与301类似 |
400 | Bad Request | 客户端请求的语法错误,服务器无法理解 |
401 | Unauthorized | 用户身份无法认证 |
403 | Forbidden | 服务器拒绝执行请求 |
404 | Not Found | 服务器找不到资源 |
500 | Internal Server Error | 服务器内部错误,无法完成请求 |
502 | Bad GateWay | 网管或代理服务器接收到无效请求 |
状态码总结
状态管理:
Cookie:
通俗理解就是门禁卡,实际是一小段的文本信息(sessionid)。 客户端请求服务器,如果服务器需需要记录该用户状态,就向客户端浏览器颁发一个Cookie
客户端浏览器会把Cookie保存起来。 当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态
javascript:alert(document.cookie) 在浏览器地址栏输入查看当前网站cookie
cookies 认证用户流程
Session:
保存在服务器上的记录客户状态的机制,具有唯一性,客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上
客户端浏览器再次访问时仅需从该Session中查询出用户的状态信息即可
当浏览器禁用cookie时可将SessionID挂载在URL上、隐藏表单字段传输来辨认用户身份
有效期:服务端session超时失效、调用session.invalidate()、服务器进程被停止
Session与Cookie流程
区别:
- cookie 在客户端,session在服务端
- session相比cookie,具有更为有效的隐私保护
- 生命周期不同,浏览器页面一关 ,session就消失了,而cookie可以永久保存在本地
编码方式:
ASCII、Unicode、GBK、UTF-8
常见认证方式:
Basic认证(基本认证):
一种较为简单的HTTP认证方式,客户端通过输入明文,浏览器将其转换为Base64编码格式后再传输用户名和密码到服务端进行认证,通常需要配合HTTPS来保证信息传输的安全。
Basic认证例子
Digest认证(摘要认证):
属于Basic认证的升级,无法防止用户伪装操作
SSL客户端认证:
借由HTTPS的客户端证书完成认证的方式。凭借客户端证书认证, 服务器可确认访问是否来自己登录的客户端。需要事先将客户端证书发给客户端,且客户端必须安装此证书
FormBase认证(基于表单认证):
Web应用程序服务各自实现表单验证逻辑
长连接与短连接:
HTTP协议是基于请求/响应模式,只要服务端给了响应,本次HTTP请求就已经结束,因此HTTP长连接与短连接本质上是值TCP的长连接与短连接
短连接:每进行一次HTTP操作就建立一次连接,结束操作连接就中断
长连接:建立连接 > 传输数据(保持连接)> 关闭连接
代理:
普通代理:
HTTP 客户端向代理发送请求报文,代理服务器需要正确地处理请求和连接(例如正确处理 Connection: keep-alive),同时向服务器发送请求,并将收到的响应转发给客户端。
使用 Fiddler等抓包工具、SSR的时候就会使用到代理
网关代理:
HTTP 客户端通过 CONNECT 方法请求隧道代理创建一条到达任意目的服务器和端口的 TCP 连接,并对客户端和服务器之间的后继数据进行盲转发。
Web网关在一侧使用HTTP协议,在一侧使用其他协议
常见网关类型:
1、HTTP/ 服务器端Web网关
2、HTTP/HTTPS 服务器端安全网关
3、HTTPS/HTTP 客户端安全加速器网关
4、资源网关
*web网关示意图
缓存:
缓存的大多是静态资源文件,由响应头 Cache-Control 进行控制
no-store | 所有内容都不缓存 |
---|---|
no-cache | 缓存,当使用缓存前会请求服务器判断缓存资源是否为最新 |
max-age=x | 请求缓存后的X秒不再发起请求 |
s-maxage=x | 代理服务器请求源站缓存后的X秒不再发起请求,只对CDN缓存有效 |
public | 客户端和代理服务器CDN都可以缓存 |
private | 只有客户端可以进行缓存 |
Expires:代表资源过期时间,优先级比 Cache-Control 的 max-age=x 更低
Last-Modified:资源最新修改时间,只能精确到秒,由服务器告诉浏览器
if-Modified-Since:请求头字段,资源最新修改时间,由浏览器告诉服务器,和 Last-Modified 是一对,它两会进行对比
Etag:响应头,资源修改标识,由服务器告诉浏览器,优先级比 Last-Modified
if-None-Match:请求头,缓存资源标识,由浏览器告诉服务器(其实就是上次服务器给的Etag),和 Etag 是一对,它两会进行对比
工作场景:
例如浏览器请求文件资源时,服务端返回 max-age=60 + Last-Modified + Expires + Etag ,浏览器收到响应结果后60秒内不再发起新请求
60秒后假如修改数据,浏览器返回的 if-None-Match 与 if-Modified-Since 将会发生变化,服务端根据 Etag 与 Last-Modified 对比后发现不一致,将文件数据进行更新后再返回新请求结果与 max-age=60 + Last-Modified + Expires + Etag 给浏览器;
60秒后假如不修改数据,浏览器返回的 if-None-Match 与 if-Modified-Since 不发生变化,服务端根据 Etag 与 Last-Modified 对比后发现一致,浏览器将继续使用本地缓存
快捷键刷新缓存的不同
缓存改进方案:
md5/hash缓存:
通过不缓存html,为静态文件添加MD5或者hash标识,解决浏览器无法跳过缓存过期时间主动感知文件变化的问题
CDN缓存:
CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率
内容协商机制:
指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以响应资源的语言,字符集,编码方式等作为判断的基准
例如使用不同区域的网络代理访问Google,首页显示的语言也会不同,原因就是内容协商机制,目前最常用的是服务器驱动协商方式
协商方式 | 含义 | 使用频率 |
---|---|---|
客户端驱动 | 客户端发起请求,服务器发送可选项列表,客户端作出选择后在发送第二次请求 | 弃用 |
服务器驱动 | 服务器检查客户端的请求头部集并决定提供哪个版本的页面 | 常用 |
透明协商 | 某个中间设备(通常是缓存代理)代表客户端进行协商 | 极少用 |
请求首部集:
◆Accept: 告知服务器发送何种媒体类型
◆Accept-Language: 告知服务器发送何种语言,可设置优先级
◆Accept-Charset:告知服务器发送何种字符集
◆Accept-Encoding: 告知服务器采用何种编码
设置返回语言优先级例子:
Accept-Language: en;q=0.5, fr;q=0.0, nl;q= 1.0, tr;q=0.0
断点传输:
HTTP是通过在Header里两个参数实现的,客户端发请求时对应的是Range,服务器端响应时对应的是Content- Range
Range:用于请求头中,指定第一个字节的位置和最后-个字节的位置
Range:(unit=first byte pos)-[last byte pos] Range的通用格式
格式案例:
Range: bytes=0-499 | 代表第0~499字节范围内 |
---|---|
Range: bytes=-500 | 代表最后500个字节的内容 |
Range: bytes= 500- | 代表从第500个字节开始到文件结束的内容 |
Range: bytes= 500-600,601-999 | 代表既从500~600 + 601~999 字节的两块内容 |
Content-Range:用于响应头中,在发出带Range的请求后,服务器会在Content-Range头部返回当前接受的范围和文件总大小。在响应完成后,返回的响应头内容也不同:HTTP/1.1 200 Ok (不使用断点续传方式) 或 HTTP/1.1 206 Partial Content (使用断点续传方式)
Content-Range: bytes (unit first byte pos) - [last bytepos]/[entity legth] Content-Range的一般格式
断点传输过程:
1、客户端下载一个1024K的文件,已经下载了其中512K。
2、网络中断,客户端请求续传,因此需要在HTTP头中申明本次需要续传的片段 Range:bytes= 512000-
这个头通知服务端从文件的512K位置开始传输文件。
3、服务端收到断点续传请求,从文件的512K位置开始传输,并且在HTTP头中增加 Content- Range:bytes 512000-/1024000,此时服务端返回的HTTP状态码为206
多线程下载原理就是将文件先切割成线程数的字节文件,每个下载线程的Range对应各个字节文件的范围,最终进行合并并校验MD5确保文件完整性
瓶颈:
1、一个连接只能发送一个请求
2、请求只能从客户端开始,客户端不接受除响应一外的指令
3、请求/响应头部未压缩就发送
4、每次互相发送相同的头部造成的浪费较多
5、非强制压缩发送
SPDY:
是对HTTP协议的增强,功能包括数据流的多路复用、请求优先级以及HTTP报头压缩、强制使用SSL协议,目前被整合到HTTP2.0
HTTP2.0:
新增二进制分帧与首部压缩(HTTP1.X每次请求时都会将请求头信息进行完整发送,2.0时通讯双方将会缓存一份首部表用来保存请求头信息,每次请求只发送与首部表不相同的请求头信息)
支持多路复用(单连接多资源请求共用一个TCP连接,例如访问网页时,加载网页数据和静态文件使用同一个TCP连接)
支持并行双向字节流请求和响应,性能相比HTTP1得到巨大提升(客户端和服务器把http消息分解成互不依赖的帧进行乱序发送,在另一端进行组装),优点:
◆并行交错地发送请求,请求之间互不影响
◆并行交错地发送响应,响应之间互不干扰
◆只使用一个连接即可并行发送多个请求和响应
◆消除不必要的延迟,减少页面加载的时间
支持请求优先级(高优先级的流都会优先发送,页面静态资源、图片文件可以根据优先级进行发送)
二进制分帧示意图
首部压缩示意图
并行双向字节流请求和响应
HTTP3.0:
2.0的多路复用在丢包情况下性能表现不如HTTP1.1,将会造成队头阻塞;3.0基于QUIC协议进行构建,解决了http2.0的缺点
HTTPS协议:
相当于 HTTP + TLS (前身是SSL协议)协议的混合,相较于HTTP协议层级多出SSL
客户端与服务端通信时的消息将会进行非对称加密,通过CA证书确保信息安全
HTTPS加密流程
对性能影响:
1、协议交互将增加网络RTT,相较于HTTP的三次握手协议流程更为繁琐,最多会耗费7个RTT
2、加密解密需要计算耗时