当在浏览器输入网址的时候,发生了什么?为什么会得到返回的信息——个人记录

当在浏览器输入网址的时候,发生了什么?为什么会得到返回的信息

当我在浏览器输入heatao.com的时候,浏览器首先检查浏览器和操作系统的dns缓存,希望得到一个IP地址,如果没有的话,则向DNS服务器请求查询。

这里DNS服务器是一个递归查询的过程,比如我目前连接路由器使用无线网,则首先向路由器设置的DNS服务器请求->

此DNS服务器再检查自己的缓存,有就返回结果,没有则向上层的DNS请求->…

最后可以到根服务器请求.com的权威DNS服务器->

则递归DNS服务向heatao.com所使用的权威DNS服务器查询得到解析并缓存

递归DNS服务器向浏览器返回结果,查询结束->

「递归DNS服务器」就是公众DNS服务器,你在电脑或路由器设置的,比如运营商的DNS服务器或者114DNS服务器这种。

「根服务器」就是大名鼎鼎的13个根服务器那个。

「.com的权威DNS服务器」就是记录各个.com的域名所使用的「网站所使用的权威DNS服务器」的地方。归这个根域名的注册局管理。(别的根域名也有自己的权威DNS服务器)

「网站所使用的权威DNS服务器」就是网站的权威DNS服务器,记录网站的DNS记录的地方,你可以看看DNSPod。

from

IP和端口

端口代表着运行的进程,虽然IP可以标志服务器位置,即在互联网的地址,但运行在设备上有多个进程,为了找到对应的进程服务,则需要端口。

这里转载一篇说明。

在网络中只能使用IP地址进行数据传输,所以在传输以前,需要把域名转换为IP,这个由称作DNS的服务器专门来完成。 所以在网络编程中,可以使用IP或域名来标识网络上的一台设备。 为了在一台设备上可以运行多个程序,人为的设计了端口(Port)的概念,类似的例子是公司内部的分机号码。规定一个设备有216个,也就是65536个端口,每个端口对应一个唯一的程序。每个网络程序,无论是客户端还是服务器端,都对应一个或多个特定的端口号。由于0-1024之间多被操作系统占用,所以实际编程时一般采用1024以后的端口号。 下面是一些常见的服务对应的端口:

ftp:23,telnet:23,smtp:25,dns:53,http:80,https:443

使用端口号,可以找到一台设备上唯一的一个程序。 所以如果需要和某台计算机建立连接的话,只需要知道IP地址或域名即可,但是如果想和该台计算机上的某个程序交换数据的话,还必须知道该程序使用的端口号。

from

值得一提的是,一个端口只被一个进程占据,一个进程可以占据多个端口,不可通过IP地址+端口号可以唯一确定网络上的进程,见车小胖

对于macOS,可以直接在“活动监视器”查看不同进程对应的IP,在抓包的时候用于筛选纯净流量。

回到正题

得到了对方的服务器IP地址之后,浏览器通过TCP协议和对方进行三次握手,建立可靠虚拟通道,如果单纯输入heatao.com,则默认是 http://heatao.com ,如果heatao.com采用的是https协议,则浏览器前往 https://heatao.com ,过程与之前一样。

三次握手成果后,则不单纯用TCP协议,而是采用TLS协议传输,TLS在传输层和应用层之间,即TLS对HTTP的内容进行了加密,再放到TCP中,TCP是流式传输,不在乎其上运载的是什么,而单纯捕获TCP也不知道其TLS信息,因为不需要TLS不需要每个TCP包都带有头部信息。

一般在wireshark里面显示TLS,是根据sport或dport其中有一个是443。

关于TLS,还涉及到“数字证书”,“CA”,“加密”,“证书链”等,这里不展开。

后面的事情是,HTTP请求返回的HTML返回浏览器,有gzip会先压缩,得到HTML,Javascript,CSS等等,然后浏览器解析HTML文件构建DOM树,然后解析CSS文件构建渲染树,等到渲染树构建完成后,浏览器开始布局渲染树并将其绘制到屏幕上。

简单一瞅

在浏览器输入url的时候,可以右键-检查,点击netwrok,看到请求的header和response。

参考:

在浏览器地址栏输入一个URL后回车,背后会进行哪些技术步骤?车小胖的回答拟人虽然好理解,但是不能与细节对应

当你在浏览器输入 baidu.com 并按下回车后发生了什么?

从输入 URL 到页面加载完成的过程中都发生了什么事情?

初识网络原理: 从浏览器地址栏输入 URL 到页面渲染之间都经历了什么非常好的答案,其中还有渲染的动图