Web页面请求历程学习

0x00前言

用一张图来大致概述一下

0x01 准备阶段:DHCP、UDP、IP和以太网

1、请求主机上的操作系统生成一个DHCP请求报文,并将这个报文放在具有目的端口67(DHCP服务器)和源端口68(DHCP客户)的UDP报文段

2、该UDP报文段放置在一个广播IP地址(255.255.255.255)和源IP(0.0.0.0)的IP数据报中

3、包含DHCP请求报文的IP数据报被防在以太网帧中,使该帧将广播到交换机连接的所有设备(如果顺利的化也包括DHCP服务器)

4、包含DHCP请求的广播是由请求主机发送到以太网交换机的帧。路由器接受到该广播的以太网帧(包含一个DHCP请求),并且从该以太网帧中抽取出IP数据报后该数据报的载荷(一个UDP报文段)被分解,向上到达DHCP。此时DHCP服务器有DHCP请求报文

5、DHCP服务器为请求主机分配IP地址生成包含IP地址以及DNS服务器的IP地址、默认网关路由器的IP地址、DNS服务器的IP地址和子网块(等价为"子网掩码")的一个DHCP的ACK报文,该DHCP报文被放入一个UDP报文段中,UDP报文被放入一个IP数据报中,IP数据报再被放入一个以太网的帧中。

注意:交换机是自学习的,因此交换机知道寻址到请求主机的MAC地址的帧仅通向请求主机的输出端口转发

6、包含DHCP ACK的以太网帧由路由器发送给交换机。将帧向请求主机的端口转发

7、请求主机收到包含DHCP ACK的以太网帧,从以太网帧中抽取IP数据报,从IP数据报中抽取UDP报文段,从UDP报文段抽取DHCP ACK报文。请求主机的DHCP客户记录下它的IP地址和它的DNS服务器中的IP地址。再起IP转发表中安装默认网关。

此时请求主机已经初始化好它的网络组件,并准备开始处理web网页获取

 

0x02 二次准备阶段:DNS和ARP

请求主机将URL键入其web浏览器,浏览器通过生成一个TCP套接字用于请求的URL发送HTTP请求。因此操作系统因此生成一个DNS查询报文,将URL的字符串放入DNS报文的问题段中

该报文放置再一个具有53号(DNS服务器)目的端口的UDP报文段中和源IP地址的IP数据报中源IP地址为请求主机的IP地址)

8、请求主机将包含DNS请求报文的数据报放入一个以太网帧中。该帧将发送(在链路层寻址)到请求主机的网关服务器。(请求主机将需要使用ARP协议获得该网关路由器的MAC地址)

9、请求主机生成一个具有目的的IP地址的ARP查询报文,将该ARP报文放置在一个具有广播地址目的地址(FF:FF:FF:FF:FF:FF)的以太网帧中,并向交换机发送该以太网帧,交换机将该帧交付给所有连接的设备,包括网关路由器。

10、网关路由器在通往其他网络的接口上接收到包含该ARP查询报文的帧,并发现了ARP报文中目标IP地址匹配其接口的IP地址。网观路由器因此i准备一个ARP回答,指示它的MAC地址对应的IP地址

11、请求主机接受包含ARP回答报文的帧,并回答报文中抽取网关路由器的MAC地址

12、现在请求主机能够使包含DNS查询的以太网寻址到网关路由器的MAC地址

此时,请求主机向交换机发送该帧,交换机将该帧交付给网关路由器

13、网关路由器接受该帧并抽取包含DNS查询的IP数据报。路由器查找该数据报的目的地址

 

0x03 三次准备阶段:域内路由选择到DNS服务器

14、路由器中接收到该帧,抽取IP数据报,检查该数据报的目的地址,并根据其转发表确定出接口,经过该接口朝着DNS服务器转发数据报。

转发表已根据域内协议以及因特网的域间协议BGP所填写

15、最终包含DNS查询的IP数据报到达了DNS服务器。DNS服务器抽取出DNS查询报文,在它的DNS数据库中查找该URL,找到包含对应URL的IP地址的DNS原纪录。该DNS服务器形成一个包含这种主机名到IP地址映射的DNS回答报文,将该DNS回答报文放入UDP报文段中,该报文段放入寻址到请求主机的IP数据报中

16、请求主机从DNS报文抽取URL服务器的IP地址

0x04 Web客户-服务器交互:TCP和UDP

17、请求主机生成TCP套接字向目地URL发送HTTP GET报文。当请求主机生成TCP套接字时,在请求主机中地TCP必须首先于目的URL中地TCP执行三次握手。请求主机因此首先生成一个具有目的端口80的TCP SYN报文段

将TCP报文段放在具有目的URL的IP地址的IP数据报中,将该数据报放置在(网关路由其的MAC地址)的帧中,并向交换机发送该帧

18、路由器朝着URL转发包含TCP SYN的数据报,使用每台路由器中的转发表,由BGP协议决定

19、包含TCP SYN ACK报文段的数据通过各种网络最终到达请求主机的以太网。数据报在操作系统中分解生成TCP的套接字,从而进入连接状态

20、借助于请求主机的套接字,准备向目的URL发送字节,请求主机中的浏览器生成包含要求获取的URL的HTTP GET 报文。HTTP GET 报文则写入套接字,其中GET报文成为一个TCP报文段的载荷。该TCP报文段放置进一个数据报中,并交付到URL里。

21、在<URL>中的HTTP回答报文的数据报通过各种网络转发到达请求主机,请求主机的Web浏览器程序从套接字读取HTTP响应,从HTTP响应中抽取web网页的html,并显示网页

 

至此,一个完整的url请求过程就结束了

 

彩蛋

TCP为什么不能只两次握手

三次握手的目的:消除旧有连接请求的SYN消息对新连接的干扰,同步连接双方的序列号和确认号并交换TCP窗口大小信息

如果发生网络堵塞,由于TCP/IP协议定时重传机制,B向A发送了两次SYN请求,分别是x1和x2,且因为堵塞原因,导致x1连接请求和x2连接请求的TCP窗口大小和数据报文长度不一致,如果最终x1到达A,x2丢失,此时A同B建立了x1的连接,这个时候,因为AB已经连接,B无法知道是请求x1还是请求x2同B连接,如果B默认是最近的请求x2同A进建立连接,此时B开始向A发送数据,数据报长度为x2定义的长度,窗口大小围殴x2定义的大小,而A建立的连接是x1,其数据包长度大小为x1,TCP窗口大小为x1定义,这就会导致A处理数据时出错

 

TCP需要四次挥手的原因

由于TCP的关闭特性,TCP连接是全双工,即数据在两个方向上能同时传递。因此,每个方向必须单独地进行关闭。这个原则就是:当一方完成它地数据发送任务后就能发送一个FIN来终止这个方向上的连接。当一段收到FIN后,它必须通知应用层另一端已经终止了那个方向的数据传送。即收到一个FIN意味着在着一个方向上没有数据流动了。

 

 

Reference

  • 计算机网络自顶向下