目录

  1. 过程概述
    1. 根据域名查找 IP 地址
      1. 概念解释
      2. 查找过程
    2. 网页请求与显示
  2. 断开连接–四次挥手
  3. 注意:
    1. URL
    2. TCP为什么要三次握手而不是两次握手
    3. TCP 四次挥手能不能变成三次挥手呢?

过程概述

  从输入域名到网页打开的简单过程如下:
1. DNS域名解析
  客户端输入域名后,由DNS服务器来将域名解析成对应服务器的IP地址
  若未在缓存中找到,则不停的向上一级级请求DNS服务器
2. 建立TCP连接
  客户端得到IP地址以后,会根据所获得的IP地址以及要访问的端口号发起网络连接, 即tcp三次握手连接, 建立起TCP/IP网络连接, 具体过程如下:
  第一次握手:
    主机向服务器发送一个建立连接的请求(您好,我想认识您)
    建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认
  第二次握手:
    服务器接到请求后发送同意连接的信号(好的,很高兴认识您)
    服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器 进入SYN_RECV状态;
  第三次握手:
    主机接到同意连接的信号后,再次向服务器发送了确认信号(我也很高兴认识您),自此,主机与服务器两者建立了连接
    客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED状态,完成三次握手。
通过这样的三次握手,客户端与服务端建立起可靠的双工的连接,开始传送数据。

解释:
  SYN:synchronous 建立联机
  ACK:acknowledgement 确认
  SYN_SENT:请求连接
  SYN_RECV:服务端被动打开后,接收到了客户端的SYN并且发送了ACK时的状态。再进一步接收到客户端的ACK就进入ESTABLISHED状态。
  tcp在握手过程中并不携带数据,(就像你打电话给酒店订房时,在确认对方是酒店客服人员之前,你也不会马上把身份证号码报给他吧?),而是在三次握手完成之后,才会进行数据传送。

补充说明:
    TCP 协议:三次握手的过程采用 TCP 协议,其可以保证信息传输的可靠性,三次握手过程中,若一方收不到确认信号,协议会要求重新发送信号。
3. 发送HTTP请求
  与服务器建立连接之后,就可以向服务器发送请求了,请求需要遵循http协议
  添加一些HTTP首部
  根据同源政策添加cookie
4.服务器处理HTTP请求报文
  被请求的服务器解析用户请求的有哪些资源,通过服务器返回数据给客户端
5.返回响应HTTP响应报文
  给客户端返回请求的状态码,通过状态码可以知道服务器端的处理是否正常
6.浏览器渲染:
  返回成功之后,浏览器拿到请求页面的代码,将其解析渲染出来。解析和渲染的过程主要由浏览器的渲染引擎实现。
  浏览器处理服务器返回的HTTP响应报文,若为HTML则渲染页面,不包括脚本的简单渲染流程如下:
    1、解析DOM、CSSOM
    2、根据DOM、CSSOM计算render tree
    3、根据render tree进行layout
    4、paint,至此,用户可以看到页面了

根据域名查找 IP 地址
概念解释

  IP 地址:IP 协议为互联网上的每一个网络和每一台主机分配的一个逻辑地址。IP 地址如同门牌号码,通过 IP 地址才能确定一台主机位置。服务器本质也是一台主机,想要访问某个服务器,必须先知道它的 IP 地址;
  域名(DN):IP 地址由四个数字组成,中间用点号连接,在使用过程中难记忆且易输入错误,所以用我们熟悉的字母和数字组合来代替纯数字的 IP 地址,比如我们只会记住 www.baidu.com(百度域名) 而不是 220.181.112.244(百度的其中一个 IP 地址);
  DNS: 每个域名都对应一个或多个提供相同服务服务器的 IP 地址,只有知道服务器 IP 地址才能建立连接,所以需要通过 DNS 把域名解析成一个 IP 地址。

  知道了上面的概念,大概就知道了想要获得服务器的门牌号码,需要先将域名转换成 IP 地址。转换过程如下(以查询 www.baidu.com 的 IP 地址为例,其中2、3、4步均在上一步未查询成功的情况下进行):

查找过程
  1. 浏览器搜索自己的 DNS 缓存(维护一张域名与 IP 地址的对应表);
  2. 搜索操作系统中的 DNS 缓存(维护一张域名与 IP 地址的对应表);
  3. 搜索操作系统的 hosts 文件( Windows 环境下,维护一张域名与 IP 地址的对应表);
  4. 操作系统将域名发送至 LDNS(本地区域名服务器,如果你在学校接入互联网,则 LDNS 服务器就在学校,如果通过电信接入互联网,则 LDNS 服务器就在你当地的电信那里。)LDNS 查询自己的 DNS 缓存(一般查找成功率在 80% 左右),查找成功则返回结果,失败则发起一个迭代 DNS 解析请求;
    1. LDNS 向 Root Name Server(根域名服务器,其虽然没有每个域名的的具体信息,但存储了负责每个域,如 com、net、org等的解析的顶级域名服务器的地址)发起请求,此处,Root Name Server返回 com 域的顶级域名服务器的地址;
    2. LDNS 向 com 域的顶级域名服务器发起请求,返回 baidu.com域名服务器地址;
    3. LDNS 向 baidu.com 域名服务器发起请求,得到 www.baidu.com的 IP 地址;
  5. LDNS 将得到的 IP 地址返回给操作系统,同时自己也将 IP 地址缓存起来;
  6. 操作系统将 IP 地址返回给浏览器,同时自己也将 IP 地址缓存起来;
  7. 至此,浏览器已经得到了域名对应的 IP 地址。

补充说明
  域名与 URL 是两个概念:域名是一台或一组服务器的名称,用来确定服务器在 Internet 上的位置;URL 是统一资源定位符,用来确定某一个文件的具体位置,例如,zhihu.com 是 知乎的域名,根据这个域名可以找到知乎的服务器,zhihu.com/people/CompileYouth 是 URL ,可以根据这个 URL 定位我的知乎主页;
  IP 地址与域名不是一一对应的关系:可以把多个提供相同服务的服务器 IP 设置为同一个域名,但在同一时刻一个域名只能解析出一个 IP地址;同时,一个 IP 地址可以绑定多个域名,数量不限;

网页请求与显示

  当服务器与主机建立了连接之后,下面主机便与服务器进行通信。网页请求是一个单向请求的过程,即是一个主机向服务器请求数据,服务器返回相应的数据的过程。

  1. 服务器接到请求后,会根据 HTTP 请求中的内容来决定如何获取相应的 HTML 文件;
  2. 服务器将得到的 HTML 文件发送给浏览器;
  3. 在浏览器还没有完全接收 HTML 文件时便开始渲染、显示网页;
  4. 在执行 HTML 中代码时,根据需要,浏览器会继续请求图片、CSS、JavsScript等文件,过程同请求 HTML

断开连接–四次挥手

  1. 主机向服务器发送一个断开连接的请求(不早了,我该走了);
  2. 服务器接到请求后发送确认收到请求的信号(知道了);
  3. 服务器向主机发送断开通知(我也该走了);
  4. 主机接到断开通知后断开连接并反馈一个确认信号(嗯,好的),服务器收到确认信号后断开连接;

注意:

URL

  一个完整的URL地址由:协议服务器地址(主机)端口资源路径(文件)。其中网络地址指示该连接网络上哪一台计算机,可以是域名或者IP地址,可以包括端口号;协议是从 该计算机获取资源的方式,常见的是HTTP、FTP,不同协议有不同的通讯内容格式;资源路径指示从服务器上获取哪一项资源。
例如:http://www.guokr.com/question/554991/
超文本传输协议:http
服务器地址:www.guokr.com
端口: http协议的默认端口为80
资源路径:是指要活的的文件的路径 ->/question/554991/

TCP为什么要三次握手而不是两次握手

TCP 采用三次握手的原因:
  为了实现可靠数据传输,TCP 协议的通信双方,都必须维护一个序列号,以标识发送出去的数据包中,哪些是已经被对方收到的。三次握手的过程即是通信双方相互告知序列号起始值,并确认对方已经收到了序列号起始值的必经步骤。
  如果只是两次握手,至多只有连接发起方的起始序列号能被确认,另一方选择的序列号则得不到确认。
  三次握手主要是为了防止已失效的连接请求报文突然到达服务器,造成服务器的等待和资源的浪费。
举例:
  如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络结点中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。
  如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。

TCP 四次挥手能不能变成三次挥手呢?

可以的
  TCP是全双工通信,Client 在自己已经不会在有新的数据要发送给 Server 后,可以发送 FIN 信号告知 Server,这边已经终止 Client 到对端 Server 那边的数据传输。但是,这个时候对端 Server 可以继续往 Client 这边发送数据包。于是,两端数据传输的终止在时序上是独立并且可能会相隔比较长的时间,这个时候就必须最少需要2+2 = 4 次挥手来完全终止这个连接。但是,如果Server在收到Client的FIN包后,在也没数据需要发送给Client了,那么对Client的ACK包和Server自己的FIN包就可以合并成为一个包发送过去,这样四次挥手就可以变成三次了(似乎linux协议栈就是这样实现的)。
转载:
  一个页面从输入url,到页面显示加载完成,这个过程中都发生了什么?
  从输入 URL 到页面加载完成的过程中都发生了什么
参考文章:
  从键入网址到页面显示经历了那些过程