5.Web页面请求过程

现在假设我在校园网内,通过有线接入校园网的一台交换机,开始我的冲浪之旅。下面我将描述自己在冲浪过程中的发现。其中,交换机连接了学校的对外的出口路由器。假设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报文段)被分解向上提交给传输层,传输层中抽取出了DHCP请求交付给应用层,因此DHCP服务器便收到了该DHCP请求。

5.DHCP服务器为此生成一个DHCP ACK报文,该报文包括以下信息:

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

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

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

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


仍在准备:DNS和ARP

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

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

8.为此,我的笔记本操作系统生成了一个DNS查询报文,该报文含有如下信息:

  • 域名:www.google.com
  • DNS服务器目的端口:53

9. 随后就是对该运输层报文,经由网络层封装成IP数据报,指定了DNS服务器所在的IP地址;然后封装成以太网帧。该帧将被发送(在链路层寻址)给我们已经拿到的默认网关路由器。

事情看起来好像就可以了,但仔细想想,我们虽然知道了默认网关的IP地址,但是不知道它的MAC地址啊,没有MAC地址,就没有组装以太网帧了。为了我的本本还需要获取网关路由器的MAC地址。我们知道ARP协议:ARP协议是已知IP地址找MAC地址的协议。因此我们需要使用ARP协议。

10.因此将经过类似上面的DHCP请求,发送一个ARP查询报文,最终经过类似的周折,得到默认网关路由器的MAC地址,这下才可以组装我们的即将发送的以太网帧。

仍在准备:域内路由选择到DNS服务器

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的请求啦。(注意,我们并不需要知道google.com的MAC地址啊,只需要默认网关的)

Web客户-服务器交互:TCP和HTTP

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

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

  • TCP SYN请求报文段:几番周折到达google.com
  • TCP SYN ACK:来自服务器端的应答
  • TCP SYN再次请求,表示我要开始了

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

16. google.com服务器,发送响应报文,blablabla,到达我的笔记本,然后就有网页显示了。

猜你喜欢

转载自blog.csdn.net/weixin_39722922/article/details/88788065