HTTP请求过程-域名解析和TCP三次握手建立链接
我们在浏览器输入http://www.baidu.com想要进入百度首页,但是这是个域名,没法准确定位到服务器的位置,所以需要通过域名解析,把域名解析成对应的ip地址,然后通过ip地址查找目的主机。整个访问过程可以概括为:
- 域名解析
- 发起TCP三次握手建立连接
- 建立连接后发起http请求
- 服务器响应请求,浏览器获取html源码
- 浏览器解析html代码,并请求相关css,js和图片资源
- 浏览器渲染页面
一、域名解析过程
在浏览器输入一串域名要访问某网站的时候,浏览器帮我们做了如下事情(以Chrome浏览器和windows系统为例):
- Chrome浏览器首先检查自己本地是缓存是否有对应的域名,有则直接使用。【查看Chrome浏览器dns缓存地址:chrome://net-internals/#dns】
- 如果浏览器缓存中没有,则查询系统DNS缓存中的域名表,有则直接使用。【windows查看域名表的命令:ipconfig /displaydns】
- 系统缓存中还是没有,则检查hosts文件中的映射表。【windows中hosts文件路径:C:\Windows\System32\drivers\etc】
- 本地实在找不到,则向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
HTTP请求过程-域名解析和TCP三次握手建立链接的更多相关文章
- tcp 三次握手建立连接难点总结
所谓三次握手(Three-way Handshake),是指建立一个TCP连接时,需要客户端和服务器总共发送3个包. 三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号 ...
- TCP三次握手建立连接
基本过程: ISN(初始序号)随时间变化,每一个连接具有不同的ISN,防止在网络延迟中分组被重新发送. 请求端发送SYN(同步序号 )=1,seq=ISN(32bits序号,每4ms+ ...
- 浅谈浏览器解析 URL+DNS 域名解析+TCP 三次握手与四次挥手+浏览器渲染页面
(1)浏览器解析 URL 为了能让我们的知识层面看起来更有深度,我们应该考虑下面两个问题了: 从浏览器输入 URL 到渲染成功的过程中,究竟发生了什么? 浏览器渲染过程中,发生了什么,是不是也有重绘与 ...
- TCP三次握手四次挥手过程梳理
1. 数据传输的大致示意图 1.1 TCP数据报文首部内部 1.2 TCP连接的几种状态说明 即命令 netstat 结果中的所有状态: 2. TCP连接建立的全过程 2.1 TCP三次握手建立TCP ...
- 一文彻底搞懂 TCP三次握手、四次挥手过程及原理
原创文章出自公众号:「码农富哥」,欢迎收藏和关注,如转载请注明出处! TCP 协议简述 TCP 提供面向有连接的通信传输,面向有连接是指在传送数据之前必须先建立连接,数据传送完成后要释放连接. 无论哪 ...
- 详解TCP三次握手(建立TCP连接过程)
在讲述TCP三次握手,即建立TCP连接的过程之前,需要先介绍一下TCP协议的包结构. 这里只对涉及到三次握手过程的字段做解释 (1) 序号(Sequence number) 我们通过 TCP 协议将数 ...
- TCP的三次握手(建立连接)和四次挥手(关闭连接)
参照: http://course.ccniit.com/CSTD/Linux/reference/files/018.PDF http://hi.baidu.com/raycomer/item/94 ...
- iOS 开发:TCP三次握手连接
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握 ...
- TCP三次握手四次挥手详解
转载 http://www.cnblogs.com/zmlctt/p/3690998.html 相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需 ...
随机推荐
- 阿里云ECS服务器上搭建keepalived+mha+mysql5.6+gtid+一主两从+脚本判断架构踩的坑
最近,公司项目搭建了一套后端数据库架构,不是在RDS,是在阿里云的ECS服务器上搭建keepalived.mha.mysql5.6.gtid.一主两从架构,目前还没有实现读写分离,以后架构升级,可能代 ...
- 基于Centos7的autobahn-python+crossbar的环境搭建
一.基于centos7的crossbar安装(已经安装好python) (1) sudo yum update (2) sudo yum install gcc gcc-c++ make openss ...
- linux下安装jdk,tomcat以及mysql
环境:centOS6.8.jdk1.8,tomcat-8.5.15,mysql-5.7.18 1. 安装JDK 注意:rpm与软件相关命令 相当于window下的软件助手 管理软件 步骤: 1)查看 ...
- SpringBoot 中常用注解
本篇博文将介绍几种SpringBoot 中常用注解 其中,各注解的作用为: @PathVaribale 获取url中的数据 @RequestParam 获取请求参数的值 @GetMapping 组合注 ...
- 剑指offer第八天
32.把数组排成最小的数 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323 ...
- CodeForces-747C
直接模拟就行,用一个数组保存某个server上次是在哪个task里面即可很方便判断它现在是否可用. AC代码: #include<cstdio> #include<cstring&g ...
- HTTP协议报文结构及示例
HTTP基本架构 下面我们用一张简单的流程图来展示HTTP协议基本架构,以便大家先有个基本的了解. 9.png Web Client可以是浏览器.搜索引擎.机器人等等一切基于HTTP协议发起http请 ...
- Node 定时器详解
JavaScript 是单线程运行,异步操作特别重要. 只要用到引擎之外的功能,就需要跟外部交互,从而形成异步操作.由于异步操作实在太多,JavaScript 不得不提供很多异步语法.这就好比,有些人 ...
- Integer 与 int
Integer是java为int提供的封装类.int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况 例如,要想表达出没 ...
- PCI、CPCI、CPCIE 区别、特点
PCI.CPCI.CPCIE 区别.特点 CPCI总线 •PCI总线作为处理器系统的局部总线,主要目的是为了连接外部设备,而不是作为处理器的系统总线连接Cache和主存储器 •(1) PCI总线空间与 ...