web页面请求历程

想象一下,当我们在浏览器上输入一个URL地址,到页面呈现出来的过程中,网络上都发生了什么?这个过程绝对很有趣。

现在假设我在校园网内,通过有线接入校园网的一台交换机,开始我的冲浪之旅。下面我将描述自己在冲浪过程中的发现。其中,交换机连接了学校的对外的出口路由器。假设DHCP服务器运行在路由器中。网络拓扑如下:


准备:DHCP、UDP、IP和以太网

首先,为了上网,我必须告诉网络我是谁,只有网络知道我是谁,它才会允许我进入它的家门。所以,我的笔记本首先需要一个IP地址

1) 如果我设置了动态获取IP,那么我的笔记的操作系统将生成一个DHCP请求报文(应用层),并将这个报文放入一个UDP报文段(运输层)注意,是UDP报文段点击打开链接,这个UDP报文段主要携带了:

  • 目的端口67(DHCP服务器的固定端口)
  • 源端口68(DHCP客户端的固定端口)

然后UDP报文段被放入一个IP数据报点击打开链接(网络层),IP数据报添加了以下信息:

  • 源IP地址:0.0.0.0
  • 目的IP地址:255.255.255.255(广播IP目的地址)

2)包含DHCP请求报文的IP数据报将被放入以太网帧点击打开链接(数据链路层),具有如下信息:

  • 目的MAC地址:FF:FF:FF:FF:FF:FF(广播帧)
  • 源MAC地址:我的笔记本的MAC地址xx:xx:xx:xx:xx:xx

3) 包含DHCP请求的广播以太网帧是一个从我的笔记本发送到以太网交换机的帧,该交换机在它的所有出端口广播这个帧,出端口包括连接到路由器的端口(这个很重要)。

4)路由器在它的与交换机直连的端口收到了该广播以太网帧,开始解析该帧,抽取出IP数据报,该数据报的目的IP地址是一个特殊地址(广播IP),因此该数据报应该交付给上层协议处理,因此该数据报的载荷(UDP报文段)被分解向上提交给传输层UDP,传输层中抽取出了DHCP请求报文交付给应用层,因此DHCP服务器便收到了该DHCP请求报文。

5)DHCP服务器为此生成一个DHCP ACK报文点击打开链接,该报文包括以下信息:

  • 分配给DHCP请求的IP地址
  • DNS服务器的IP地址
  • 默认网关的IP地址
  • 子网块(掩码)

DHCP ACK报文被移交给运输层,封装成UDP报文段,再移交给网络层,封装成IP数据报,最后移交给数据链路层,封装成以太网帧;以太网帧的目的MAC地址便是我笔记本的MAC地址,源MAC地址便是接收以太网帧的路由器端口的MAC地址。

6)包含DHCP ACK的以太网帧由路由器发送给了交换机。因为交换机是自学习点击打开链接,并且之前已经收到过了包含DHCP请求的以太网帧,因此记录了我的笔记本的MAC地址,因此它知道向哪个端口转发收到的包含DHCP ACK的以太网帧。

7)当该以太网帧到达我的笔记本时,从协议栈的数据链路层到应用层,层层抽离(从该以太网帧中抽取IP数据报,从IP数据报中抽取UDP报文段,从UDP报文段中抽取DHCP ACK报文),最后得到IP地址、DNS服务器的地址、默认网关。现在我的笔记本已经拿到足以让我开始冲浪的网络配置了。


仍在准备:DNS和ARP

现在开始我要开始打开浏览器,来访问网页了,加入我输入的URL为www.google.com。然后一串网络事件又发生了。我的本本将与google服务器进行通信,我们知道通信是两个进程之间的相互发送报文故事,而且进程是通过套接字(socket)接口向网络发送和从网络接收报文的。

为了生成TCP套接字,需要制定目的主机的IP地址,也就是google.com的IP地址,目前我们只知道www.google.com,也就是只知道域名,为了发送HTTP请求(发送IP数据报),还需要知道google.com的IP地址,因此需要一次域名/IP地址转换,也就是DNS点击打开链接

8)为此,我的本本操作系统生成了一个DNS查询报文,域名www.google.com放在该报文的问题字段中。该DNS报文放在一个具有53号目的端口的UDP报文段中。UDP报文段被放在具有目的IP地址(第5步中DHCP ACK报文返回的DNS服务器IP地址)和源IP地址(我的本本的IP地址:DHCP ACK返回的)的IP数据报中。

9)随后就是对包含DNS请求报文的IP数据报封装成以太网帧。该帧将被发送给我们已经拿到的默认网关路由器。

10)事情看起来好像就可以了,但仔细想想,我们虽然知道了默认网关的IP地址,但是不知道它的MAC地址啊,没有MAC地址,就不能组装以太网帧了。为了我的本本还需要获取该MAC地址。我们知道ARP协议点击打开链接:ARP协议是已知IP地址找MAC地址的协议。因此将经过类似上面的DHCP请求,发送一个ARP查询报文,将该报文放在具有广播目的地址(FF:FF:FF:FF:FF:FF:)的以太网帧中,并向交换机发送该帧,交换机将该帧交付给所连接的设备,包括默认网关路由器。默认网关路由器接收到该帧(其接口的IP地址和ARP查询报文中的目的IP地址一样),因此网关路由器发送ARP回答,包含它的MAC地址,将APR回答放在以太网帧中,其目的MAC地址为我的本本的MAC地址,向交换机发送该帧,再由交换机将该帧交付给我的本本。我的本本接收到包含ARP回答报文的帧,并从ARP回答报文中抽取网关路由器的MAC地址。最终,得到默认网关路由器的MAC地址,这下才可以组装我们的即将发送的以太网帧。

11)得到默认网关的MAC地址后,我的本本就发送了包含DNS查询请求的以太网帧,该帧当然是会达到默认网关,而默认网关发现其目的IP是DNS服务器的IP地址,即根据转发表,向相应的端口转发。

12)经过类似的路由转发,该DNS查询请求的以太网帧进入ISP,在ISP内将使用域内协议(如RIP、OSPF等)和域间协议BGP,最终到达DNS服务器,服务器自下而上得到DNS查询请求报文,得到www.google.com,然后查找DNS源记录,得到对应的IP地址,然后发送一个返回的DNS 响应报文,通过封装成UDP报文段,再到IP数据报,再到以太网帧,最终到达我的本本。然后我的本本就可以正式发起对www.google.com的请求啦,有了IP地址之后,顺利组装以太网帧,发给默认网关。(注意,我们并不需要知道google.com的MAC地址啊,只需要默认网关的)


终于冲浪:TCP和HTTP

13)有了IP地址之后,客户端进程生成TCP套接字,向www.google.com发起HTTP请求。

14)生成套接字时,首先需要与google.com服务器进行TCP三次握手点击打开链接,建立TCP连接。

  • TCP SYN请求报文段:几番周折到达google.com(TCP SYN报文段被放在具有目的IP地址(www.google.com)的IP数据报中,将该数据报放在具有目的MAC地址(默认网关路由器的MAC)的帧中,并向交换机发送该帧。最终包含TCP SYN报文段的数据报到达www.google.com,从数据报中抽取TCP SYN报文并分解到与端口80相联系的欢迎套接字。
  • TCP SYN ACK:来自服务器端的应答(将SYN ACK报文段放入向我的本本寻址的IP数据报中,最后放入链路层帧中。该报文段最终到达我的本本)
  • TCP SYN再次请求,表示我要开始了

15)建立TCP连接之后,就可以开始发送请求了。HTTP GET请求报文段被放入套接字,然后移交给运输层、网络层、数据链路层,经过以太网的路由转发到达google.com服务器。

16)google.com服务器,发送响应报文,blablabla,到达我的本本,然后就有网页显示了。点击打开链接


  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值