Fork me on GitHub

Web页面请求过程

转自: https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/计算机网络.md#web-页面请求过程

DHCP配置主机信息
  • 假设主机最开始没有IP地址以及其他信息,那么就需要先使用DHCP来获取;
  • 主机生成一个DHCP请求报文,并将这个报文放入具有目的端口67和源端口68的UDP报文段中;
  • 该报文段则被放入在一个具有广播IP目的地址(255.255.255.255)和源IP地址(0.0.0.0)的IP数据报中;
  • 该数据报则被放置在MAC帧中,该帧具有目的地址FF:FF:FF:FF:FF:FF,将广播到与交换机连接的所有设备;
  • 连接在交换机的DHCP服务器收到广播帧之后,不断向上分解得到IP数据报、UDP报文段、DHCP请求报文,之后生成DHCP ACK报文,该报文包含以下信息:IP地址、DNS服务器IP地址、默认网关路由器的IP地址和子网掩码。该报文被放入UDP报文段中,UDP报文段又被放入IP数据报中,最后放入MAC帧中;
  • 该帧的目的地址是请求主机的MAC地址,因为交换机具有自学习能力,之前主机发送了广播帧之后就记录了MAC地址到其转发接口的交换表项,因此现在交换机就可以直接知道应该向哪个接口发送该帧;
  • 主机收到该帧后,不断向上分解得到DHCP报文。之后就配置它的IP地址,子网掩码和DNS服务器IP地址,并在其IP转发表中安装默认网关.
ARP解析MAC地址
  • 主机通过浏览器生成一个TCP套接字,套接字向HTTP服务器发送HTTP请求。为了生成该套接字,主机需要知道网站的域名对应的IP地址。
  • 主机生成一个DNS查询报文,该报文具有53端口,因为DNS服务器的端口号时53;
  • 该DNS查询报文被放入目的地址为DNS服务器的IP数据报中;
  • 该IP数据报被放入一个以太网帧中,该帧将发送到网关路由器;
  • DHCP过程只知道网关路由器的IP地址,为了获取网关路由器的MAC地址,需要使用ARP协议;
  • 主机生成一个包含目的地址为网关路由器IP地址的ARP查询报文,将该ARP查询报文放入一个具有广播目的地址(FF:FF:FF:FF:FF:FF)的以太网帧中,并向交换机发送该以太网帧,交换机将该帧转发给所有的连接设备,包括网关路由器;
  • 网关路由器接收到该帧后,不断向上分解得到ARP报文,发现其中的IP地址与其接口的IP地址匹配,因此就发送ARP回答报文,包含了它的MAC地址,发回给主机。
DNS解析域名
  • 知道了网关路由器的MAC地址之后,就可以继续DNS的解析过程了;
  • 网关路由器接收到包含DNS查询报文的以太网帧后,抽取出IP数据报,并根据转发表决定该IP数据报应该转发的路由器;
  • 因为路由器具有内部网关协议(RIP、OSPF)和外部网关协议(BGP)这两种路由选择协议,因此路由表中已经配置了网关路由器到达DNS服务器的路由表项;
  • 到达DNS服务器后,DNS服务器抽取出DNS查询报文,并在DNS数据库中查找待解析的域名;
  • 找到DNS记录之后,发送DNS回答报文,将该回答报文放入UDP报文段中,然后放入IP数据报中,通过路由器反向转发回网关路由器,并经过以太网交换机到达主机。
HTTP请求页面
  • 有了HTTP服务器的IP地址,主机就能够生成TCP套接字,该套接字将用于向Web服务器发送HTTP GET报文;
  • 在生成TCP套接字之前,必须先与HTTP服务器进行三次握手来建立连接。生成一个具有目的端口80的TCP SYN报文段,并向HTTP服务器发送该报文段;
  • HTTP服务器接到该报文段之后,生成TCP SYN ACK报文段,发回给主机;
  • 连接建立之后,浏览器生成HTTP GET报文,并交付给HTTP服务器;
  • HTTP服务器从TCP套接字中读取HTTP GET报文,生成一个HTTP响应报文,将Web页面内容放入报文体中,发回给主机;
  • 浏览器收到HTTP响应报文后,抽取出Web页面内容,之后进行渲染,显示Web页面。
-------------本文结束感谢您的阅读-------------