在浏览器地址栏输入URL,按下回车后究竟发生了什么?

一共六步

浏览器输入域名查询网址,也可以输入ip地址查询网址
得出的内容一样,调用的过程不一样
输入ip地址直接从主机上调用内容,输入域名是通过域名解析服务器指向对应的主机的ip地址,再从主机中调用网址的内容

第一步:浏览器查找域名的IP地址

现在我有一台计算机,通过ISP接入了互联网,那么ISP就会给我分配一个DNS服务器,这个DNS服务器不是权威服务器,而是相当于一个代理的dns解析服务器,他会帮你迭代权威服务器返回的应答,然后把最终查到IP返回给你。

浏览器会把输入的域名解析成对应的IP,这一步就是DNS域名解析,其过程如下:
什么是域名(www.baidu.com中baidu.com就是他的域名)
.net .com

  1. 浏览器先检查自身缓存中有没有被解析过的这个域名对应的ip地址,如果有,解析结束。

  2. 如果浏览器缓存中没有(专业点叫还没命中),浏览器会检查操作系统缓存中有没有对应的已解析过的结果。而操作系统也有一个域名解析的过程。在windows中可通过c盘里一个叫hosts的文件来设置,如果你在这里指定了一个域名对应的ip地址,那浏览器会首先使用这个ip地址。

但是这种操作系统级别的域名解析规程也被很多黑客利用,通过修改你的hosts文件里的内容把特定的域名解析到他指定的ip地址上,造成所谓的域名劫持。所以在windows7中将hosts文件设置成了readonly,防止被恶意篡改。

  • 如果至此还没有命中域名,才会真正的请求本地域名服务器(LDNS)来解析这个域名,这台服务器一般在你的城市的某个角落,距离你不会很远,并且这台服务器的性能都很好,一般都会缓存域名解析结果,大约80%的域名解析到这里就完成了。
  • 如果LDNS(本地域名服务器)仍然没有命中,就直接跳到Root Server 域名服务器请求解析
  • 根域名服务器返回给LDNS一个所查询域的主域名服务器(gTLD Server,国际顶尖域名服务器,如.com .cn .org等)地址
  • 此时LDNS再发送请求给上一步返回的gTLD(主域名服务器)
  • 接受请求的gTLD(主域名服务器)查找并返回这个域名对应的Name Server的地址,这个Name Server就是网站注册的域名服务器
  • Name Server根据映射关系表找到目标ip,返回给LDNS(本地域名服务器)
  • LDNS(本地域名服务器)缓存这个域名和对应的ip
  • LDNS(本地域名服务器)把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程至此结束

第二步:浏览器与目标服务器建立TCP连接

(建立TCP连接就是在服务器端和客户端通道)
1.主机浏览器通过DNS解析得到了目标服务器的IP地址后,与服务器建立TCP连接。
TCP协议是工作在传输层的协议

2.TCP3次握手连接:

  • 当客户端向服务端发起连接时,会先发一包连接请求数据,过去询问一下,能否与你建立连接,这包数据我们称之为SYN包
  • 如果对端同意连接,则回复一包SYN+ACk包
  • 客户端收到之后,回复一包ACK包

连接建立
因为这个工程中互相发送了三包数据,所以称之为三次握手

为什么是三次,而不是俩次

服务端回复完SYN+ACK之后还没有建立连接,就是为了防止因为已失效的请求报文突然又传到服务器引起错误
具体来说,假设采用俩次握手建立连接,
客户端向服务端发送了一个SYN包来请求建立连接,因为某些未知的原因并没有到达服务器,在中间某个网络节点 产生了滞留,为了建立连接,客户端会重新发送SYN包,这次的数据包会送达,服务端回复了SYN+ACK包,之后建立了连接。
但是第一包数据阻塞的网络节点,突然恢复,第一包SYN包又送到服务端,这是服务端会认为客户端又发送了新的连接,从而在俩次握手之后,进入等待数据状态,服务端认为是俩个连接,而客户端认为是一个连接,造成了状态不一致。
如果在三次握手的情况下,服务端收不到最后的ACK包,自然不会认为连接建立成功。
所以三次握手本质上来说就是为了解决网络信道不可靠的问题,为了在不可靠的信道建立起可靠的连接。

第三步:浏览器通过http协议发送请求

http协议是建立在tcp/ip协议之上的,tcp保证连接通畅,http就可以正常的进行请求和响应了。首先http请求是一个无状态的请求,且只能由浏览器主动发起,服务器进行响应。
浏览器发送请求的报文会携带以下信息:

  • 请求路径
  • 查询参数
  • 请求方法
  • 请求头
  • 请求体

第四步:服务器接收请求并作出响应

服务器执行完逻辑之后,需要给浏览器响应内容(无论是要从服务器获取数据,还是在服务器做了什么操作,都需要给浏览器一个响应)
响应一般包含以下几部分

  • 状态码
  • 状态文本
  • 响应头
  • 响应体
    服务器响应的同时肯定会伴随着浏览器端接收,等浏览器端彻底接收完毕之后,TCP就要进行4次挥手,并断开连接了。

第五步:TCP断开连接

不需要再发送消息了
处于连接状态的客户端和服务端,都可以发起关闭连接请求
TCP链接的断开需要经过"四次挥手",那么就需要一方主动的释放另外一方被动的释放。大体的过程如下:(假设客户端主动发起连接关闭请求)

  • 他需要向服务端发送一包FIN包,表示要关闭连接,自己进入终止等待1状态,这是第一次挥手

  • 服务端收到FIN包,发送一包ACK包,表示自己进入关闭等待状态,客户端进入种植等待2状态,这是第二次挥手

    服务端此时还可以发送未发送的数据,而客户端还可以接收数据

  • 待服务端发送完数据之后,发送一包FIN包,进入最后确认状态,这是第三次挥手

  • 客户端收到之后,回复ACK包,进入超时等待状态,经过超时时间后关闭连接,而服务端收到ACK包后立即关闭连接,这是第四次挥手

第四次挥手为什么会有超时等待时间

这是为了保证对方已收到ACK包,因为假设客户端发送完最后一包ACK就释放了连接,一旦ACK在网络中丢失,服务端将一直停留到最后确认状态 ,如果客户端发送最后一包ACK包后,等待一段时间,只是服务器因为没有收到ACK会重新发送FIN包,客户端会响应这个FIN包 重发ACK包并刷新超时时间。和三次握手一样也是为了保证在不可靠的信道建立起可靠的连接

第六步:浏览器解析资源并显示页面

当浏览器接收到服务器响应的资源后,会对资源进行解析。
在浏览器没有完整接受全部HTML文档时,它就已经开始显示这个页面了,浏览器接收到返回的数据包,根据浏览器的渲染机制对相应的数据进行渲染。渲染后的数据,进行相应的页面呈现和脚步的交互。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值