输入URL到页面渲染的整个流程

文章目录

overview

  1. 解析URL
  2. 输入的是URL还是搜索关键字
  3. 转换非ASCII字符
  4. 检查HSTS(HTTP严格传输安全)列表,包含了那些请求浏览器只使用HTTPS进行连接的网站Reason
  5. DNS查询
    1. 浏览器缓存
    2. 调用系统库方法gethostbyname
    3. 检查host文件
    4. 检查缓存
    5. 发起请求
  6. Http请求(调用系统库函数socket,请求一个TCP流套接字)TCP/TLS
  7. 解析、渲染

DNS查询

Domain Name System

在TCP握手之前就已经进行DNS查询了,由操作系统来查询,当要访问www.google.com时候,会进行这样操作:

  1. 检查hosts文件
  2. 操作系统会首先在本地的缓存中查询IP
  3. 如果没有的话就去系统配置的DNS服务器中查询
  4. 如果这时候还没有,会直接去DNS根服务器查询(根据是否启用转发模式),这一步会找出负责com这个一级域名的服务器
  5. 然后去该服务器查询google这个二级域名
  6. 接下来三级域名的查询其实我们配置的,可以给www这个域名配置一个IP,还可以给别的三级域名配置一个IP

以上是DNS递归查询,还有一种是迭代查询:本地服务器将请求转发到根服务器

当本地服务器代替客户端向其他服务器查询的时候,客户端完全处于等待状态
DNS查询DNS是应用层协议,是通过UDP进行的查询。DNS采用分布式集群的工作方式(单点故障,通信容量,远距离时间延迟,维护开销大)

网址结构(从右往左)

  • 根域
  • 顶级域(国家或者组织)
  • 第二层域
  • 子域
  • 主机名

使用UDP的原因:一次UDP名字交换可以短到两个包:一个查询宝和一个响应包。但是使用TCP的话,就需要9个包(其中3个握手4个挥手),开销大,所以前者(UDP)的效率很高。

DNS服务器一般分三种:根DNS服务器,顶级DNS服务器,权威DNS服务器
一般只有13个根服务器:
这是因为UDP数据包中512字节限制了信息量(又因为UDP报文中包含所有跟服务器的信息),所以只能有13个。

其实512是为了让UDP报文中不会因为size > MTU而导致IP分片。IP分片发生后,只有一片有端口号,其他分片没有端口号,能否通过就取决于防火墙了,这对于是否通信成功是一个未知数。(以太网MTU=1500)

DNS负载均衡

分享到: