浏览器输入网址发生了什么?

浏览器输入网址后发生了什么?
这是一道很经典的 面试题目。

  1. 浏览器解析URL,生成HTTP请求报文。

  2. 如果输入的是域名,则需要根据域名向DNS服务器查询IP地址。
    调用sockt库中的获取域名函数(gethostbyname())解析输入的域名。解析过程如下:

    - 委托操作系统内部协议栈发送UDP报文,包含请求消息
    - ...
    - 中间包含IP层和数据链路层的封装,解封,以及路由寻址等(下面会提到)
    - ...
    - 操作系统内部协议栈接受UDP报文,包含响应消息
    - 函数返回
  3. 知道了IP 地址之后,就可以委托操作系统内部的协议栈向这个目标IP地址发送消息。
    通过socket库与服务器通信。socket通信过程如下:

  1. socket会调用 TCP协议模块 去建立连接(三次握手),收发数据,断开连接(四次挥手)。TCP模块会在原始数据上加上TCP控制信息,例如端口信息等。

  2. TCP在执行连接,收发,断开等各个阶段操作时都需要委托 IP协议模块 封装数据包发送通信对象。IP协议模块接受TCP协议模块的委托负责包的收发,他会生成IP头部(包括发送方和接收方的IP地址等)附加在TCP头部前面。

  3. 通过路由表确定下一跳路由器地址。

  4. 为了到达目标路由器,还需要知道目标路由器的MAC地址,MAC地址通过ARP协议获得。网卡将IP报文封装成以太网帧(添加MAC地址等信息),然后转换成物理信号发送到链路上。

  5. 中间经过路由,交换,数据到达web服务器。

  6. 服务器端接受数据。

    - 网卡将接受到的信号转化为数字信息
    - IP协议模块接受数据,去掉IP头部,交给TCP模块
    - TCP模块连接,收发数据,断开操作,将数据返回给socket库
    - socket库交给应用程序,通常是WEB服务器软件,如Tomcat,IIS,Apache等
  7. WEB 服务器解析请求并作出响应,生成HTTP响应报文,返回给客户端。

  8. 响应报文发送到客户端的过程与客户端到服务器端的过程基本相同。

  9. 客户端收到响应报文,并显示内容在浏览器上。