一次完整的HTTP请求

采用自顶向下的方式,从最基础的协议入手,分析其流程,然后将多个协议联合起来,分析其整体流程,最终分析一次HTTP请求的完整过程。背景是Bob用笔记本刚连网,并通过浏览器访问www.google.com
请从DHCP的内容开始追踪一次完整的HTTP请求的过程

参考《计算机网络 自顶向下方法》

层次 协议 设备
应用层 DHCP,HTTP,DNS,FTP STMP,POP,FTP,Telnet 浏览器
传输层 TCP,UDP
网络层 IP,ICMP 路由器
链路层 PPP 交换机?
物理层

应用层

DHCP

动态主机配置协议(dynamic host configuration protocol),基于UDP,目的给主机动态分配IP地址。因为UDP轻量级,快速。目的是找到DHCP服务器并请求服务器给一个IP。DHCP服务器其实属于路由器的一部分。

  1. Bob客户端(浏览器)生成一个DHCP报文,并把这个报文放入源端口是68、目的端口是67(DHCP服务器)的UDP报文段中。然后将该UDP报文封装到IP报文中,其目的IP地址是255.255.255.255(广播地址),源IP地址0.0.0.0,因为客户端还没有IP。
  2. 将IP数据包放入以太网帧,带有目的地址FF.FF.FF.FF.FF.FF,这也是广播地址,源帧是源主机的MAC地址(00:16:D3:23:68:8A)。这样这个帧就能广播到与交换机连接的所有设备。当然,目的是传到DHCP服务器中。
  3. 假设路由器在MAC地址为00.22.6B.45.1F的接口收到了这个广播帧,这个帧首先被抽取出IP数据报,然后将该数据报进行多路分解为UDP,交给对应的UDP套接字,最后就可以从该UDP报文取出DHCP请求报文。
  4. 现在轮到路由器中的DHCP服务器分配IP地址,假设DHCP服务器能以CIDP块68.85.2.0/24,选择分配的地址是68.85.2.101。DHCP服务器将所分配的IP地址、DNS服务器ip地址、路由器ip地址、子网掩码都一起打包成ACK报文。然后这个DHCP报文打包成UDP,再打包成IP数据包,最后放入以太网帧中。这个帧的源地址就是路由器出口的MAC地址,目的地址就是客户端的MAC地址。
  5. 这个返回的以太网帧由路由器发给交换机,因为交换机是自学习的,所以根据目的MAC地址(源客户端MAC地址)就可以知道输出端口。
  6. 客户端收到了返回的以太网帧,取出IP数据报,再取出UDP报文段,最后得到DHCP ACK报文。这样客户端就知道了它的IP地址和DNS服务器的地址,并设置好默认网关(68.85.2.0/24)

下一步看DNS

HTTP

HTTP协议(HyperText Transfer Protocol,超文本传输协议),端口为80,基于TCP。关注一下request、response报文格式,长连接,https、response status。

  1. Bob的笔记本收到了www.google.com的ip地址,它能够生成TCP套接字,该TCP套接字用于向www.google.com发送HTTP GET报文。下面请看TCP
  2. Bob主机与www.google.com已经握手两次,现在Bob的浏览器生成HTTP GET报文,将其写入TCP报文段,然后写入目的ip地址为www.google.com的ip数据报,写入链路层帧,最终发送到www.google.com。(只需要知道目的的ip地址,然后根据路由转发表即可知道目的mac地址)
  3. www.google.com的HTTP服务器从TCP套接字中读取到HTTP GET报文,生成一个HTTP响应报文,将请求的Web页内容放入HTTP响应体,并将该报文写入TCP套接字,然后写入目的ip的Bob主机ip的ip数据报中,最后写入帧。最终,发送给给Bob笔记本。
  4. Bob笔记本的web浏览器从套接字中读取HTTP响应,从响应体重抽取web页面的html,并最终!显示了Web页面。到此一次HTTP请求的完整过程走完!

传输层

TCP

  1. 当根据目的ip地址和端口号生成TCP套接字时,Bob笔记本的TCP必须首先与www.google.com中的TCP进行三次握手。Bob笔记本因此生成一个具有目的端口80的TCP SYN报文,将该TCP报文段放入具有目的ip地址64.233.169.105(www.google.com)的ip数据报中,将该ip数据报放入目的MAC地址为网关路由器的以太网帧中,并向交换机发送该帧。
  2. 该帧经过链路层、路由器中的转发,最终发送到www.google.com的服务器。从数据报中抽取出TCP SYN报文并分解到与端口80相联系的欢迎套接字,产生一个TCP SYNACK 报文段,将其放入目的ip为Bob笔记本ip的数据报,最后放入链路层帧中,发送回Bob笔记本。
  3. Bob主机收到TCP SYNACK报文段,在操作系统将其分解为TCP套接字,进而进入连接状态。

下面回到HTTP

UDP

网络层

DNS

域名系统DNS(domain name system)是因特网使用的命令系统。将主机名(www.google.com)转化为机器处理的ip地址,基于UDP,端口为53。

客户端Bob将www.google.com输入浏览器,浏览器生成一个TCP套接字,套接字用于发起HTTP请求。为了知道www.google.com的ip地址需要经过DNS。

  1. Bob的笔记本的操作系统生成一个DNS查询报文,该报文放在一个具有53目的端口号的UDP报文段中,目的ip是68.87.71.226(在前面的DHCP过程中得到DNS服务器的ip),源ip是68.85.2.101(DHCP分配给Bob笔记本的ip)
  2. 将上面的UDP报文放入一个以太网帧中,该帧将在链路层寻址,发送到Bob所处的网关路由器。在上一轮的DHCP中,我们只知道了网关路由器的ip却不知道其mac地址。因此还要用到ARP。请看ARP相关内容。
  3. 到此,已经得到网关路由器的mac地址。Bob的笔记本现在能够把包含DNS查询报文的以太网帧通过链路层寻址发送到网关路由器。目的ip是68.87.71.226(DNS服务器),目的mac地址00.22.68.45.1F.1B(网关路由器)
  4. 网关路由器接收到该帧,并抽取包含DNS查询报文的ip数据报,路由器查找该数据报的目的地址(68.87.71.226),并查路由转发表知道DNS服务器的路由器网关mac地址,然后将该数据报放入以太网帧中,再发送给DNS服务器的路由器网关。DNS服务器的路由器网关收到该帧,抽取出ip数据报,查到目的ip地址,根据路右转发表知道将该数据报发给哪个主机,然后经过某个接口发送给DNS服务器。
  5. 本地DNS服务器收到了包含DNS查询的ip数据报,本地DNS服务器抽取出DNS查询报文,在它的DNS数据库中查到名字www.google.com,假设本地DNS服务器中有缓存到其ip地址,那么DNS服务器就生成一个包含这个主机名->ip地址映射的DNS回答报文。将该报文放入UDP报文段中,再放入ip数据报,目的ip是Bob主机的ip,然后发送回Bob。(如果本地DNS服务器没有,则请看下面####域名服务器的内容)

下一步请看HTTP

域名服务器

分类:根域名服务器、顶级域名服务器、授权域名服务器、本地域名服务器。

  1. 根域名服务器:存储着顶级域名服务器的IP地址,比如.com .cn .net这些顶级域名服务器。
  2. 顶级域名服务器:其域名可为dns.com,dns.cn等等。通过查询顶级域名服务器,可以知道google.com这个授权域名服务器的ip地址。
  3. 授权域名服务器:其域名可为dns.google.com。通过查询授权域名服务器,可以知道www.google.com的主机ip地址,这样浏览器就知道要访问的ip地址。

ARP

无论网络层使用什么协议,在实际网络的链路上传输数据帧时,最终都必须用到mac地址(硬件地址)。ARP(address resolution protocol 地址解析协议)的作用就是通过ip地址找出mac地址。每个主机上有一个ARP高速缓存,存放本局域网上各主机和路由器的ip地址到mac地址的映射,称做ARP表,路由路由映射表。

  1. Bob的笔记本生成一个具有目的ip地址68.85.2.1(默认网关)的ARP查询报文,将该报文放入目的mac地址为广播地址的以太网帧中,并向交换机发送该帧。交换机会把该帧发送到所有连接的设备,包括网关路由器。
  2. 网关路由器接收到了该ARC查询报文的帧,发现该ARP报文中目的ip地址68.85.2.1匹配器接口的ip地址。网关路由器因此准备一个ARP回答报文,内容表明mac地址00.22.6B.45.1F.1B对应的ip地址是68.85.2.1。它将该ARP回答放入一个以太网帧中,目的mac地址就是Bob的笔记本mac地址,然后交给交换机,交换机再发送给Bob的笔记本。
  3. 由于交换机是自学习的,它看到Bob笔记本的mac地址就知道该发送到哪个接口。现在Bob笔记本就知道了网关路由器的mac地址。

请回到DNS

路由器

所谓路由,一般是一个局域网和一个广域网的连接处。如果仅仅一个IP地址,就无法实现和两个网络的连接。所以,路由器至少有两个IP地址,一个是内网的(就是你说的常用的192.168.1.1),另一个是外网的地址(既WAN口的IP地址,这一般由ISP动态分配每次拨号启动都重新分1个)。一般家用路由器默认DHCP IP地址从192.168.1.100 往后分配。路由器就是DHCP服务器

CIDR

CIDR(无类别域间路由,Classless Inter-Domain Routing)

子网掩码

子网掩码与IP地址做与运算,如果结果是一样的,那么这两个IP是属于同一个子网的。

最小IP:主机ID不能全为0,全为0表示网络ID

最大IP:主机ID不能全为1,全为1表示本地广播

小结

本文走完了一次HTTP请求,阐述了相关重要协议在这次请求中的运作,对于BGP、PPP等协议尚未阐述。

posted @ 2019-03-12 17:47  左耳东白水泉  阅读(430)  评论(0编辑  收藏  举报