从页面输入网址,回车到显示内容,这中间到底经历了什么

写在前面

阿粉在学习计算机网络的内容时,脑子里面突然冒出来一个问题:当我们在一个浏览器界面输入网址,回车到界面显示内容,这中间经历了什么? 先不要往下看,你能想到什么?

下面是我能想到的过程,有可能不是很准确,如有错误之处,还望指出。

计算机网络大体上可以分为应用层,传输层,网络层,链路层和物理层。

当我们在页面输入网址,然后回车到显示内容时,我通过上面的层次依次来说。

详细过程

应用层

假设我们现在要访问 google 网站,那么第一步要做的就是打开浏览器,在地址栏中输入 google 的地址,当你点击回车时,浏览器知道你要访问 google 了,但是对于浏览器来说,这只是一个名字,但是具体在哪儿它是不知道的。比如,你知道某位明星的名字,但是他/她具体的地址在哪儿你不清楚,对吧?对于浏览器来说也是这样。

比较好的一点是,想要访问网站,不像你想见明星那么难。此时浏览器通过 DNS 找到你要访问的具体网站地址。

当然了,如果你想要更准确的找到地址,也可以通过 HTTPDNS 去查找。 通过 DNS 或者 HTTPDNS 现在浏览器拿到了具体的 IP 地址,随后它就开始打包你的请求。对于举的例子来说,你只是想要访问一下,一般使用 HTTP 协议就可以了;如果有些请求会涉及到你的账号密码,就会使用 HTTPS 协议来保证你的数据安全。

传输层

到这里, DNS , HTTP , HTTPS 所在的层称之为应用层。

现在应用层的事情做完了,接下来应用层会将以上相关数据进行封装,经过 Socket 编程,将应用层的包发送给传输层。

如果这个包是使用 HTTP 或者 HTTPS 协议发送过来的,那传输层就会使用 TCP 协议来将数据进行封装;如果是使用 DNS 协议发送过来的,则会使用 UDP 协议来进行封装。

封装完毕之后,浏览器就会将包交给操作系统的网络层。

网络层 + 链路层 + 物理层

这一部分会涉及到网络层 + 链路层 + 物理层,我就不分那么详细了~

网络层的协议是 IP 协议,在 IP 协议中会有源 IP 地址和目标 IP 地址。 源 IP 地址也就是浏览器所在机器的 IP 地址,说的再白点儿就是,假设你是使用电脑浏览器发出的访问请求,这个源 IP 地址就是你的电脑 IP 地址 目标 IP 地址就是你想要访问的网站地址。还记得嘛,在应用层,我们根据 DNS 或 HTTPDNS 已经获取到了想要访问网站的具体 IP 地址。

OK ,既然此时操作系统已经知道了目标 IP 地址,接下来它就会想我怎么根据这个目标 IP 地址找到这台机器呢。首先操作系统会看这个 IP 地址是不是在局域网内,如果是的话,从目标 IP 地址就能看出来。但是很明显,想要访问的 google 地址不在本地,在那触不到的远方。

操作系统知道要访问的地址在远方,但是远方在哪儿它也不知道。所以它就将这个数据包发给网关( gateway ),但是它不知道网关是哪儿台机器,这可咋整。

没事儿,反正大家都在一个地方,吼一嗓子不就得了~所以操作系统就大吼了一声:咱们的网关是谁来着。网关就会回答它,我就是,我在这儿呢。

上面的那一声吼,就是 ARP 协议,通过 ARP 协议,就知道了网关的具体地址,也就是 MAC 地址。

接下来这个数据包就到了网关那里。网关一般就是路由器,到某个 IP 地址怎么走,在一个叫做「路由表」中维护着。

出网关就比较复杂了,这里就不详细说了,具体可以看这篇文章: 想出网关?你需要懂得这些

出了网关之后,就需要拿出源 IP 地址和目标 IP 地址。因为只要出了网关,那就是在外面肉搏,如果没有源 IP 地址和目标 IP 地址,就不知道这个请求是从哪儿发出的,要往哪儿去。

现在这个数据包经过了重重关卡,终于找到了目标 IP 地址所在的服务器。此时服务器会首先发送一个接收请求,然后再将数据包一层层解析,在 TCP 头中含有目标端口号,通过这个端口号,就能够找到哪儿个程序的进程正在监听这个端口号,进而我们就找到了我们想要访问的网页。

但是我怎么知道从我这里发出的数据包有没有丢失呢?所以此时 TCP 层会隔一段时间发送一次,这并不是说,页面又发送了一次请求,只是 TCP 自己在闷头重试,直到收到了接收请求。

在我们找到了想要访问的网页之后,接下来就会像来的时候,再原路返回去。

最后:

没想到吧,一个简单的打开界面,竟然涉及到了这么多的知识~

当然你会发现在你输入网址之后敲回车,页面几乎是立刻出来了,这就涉及到了缓存,再深入讲的话,这篇文章就很长了,如果这篇文章引起了你的兴趣,可以继续向下探究,更欢迎留言讨论

Java Geek Tech wechat
欢迎订阅 Java 极客技术,这里分享关于 Java 的一切。