zoukankan      html  css  js  c++  java
  • 在浏览器中输入网址后的流程

    1、浏览器发起DNS查询请求

           在广域网中是基于IP地址进行通信的。但通常客户访问的是一个网址,为此需要先得到网址对应的IP地址,这就需要域名服务系统将域名转换成IP地址。在客户端浏览器中输入网址时,浏览器会根据本地客户端DNS服务器配置,向DNS服务器获取域名对应的IP地址。
           域名解析服务器是基于UDP协议实现的一个应用程序,通常通过监听53端口来获取客户端的域名解析请求。

           DNS查找过程为:
           浏览器缓存->系统缓存->路由器缓存->ISP DNS缓存->递归搜索
           递归搜索过程为:从根域名服务器到顶级域名服务器到所查询的域名服务器。

    2、域名服务器向客户端返回查询结果域名,从而完成域名到IP地址的转换。

    3、客户端向web服务器发送HTTP请求

           得到了域名对应的IP地址后客户端便可向真正的web服务器发生HTTP请求。通常一个HTTP请求格式如下:

           如果浏览器存储了该域名下的cookie,那么cookie也会放入http请求中         

           HTTP请求是一个基于TCP协议之上的应用层协议——超文本传输协议。浏览器通过DNS获取到web服务器真的IP地址后,便向Web服务器发起TCP连接请求,通过TCP三次握手建立好连接后,浏览器便可以将HTTP请求数据通过发送给服务器了。

          TCP三次握手连接:
          第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
          第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
          第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
         握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

     

    4、服务器给浏览器进行一个301永久重定向响应。

           IP对应的服务器很可能是代理服务器,比如输入“http://baidu.com”,而不是“http://www.baidu.com”,这两个网址对应的是同一个网页,因此通过代理服务器的方式进行重定向响应,让这两个网址访问的同一个网页。 浏览器根据重定向地址再次进行HTTP请求。

    5、发送响应数据给客户端

          Web服务器通常通过监听80端口来获取客户端的HTTP请求。与客户端建立好TCP连接后,Web服务器开始接受客户端发来的数据,并通过HTTP解码,从接受到的网络数据中解析出请求的url信息以前其他诸如Accept-Encoding、Accept-Language等信息。
         Web服务器根据HTTP请求头的信息,得到响应数据返回给客户端。一个典型的HTTP响应头数据报如下:

     

           至此,一个HTTP通信过程完成。web服务器会根据HTTP请求头中的Connection字段值决定是否关闭TCP链接通道,当Connection字段值为keep-alive时,web服务器不会立即关闭此连接。

     

    6、浏览器响应过程

          浏览器收到响应内容之后,生成主页框架,同时向服务端继续发送请求,请求的内容是主页里的一些资源,比如说图片、视频等。 对于静态的页面内容,浏览器通常进行缓存,对于动态的内容通常不缓存,缓存的时间也是有期限的。
         浏览器向服务器发送异步请求,因为有些页面显示完成之后客户端仍需要与服务端保持联系。
         整个过程结束之后,浏览器关闭TCP连接。

    TCP四次挥手断开连接

         假设Client端发起中断连接请求,即发送FIN报文。Server端接到FIN报文后,意思是说"Client端没有数据要发送了",但是如果Server端还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以Server端先发送ACK,告诉Client端"请求已经收到,但是Server端还没准备好,请继续等待消息"。这个时候Client端进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,告诉Client端"数据发送完成,准备好关闭连接"。Client端收到FIN报文后知道可以断开连接,但是怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。Server端收到ACK后断开连接。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,则自身关闭连接。

  • 相关阅读:
    hdu 4710 Balls Rearrangement()
    hdu 4707 Pet(DFS水过)
    hdu 4706 Children's Day(模拟)
    hdu 4712 Hamming Distance(随机函数暴力)
    csu 1305 Substring (后缀数组)
    csu 1306 Manor(优先队列)
    csu 1312 榜单(模拟题)
    csu 1303 Decimal (数论题)
    网络爬虫
    Python处理微信利器——itchat
  • 原文地址:https://www.cnblogs.com/csong7876/p/9084744.html
Copyright © 2011-2022 走看看