web服务相关概念
从浏览器输入链接到显示网页中间过程
URL解析
- 输入网址:你在浏览器地址栏输入一个URL(统一资源定位符),如 https://www.example.com
- 解析URL:浏览器解析URL以确定你想访问的资源。URL通常包括协议(如HTTP或HTTPS)、服务器地址和资源路径
域名解析(DNS查找)
- DNS解析 hosts文件->系统缓存->向DNS服务器查询(递归查询和迭代查询)
- 获取IP地址:DNS服务器将域名映射到IP地址并返回给浏览器
建立连接
- TCP连接 浏览器使用解析得到的IP地址尝试通过TCP(传输控制协议)建立连接。如果是HTTPS网站,还需要建立一个安全连接,即TLS(传输层安全协议)握手
- TLS握手:在TCP连接建立后,进行TLS握手,这包括加密算法的协商、服务器证书的验证(证书中包含了公钥)以及密钥的生成和交换
发送HTTP请求
- 构造HTTP请求:连接建立后,浏览器构造一个HTTP请求消息,包括请求行(如 GET / HTTP/1.1)、请求头部和请求体
- 发送请求:浏览器将这个HTTP请求通过已建立的TCP连接发送到服务器
服务器处理请求并返回响应
- 服务器接收请求:服务器接收到请求并根据路径和参数处理请求
- 服务器响应:服务器处理完请求后,会构造一个HTTP响应消息,包括状态码(如200 OK)、响应头部和响应体(通常是HTML内容)
浏览器处理响应
- 接收响应:浏览器接收到HTTP响应并开始解析响应体(HTML文档)
- 解析HTML:浏览器解析HTML内容,构建DOM(文档对象模型)树
- 请求资源:HTML文档中可能包含CSS、JavaScript、图片等资源的链接,浏览器将对这些资源发出新的HTTP请求
- 渲染页面:CSS被解析成CSSOM(CSS对象模型),与DOM树合并成渲染树,然后浏览器根据渲染树来布局并绘制页面
显示页面
- 用户交互:页面加载完成后,用户可以开始与页面交互。JavaScript可以修改DOM和监听及响应用户事件
网站访问量统计的重要指标
- IP(独立IP):即Internet Protocol,指独立IP数。一天内来自相同客户机IP 地址只计算一次,记录远程客户机IP地址的计算机访问网站的次数,是衡量网站流量的重要指标
- PV(访问量): 即Page View, 页面浏览量或点击量,用户每次刷新即被计算一次,PV反映的是浏览某网站的页面数,PV与来访者的数量成正比,PV并不是页面的来访者数量,而是网站被访问的页面数量
- UV(独立访客):即Unique Visitor,访问网站的一台电脑为一个访客。一天内相同的客户端只被计算一次。可以理解成访问某网站的电脑的数量。网站判断来访电脑的身份是通过cookies实现的。如果更换了IP后但不清除cookies,再访问相同网站,该网站的统计中UV数是不变的
http工作机制
一次http事务包括:
- http请求:http request
- http响应:http response
Web资源:web resource, 一个网页由多个资源(文件)构成,打开一个页面,通常会有多个资源展
示出来,但是每个资源都要单独请求。因此,一个”Web 页面”通常并不是单个资源,而是一组资源的集合
提高HTTP连接性能
- 并行连接:通过多条TCP连接发起并发的HTTP请求
- 持久连接:keep-alive,重用TCP连接,以消除连接和关闭的时延,以事务个数和时间来决定是否关闭连接
- 管道化连接:通过共享TCP连接,发起并发的多个HTTP请求,但需要也要按发起请求的顺序来接收响应,实现难度很大,很多代理服务器和浏览器不支持
- 复用的连接:交替传送请求和响应报文(实验阶段)
http各版本特点
HTTP/0.9
- 发布时间:1991年。
- 基本功能:仅支持GET请求,用于请求HTML类型的文档。
- 响应结构:服务器发送回纯文本的HTML文件,无HTTP头部,连接随即关闭
HTTP/1.0
- 发布时间:1996年,RFC 1945。
- 增加功能:
- 引入了方法如 GET、POST 和 HEAD。
- 支持多种类型的MIME类型,不仅限于HTML。
- 响应和请求都支持头部信息,包括状态码、内容类型等
- 连接方式:非持久连接,默认连接请求完成后立即关闭
HTTP/1.1
- 发布时间:1997年,RFC 2068,后更新为 RFC 2616 (1999年) 和 RFC 7230-7235 (2014年)。
- 主要改进:
- 持久连接:默认开启持久连接(Connection: keep-alive),减少了建立和关闭连接的频繁操作。
- 管道化:支持在同一连接上几乎同时发送多个请求,提高了效率。
- 缓存处理:增强了缓存管理功能,引入了更复杂的缓存控制策略。
- 更多方法和状态码:引入了PUT、DELETE方法,以及多种新的HTTP状态码。
- 分块传输编码:允许响应数据动态生成,边生成边传输。
- 主机名:支持虚拟主机(多个域名共享同一IP地址)。
HTTP/2
- 发布时间:2015年,RFC 7540。
- 核心特性:
- 二进制协议:不再是纯文本,提高了解析效率。
- 多路复用:单一连接上并行无阻塞传输多个请求和响应。
- 服务器推送:服务器可以对一个客户端请求发送多个响应。
- 头部压缩:使用HPACK压缩协议减少了头部大小,减少了传输延迟。
- 性能提升:显著减少了延迟,通过有效使用TCP连接增强了性能和资源利用率
HTTP/3
- 发布时间:2022年6月6日,IETF正式标准化HTTP/3为RFC9114,基于QUIC(一种基于UDP的传输协议)。
- 关键改进:
- QUIC协议:减少连接和传输延迟,支持更好的多路复用和连接迁移。
- 改进的安全性:集成了TLS 1.3,加强了数据传输的安全性。
- 抗网络拥塞:优化了控制和避免网络拥塞的能力
队头阻塞(Head-of-Line Blocking,HOL Blocking)
队头阻塞是一种在多种网络协议中常见的问题,特别是在HTTP/1.x和HTTP/2的上下文中。这种现象发生在使用单一TCP连接传输多个请求和响应时,
如果一个数据包丢失或延迟,整个TCP连接上的后续数据传输都必须等待前面的数据包成功接收和确认,即使后续的数据包已经到达。这导致了网络利用率不高和响应时间增长。
在HTTP/1.x中
HTTP/1.1引入了管道化,理论上可以在一个TCP连接上同时发送多个请求。然而,由于HTTP/1.1的响应必须按请求顺序返回(FIFO),
一个慢响应会阻塞后面所有的响应,即使后面的响应已经准备好了。这就是HTTP/1.1中的队头阻塞
在HTTP/2中
HTTP/2引入了多路复用技术,允许在单一TCP连接上并行发送和接收多个请求和响应。虽然HTTP/2可以同时处理多个请求,
但由于它仍然依赖于单一的TCP连接,TCP层面的队头阻塞问题仍然存在。如果TCP数据包丢失,整个TCP连接的数据传输都会被阻塞,即使其他流(stream)的数据包已经到达。
HTTP/3如何解决队头阻塞
HTTP/3旨在通过使用基于UDP的QUIC协议来解决队头阻塞问题。QUIC协议为每个HTTP/3请求/响应创建独立的流,这些流相互独立,因此一个流的延迟或丢包不会影响其他流
QUIC的主要特性包括:
- 独立流控制:每个流在QUIC协议中都是独立处理的,因此,单个数据包的丢失只影响该流,不会阻塞其他已经到达或无问题的流。
- 快速重传和连接恢复:QUIC支持更快的数据包重传响应和加密握手,以及在网络变化时的连接迁移,这些都有助于减少延迟和改善连接的稳定性。
- 多路复用无阻塞:由于每个流都是独立的,多个请求和响应可以在相同的时间内在不同的流上并行处理,从而有效地使用网络资源并减少延迟
http请求报文结构
![](../images/httprequest01.png)
http响应报文结构
![](../images/httpresponse01.png)
http 响应码分类以及常用状态码
1xx:100-101 信息提示
2xx:200-206 成功
3xx:300-307 重定向
4xx:400-415 错误类信息,客户端错误
5xx:500-505 错误类信息,服务器端错误
200: 成功,请求数据通过响应报文的entity-body部分发送;OK
301: Moved Permanently,请求的URL指向的资源已经被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置
302: Moved Temporarily,响应报文Location指明资源临时新位置
304: 客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端;Not Modified,但无需再发送原始数据即实体给客户端
307: 浏览器内部重定向,而无需再向服务器发送请求
401: 需要输入账号和密码认证方能访问资源;Unauthorized
403: 请求被禁止;Forbidden,一般是因为权限错误或主页文件不存在
404: 服务器无法找到客户端请求的资源;Not Found
405: 表明服务器禁止了使用当前 HTTP 方法的请求 ethod Not Allowed
413: 上传的资源超过了最大限制值
499: 客户端主动断开连接。然而在实际业务开发中,当出现 HTTP 499 状态码时,大部分都是由于服务端
请求时间过长,导致客户端等的“不耐烦”了,因此断开了连接。比如:慢SQL问题,499是客户端读超时关闭
连接造成的,推荐从超时时间或者优化响应速度入手,web服务器发现客户端主动关闭连接后,记录到access
日志中的。可能是客户端接收响应超时了,可以先在客户端统计下是不是这个原因,再调查为什么会导致超时
500: 服务器内部错误;Internal Server Error,比如:cgi程序没有执行权限,或连接数据库失败,rewrite死循环
502: Bad Gateway,代理服务器从后端服务器收到了一条错误响应或伪响应,如无法连接到网关;Bad
Gateway,比如:后端服务端口没有打开,或后端服务不可用或关机,iptable -j REJECT,确定服务器是down,相当于"确定人不存在了"
503: 服务不可用,临时服务器维护或过载,服务器无法处理请求,比如:超过连接数和连接频率
504: Gateway Timeout,网关超时,或者后端服务器无回应报文,比如:服务端口虽然打开,但服务返回结果
时间过长,iptable -j DROP,不确定服务器down,相当于"人失踪了,不确定存在或不存在"