本文正在参与 “网络协议必知必会”征文活动
今天说一下我们在浏览器中输入一个网址后,背后都做了哪些事情。
域名解析
我们都知道可以通过IP地址访问一个网站,但是IP地址是一串数字,不便于记忆,所以我们使用域名代替。
但是当我们使用域名访问一个网站时,还是需要通过域名找到对应的IP地址,通过IP地址找到提供数据的服务器。
目前可以访问的网站不计其数,那么如何通过域名找到IP地址呢?
那就是通过DNS找到对应的IP地址。
全世界有13组根域名服务器,存储着所有的域名和IP的对应关系。
每次都需要访问这些服务器就可以找到域名对应的IP地址。但是每天都有大量的流量产生,如果都访问这些服务器就会变的很拥挤。所以就产生了各种镜像服务器和本地缓存。
比较知名的DNS有Google 的“8.8.8.8”,大家应该对这个比较熟悉吧。
当我们在浏览器中访问了一个地址后,此地址的域名对应的IP地址就会被浏览器缓存,等下次使用时就不必访问DNS服务器。另外我们电脑上也有一个特殊的文件。在 Windows 里是“C:\WINDOWS\system32\drivers\etc\hosts”,这个文件保存着自定义的域名和IP对应关系。
我们通过域名找到了IP地址,就可以访问对应的服务器了。
不知道大家有没有碰到这种情况,访问一个网站,但是显示的确实另一个网站的页面。这种情况大部分原因就是DNS被劫持,更改了显示网站的地址。
创建HTTP报文
网站需要显示什么东西呢?我们需要把对应的说明发送给服务器。创建HTTP报文。
构建请求方法、版本、消息实体等,还有一些其他参数。
此处为应用层。
建立TCP链接
有了数据,接下来就需要传输数据了,但是在传输数据之前需要与目的服务器建立连接,也就是TCP三次握手。
-
浏览器首先发送SYN报文给目的服务器,告诉服务器我需要创建一个连接。
-
然后目的服务器收到请求后,会回复SYN+ACK的报文,意思是我知道了,我也给你发送一个请求。
-
浏览器收到目的服务器的回复后,会再次回复目的服务器ACK报文,意思是我收到了。
浏览器和目的服务器建立连接后,就可以传输数据了。
此处为传输层。
根据目的IP寻找目的MAC地址
传输层构建了传输数据的规则,接下来需要网络层找到对方地址,我们之前已经知道目的服务器的IP地址,但是我们还需要知道对方的MAC地址。
我们通过ARP协议,使用IP地址找到对方的MAC地址。
发送数据
以上已经把通讯的道路都打通了,下面就需要传输真正的请求数据了。服务器收到请求后,会把请求转发给对应的应用程序处理。处理完成后再返回给浏览器。浏览器会显示相应的信息。
断开TCP链接
返回请求数据后,需要断开连接,因为已经不需要使用了。也就是四次挥手。
-
浏览器会发送FIN的报文给服务器,意思是我没有数据要发送了。
-
服务器收到后会回复ACK报文给浏览器,意思是我知道了。
-
但这是浏览器单方面的结束,因为有可能服务器还有数据需要传到浏览器,等服务器也没有需要发送给浏览器的数据时,会给浏览器发送FIN报文,意思是我也没有数据需要发送了。
-
浏览器收到后,会回复服务器ACK报文,意思是我也知道了。
以上就是在浏览器中键入一个网址的经过。