zoukankan      html  css  js  c++  java
  • HTTP请求过程-域名解析和TCP三次握手建立链接

     我们在浏览器输入http://www.baidu.com想要进入百度首页,但是这是个域名,没法准确定位到服务器的位置,所以需要通过域名解析,把域名解析成对应的ip地址,然后通过ip地址查找目的主机。整个访问过程可以概括为:

    1. 域名解析
    2. 发起TCP三次握手建立连接
    3. 建立连接后发起http请求
    4. 服务器响应请求,浏览器获取html源码
    5. 浏览器解析html代码,并请求相关css,js和图片资源
    6. 浏览器渲染页面

    一、域名解析过程

      在浏览器输入一串域名要访问某网站的时候,浏览器帮我们做了如下事情(以Chrome浏览器和windows系统为例):

    1. Chrome浏览器首先检查自己本地是缓存是否有对应的域名,有则直接使用。【查看Chrome浏览器dns缓存地址:chrome://net-internals/#dns
    2. 如果浏览器缓存中没有,则查询系统DNS缓存中的域名表,有则直接使用。【windows查看域名表的命令:ipconfig /displaydns】
    3. 系统缓存中还是没有,则检查hosts文件中的映射表。【windows中hosts文件路径:C:WindowsSystem32driversetc】
    4. 本地实在找不到,则向DNS域名服务器发起请求查询。【DNS服务器IP是本地配置的首选服务器,一般常用的有114.114.114.114(电信运营商提供)和8.8.8.8(Google提供)】
        • DNS服务器首先查找自身的缓存,有对应的域名ip则返回结果
        • 如果缓存中查找不到,DNS服务器则发起迭代DNS请求,首先向根域服务器发起请求查询,假如本次请求的是www.baidu.com,根域服务器发现这是一个com的顶级域名,就把com域的ip地址返回给DNS服务器
        • DNS服务器向com域ip地址发起请求,查询该域名的ip,此时该服务器返回了baidu.com的DNS地址。
        • 最后DNS服务器又向baidu.com的DNS地址发起查询请求,最后找到了完整的ip路径返回给DNS服务器,DNS再把ip信息返回给windows内核,内核再返回给浏览器,于是浏览器就知道该域名对应的ip地址了,可以开始进一步请求了。

      --------------------------------------------------------------------------------------------------------------------------

      DNS请求原理:

      

      每个域名用小数点分隔开变成多级,从右到左等级逐级递减,所以最右边的等级最高,每个域都有用一个域名服务器,管理则下属域名,分布如下图:

      

      所以DNS发送查询请求的时候,先从根服务器获对应顶级域名的ip,然后再逐级从定义域名ip向下查找各个下属域服务的,找到完整的域名ip。这是一个迭代查询的过程。

      --------------------------------------------------------------------------------------------------------------------------

      总的来说:域名解析的过程就是一个由近及远的过程,采取就近原则,再自顶向下搜索。

       【如果连DNS服务器也没解析成功,那么进行如下步骤:】

      ⑤ 操作系统就会查找NetBIOS name Cache(NetBIOS名称缓存,就存在客户端电脑中的),那这个缓存有什么东西呢?凡是最近一段时间内和我成功通讯的计算机的计算机名和Ip地址,就都会存在这个缓存里面。什么情况下该步能解析成功呢?就是该名称正好是几分钟前和我成功通信过,那么这一步就可以成功解析。

      ⑥ 如果第⑤步也没有成功,那会查询WINS 服务器(是NETBIOS名称和IP地址对应的服务器)

      ⑦ 如果第⑥步也没有查询成功,那么客户端就要进行广播查找

      ⑧ 如果第⑦步也没有成功,那么客户端就读取LMHOSTS文件(和HOSTS文件同一个目录下,写法也一样)

    如果第八步还没有解析成功,那么就宣告这次解析失败,那就无法跟目标计算机进行通信。只要这八步中有一步可以解析成功,那就可以成功和目标计算机进行通信。

    二、建立TCP连接

      

      第一次握手:客户端向服务器发送SYN报文,并发送客户端初始序列号Seq=X;等待服务器确认,

      第二次握手:服务器接收客户端的SYN报文,然后向客户端返回一个包SYN+ACK响应报文,并发送初始序列号Seq=Y

      第三次握手:客户端接受SYN+ACK报文,并向服务器发送一个ACK确认报文,至此连接建立

      【建立连接的最重要目是让连接的双方交换初始序号(ISN, Initial Sequence Number),所以再响应的ACK报文中会包含序列号递增序列】

    三、http请求和浏览器渲染过程

      请参考:http://www.cnblogs.com/caijh/p/7661402.html

    .

  • 相关阅读:
    git修改 config 配置用户名和邮箱
    Tranformer模型学习
    centos安装
    ubuntu cuda配置
    ubuntu安装python3.6
    flask后端部署
    linux基本操作
    python 基础数据结构
    文本特征选择
    常用笔记
  • 原文地址:https://www.cnblogs.com/fightjianxian/p/12003536.html
Copyright © 2011-2022 走看看