经典面试题:输入url到页面显示的过程

输入url到页面显示的过程

这是一到非常经典的面试题,里面涉及的知识点的确是非常多,如果对某个过程特别懂的话就会讲的很细很细,所以还是看个人水平吧,我这里就只能当搬运工总结一下。

参考的博客如下:
https://blog.csdn.net/yanshuanche3765/article/details/82589210

1. DNS解析(应用层)

当输入url按下回车之后,第一步应该做的就是DNS解析,因为我们输入的仅仅是一个域名而已,浏览器需要知道到底向哪个服务器发送请求,DNS解析过程如下:

  1. 浏览器先检查自身缓存中有没有缓存这个域名对应的ip地址,如果有,解析结束。同时域名被缓存的时间也可通过TTL属性来设置。

  2. 如果浏览器缓存没有命中,则浏览器会检查操作系统缓存中有没有对应的已解析过的结果。而操作系统也有一个域名解析的过程。在windows中可通过c盘里一个叫hosts的文件来设置,如果你在这里指定了一个域名对应的ip地址,那浏览器会首先使用这个ip地址。但是这种操作系统级别的域名解析规程也被很多黑客利用,通过修改你的hosts文件里的内容把特定的域名解析到他指定的ip地址上,造成所谓的域名劫持。所以在windows7中将hosts文件设置成了readonly,防止被恶意篡改。

  3. 如果至此还没有命中域名,才会真正的请求本地域名服务器(LDNS)来解析这个域名,这台服务器一般在你的城市的某个角落,距离你不会很远,并且这台服务器的性能都很好,一般都会缓存域名解析结果,大约80%的域名解析到这里就完成了。

  4. 如果LDNS仍然没有命中,就直接跳到Root Server 域名服务器请求解析。

  5. 根域名服务器返回给LDNS一个所查询域的主域名服务器(gTLD Server,国际顶尖域名服务器,如.com .cn .org等)地址。gTLD是国际顶级域名服务器,如.com、.cn、.org等,全球只有13台左右。

  6. 此时LDNS再发送请求给上一步返回的gTLD

  7. 接受请求的gTLD服务器查找并返回此域名对应的Name Server域名服务器的地址,这个Name Server通常就是你注册的域名服务器,例如你在某个域名服务提供商申请的域名,那么这个域名解析任务就由这个域名提供商的服务器来完成。

  8. 此时本地域名服务器会向Name Server域名服务器发送查询请求,Name Server会查询存储的域名和IP的映射关系表,正常情况下都根据域名得到目标IP记录,连同一个TTL值返回给DNS Server域名服务器。

  9. 返回该域名对应的IP和TTL值,Local DNS Server会缓存这个域名和IP的对应关系,缓存的时间由TTL值控制。

  10. LDNS把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程至此结束。

实际上DNS的解析过程不仅仅只有这十个过程,因为Name Server的查询过程也是一个复杂的多级查询过程。

2. 浏览器向服务器发送http请求(应用层)

这里就可以简单叙述一下http请求报文的结构:

HTTP请求报文主要包括三个部分:请求行,请求头,请求数据

请求行

请求行包括:请求方法,URL,协议版本
举例说明:GET + 空格 + /xxxxx/login.html + 空格 + HTTP/1.1

请求头

HTTP客户程序(例如浏览器),向服务器发送请求的时候必须指明请求类型(一般是GET或者POST)。如有必要,客户程序还可以选择发送其他的请求头。大多数请求头并不是必需的,但Content-Length除外。对于POST请求来说
Content-Length必须出现。请求头主要包含一些客户端的一些信息

下面简单举例一些常见的请求头字段:

Cookie:客户机通过这个头可以向服务器带数据,这是最重要的请求头信息之一。
User-Agent:User-Agent头域的内容包含发出请求的用户信息。
Accept: 浏览器可接受的MIME类型。
Accept-Charset:浏览器可接受的字符集。
Accept-Encoding:浏览器能够进行解码的数据编码方式
Accept-Language:浏览器所希望的语言种类
Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。
Content-Length:表示请求消息正文的长度。
Host:客户机通过这个头告诉服务器,想访问的主机名。Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。

请求数据:

若方法字段是GET,则此项为空,没有数据

若方法字段是POST,则通常来说此处放置的就是要提交的数据

比如要使用POST方法提交一个表单:
其中有user字段中数据为“admin”, password字段为123456,
那么这里的请求数据就是user=admin&password=123456,使用&来连接各个字段。

关于http报文的结构可以看这篇博客:

https://blog.csdn.net/weixin_44844089/article/details/115750886

3. TCP三次握手建立连接(传输层)

  • 第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN©。此时客户端处于 SYN_Send状态。
  • 第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(s),同时会把客户端的 ISN + 1 作为 ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_REVD的状态
  • 第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 establised状态。
  • 服务器收到 ACK 报文之后,也处于 establised 状态,此时,双方以建立起了链接。

4. 路由寻址(网络层)

路由寻址。。。以后再更

5.数据链路层

在找到对方的MAC地址后,就将数据发送到数据链路层传输。这时,客户端发送请求的阶段结束

6. 服务器响应返回响应报文

服务接收到客户端发送的HTTP请求后,查找客户端请求的资源,并返回响应报文。

响应报文包括:响应行,响应头,响应数据

响应报文的结构详解可以看此博客:
https://blog.csdn.net/weixin_44844089/article/details/115750886

7. 浏览器接收数据进行页面渲染

8. TCP四次挥手断开连接

  • 第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于FIN_WAIT1状态。
  • 第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 + 1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT状态。
  • 第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。
  • 第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 + 1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态。
    服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值