文章目录
overview
- 解析URL
- 输入的是URL还是搜索关键字
- 转换非ASCII字符
- 检查HSTS(HTTP严格传输安全)列表,包含了那些请求浏览器只使用HTTPS进行连接的网站Reason
- DNS查询
- 浏览器缓存
- 调用系统库方法
gethostbyname
- 检查host文件
- 检查缓存
- 发起请求
- Http请求(调用系统库函数socket,请求一个TCP流套接字)TCP/TLS
- 解析、渲染
DNS查询
Domain Name System
在TCP握手之前就已经进行DNS查询了,由操作系统来查询,当要访问www.google.com
时候,会进行这样操作:
- 检查hosts文件
- 操作系统会首先在本地的缓存中查询IP
- 如果没有的话就去系统配置的DNS服务器中查询
- 如果这时候还没有,会直接去DNS根服务器查询(根据是否启用转发模式),这一步会找出负责
com
这个一级域名的服务器 - 然后去该服务器查询
google
这个二级域名 - 接下来三级域名的查询其实我们配置的,可以给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)