在浏览器输入url(即网址)后,会发生什么?
这是一个面试被问烂的问题,今天结合《自顶向下方法》这本书来总结一下。
如图,某台主机想要访问www.goolge.com,在输入url后,会发生什么?
分析如下:
要访问该url的内容,就要生成TCP套接字,然后发送HTTP报文。所以,我们需要获取主机的IP地址,谷歌网站的IP地址以及路由器的MAC地址。
解答如下:
//利用DHCP获取主机IP地址
1.主机上的操作系统生成一个DHCP请求报文,将这个报文放入具有目的端口号67(DHCP服务器)和源端口号68(DHCP客户)的UDP报文段。这个UDP报文段被放置在一个具有广播IP目的地址(255.255.255.255)和源IP地址(0.0.0.0)的数据报中(因为主机还没有被分配IP地址)。
2.DHCP请求报文被封装成帧,传输到交换机,这个帧的目的MAC地址为FF:FF:FF:FF:FF:FF,接下来,交换机将这个帧广播到所有与交换机相连的设备,包括路由器。
3.路由器的MAC地址为00:22:6B:45:1F:1B(如图所示),路由器接收到该帧后,从帧中抽取出IP数据报,IP数据报的目的地址表明该IP数据报应该由该节点的高层协议处理,因此该数据报的载荷(即UDP报文段)被分解,向上到达UDP。这时,DHCP请求报文被抽取出来,DHCP服务器有了DHCP请求报文。
4.此时,DHCP服务器为主机生成一个IP地址,同时,它也生成DNS服务器的地址,路由器的IP地址和子网块(即图中掩码)的DHCP ACK报文。这个DHCP报文被放入UDP报文段中,封装成帧。这个帧的源MAC地址是00:22:6B:45:1F:1B,目的MAC地址是主机的MAC地址(如图所示)。
5.接下来,包含DHCP ACK的帧由路由器发给交换机,由于交换机是自学习的,之前从主机收到帧,所以该交换机知道应该向通向主机的输出端口转发。
6.主机收到帧后,逐层抽取,最后取出DHCP报文。主机的DHCP客户则记录下它的IP地址和它的DNS服务器的地址。
//获取谷歌的IP地址
7.主机的操作系统生成DNS查询报文,将字符串www.google.com放入DNS报文段中。该DNS报文放置在一个具有53号(DNS服务器)目的端口的UDP报文段中。该UDP报文段的目的IP地址即为第4步中发给主机的DNS服务器地址,源IP地址即为主机的IP地址。
8.同样封装成帧,但此时并不知道路由器的MAC地址,为了获取路由器MAC地址,需要ARP。
9.主机生成ARP查询报文,放在具有广播目的地址(FF:FF:FF:FF:FF:FF)的帧中,交换机向与其相连的所有设备发送该帧,包括路由器。
10.路由器发现68.85.2.1匹配其接口的IP地址,查ARP表,获取其MAC地址。然后路由器发送ARP回答,封装成帧,送给交换机,交换机再发给主机。此时,便获得了路由器的MAC地址。
11.接下来,主机就可以发送DNS查询报文了。Comcast网络中最左边的路由器收到该帧,抽取IP数据报,检查目的地址,根据其转发表确定发送给哪一接口。
12.DNS服务器收到DNS查询报文,将其抽取,在权威DNS服务器缓存中(假设它在缓存里)查找www.google.com对应的IP地址,发送DNS回答报文,放入UDP报文段中,发送给主机。主机便知道了www.google.com的IP地址。
//TCP连接的建立
13.在主机生成套接字时,主机中的TCP必须先与www.google.com中的TCP执行三次握手。TCP连接建立完毕。
14.此时,主机发送HTTP GET报文,写入套接字,封装成帧,按照上面的步骤发送。
15.www.google.com的HTTP服务器从TCP套接字中读取HTTP GET报文,生成HTTP响应报文,将请求的Web页面的内容放入HTTP响应体中,并将报文写入套接字。
16最后,主机的Web浏览器程序从套接字读取HTTP响应,从HTTP中抽取Web网页的HTML,最终显示出了Web网页。