一次完整的url请求过程
一次完整的URL请求过程大致分为以下几个步骤:
用户输入URL:
用户在浏览器的地址栏输入一个URL,如https://www.example.com/path/to/resource?param1=value1
。域名解析:
浏览器首先检查本地DNS缓存是否有该域名对应的IP地址。如果没有,浏览器向操作系统请求DNS解析,操作系统查询本地hosts文件、本地DNS缓存,再到ISP的DNS服务器,最终递归至根域名服务器,逐级向下解析域名至具体的IP地址。TCP连接:
浏览器获取到域名对应的IP地址后,开始与服务器建立TCP连接。对于HTTPS请求,它会发起TLS/SSL握手,进行身份验证并协商加密算法,生成会话密钥以确保数据传输的安全性。HTTP请求:
成功建立连接后,浏览器构造HTTP请求报文,其中包含请求行(Method、URI、HTTP Version)、请求头(如User-Agent、Cookie、Accept等)、以及可能有的请求主体(如POST请求携带的数据)。然后,浏览器将请求报文发送给服务器。服务器处理请求:
服务器接收到请求后,根据请求的URI和HTTP Method识别出要访问的资源,并通过web服务器软件(如Apache、Nginx、Tomcat等)调度请求至相应的应用程序(如PHP、Java、Python等)进行处理。生成响应:
服务器应用程序处理请求后,生成HTTP响应报文,包含状态行(HTTP Version、Status Code、Reason Phrase)、响应头(如Content-Type、Set-Cookie、Location等)和响应主体(即返回给客户端的数据,如HTML、JSON、图片等)。返回响应:
服务器将响应报文通过已建立的TCP连接发送回客户端。浏览器解析响应:
浏览器接收到响应后,根据响应的状态码进行不同处理。如果是正常的HTML文档,它会解析HTML,并根据其中的指示下载其他资源(如CSS、JavaScript、图片等)。渲染页面:
浏览器根据下载的资源和解析的HTML构建DOM树,执行JavaScript脚本,并进行页面渲染。关闭连接:
在HTTP/1.x中,一般来说,每个请求完成后都会关闭TCP连接,而在HTTP/2及后续版本中,有可能通过多路复用技术保持长连接,以提高请求效率。垃圾回收:
浏览器在使用完资源后进行清理工作,如释放内存、关闭网络连接等。
整个过程体现了从用户请求到服务器响应,再到浏览器展示内容的完整交互流程。
主键索引和非主键索引的区别?
主键索引(Primary Key Index)和非主键索引(Secondary Index 或 Non-Clustered Index)在数据库中具有不同的作用和特点:
主键索引(Primary Key Index):
- 唯一性:主键索引强制字段的值必须唯一,不允许有重复的值。
- 聚簇索引:在许多数据库系统(如InnoDB引擎的MySQL)中,主键索引同时也是聚簇索引,这意味着表中的数据行是按照主键的顺序存储在磁盘上的。因此,主键索引不仅包含键值,还直接包含行数据,所以查询主键时效率非常高。
- 不能为空:主键字段通常不允许为空(NULL)。
- 每个表只能有一个主键索引。
非主键索引(Secondary or Non-Clustered Index):
- 非唯一性:非主键索引可以是唯一索引,也可以不是唯一索引,这取决于索引定义时是否要求唯一性。
- 存储结构:非主键索引不决定数据行在磁盘上的物理存储顺序。非聚簇索引包含了索引键值和一个指向对应行数据的指针(row pointer),查询非主键索引时,数据库首先查找索引树找到键值,然后通过指针访问实际的数据行。
- 可以为空:非主键字段创建的索引可以允许值为空(NULL)。
- 数量不限:一个表可以有多个非主键索引。
总结来说,主键索引主要用于唯一标识表中的每一行数据,并且决定了数据在物理层面的存储顺序;而非主键索引则是为了加速对非主键字段的查询,它提供了另一种访问数据的方式,但其本身不直接影响数据行在磁盘上的存储布局。在查询时,根据查询条件和索引覆盖范围,数据库会选择合适的索引来提高查询性能。