一台电脑与学校以太网交换机相连(插上网线了,通过无线连接也一个道理,此处就以经典vLan以太网举例),通过浏览器去下载一个web界面(例如www.google.com)的过程到底发生了什么?
准备:DHCP,UDP,IP及以太网(初始化网络组件)
现在情况:电脑与以太网交换机相连,交换机又与学校路由器相连,学校路由器又与ISP相连。
首先,电脑没有IP就啥也干不了,现在网络边缘的个人主机基本上都是通过DHCP动态获取IP以及其他信息。
电脑的操作系统生成一个DHCP请求报文,并将报文放入具有目的端口67(DCHP服务器)和源端口68(DCHP客户)的UDP报文段,报文段放入一个具有广播IP目的地址的(255.255.255.255)和源IP地址(0.0.0.0)的IP数据报中。
包含DHCP请求报文的IP数据报被放置在以太网帧中。该以太网帧具有目的MAC地址FF:FF:FF:FF:FF:FF,使得该帧广播到与交换机连接的所有设备中(包括与交换机相连的路由器),该帧的源mac地址是电脑的mac地址。
包含DHCP请求的广播以太网帧是第一个由电脑发到以太网交换机的帧,交换机在所有出端口广播入帧,包括连接路由器的端口
路由器收到以太网帧,抽取出IP数据报,该数据报的广播目的地址说明了这个数据报就是应该此路由器处理,不用再转发。IP数据报载荷被分解向上达到UDP,DHCP请求报文从此UDP报文段中抽取出来,此时路由器的DHCP服务器拿到了DHCP请求报文。
运行在路由器的DHCP服务器能以CIDR块(无类别域间路由)分配IP地址。DHCP服务器生成包含这个 IP地址 , DNS服务器IP地址,默认网关路由器的IP地址 和子网掩码的一个DHCP ACK报文。该DHCP报文被放入一个UDP报文段中,UDP报文段被放入一个IP数据报中,数据报再被放入一个以太网帧中。这个以太网帧的源mac地址是路由器连到归属网络时接口的mac地址,目的mac地址是电脑的mac地址。
包含DHCP ACK的以太网帧由路由器发送给交换机。因为交换机是自学习的,并且先前从电脑收到过以太网帧,所以该交换机知道怎么将这个以太网帧发回给电脑。
电脑接受到DHCP ACK的以太网帧,抽取出IP数据报,从IP数据报中抽取UDP报文段,从报文段中抽取ACK报文。个人电脑的的DHCP客户端记录下它的IP地址和DNS服务器的IP地址。还在IP转发表中安装默认网关的地址。以后,电脑会把非所在子网地址的所有数据报发送给默认网关。
仍在准备:DNS和ARP
电脑的操作系统生成一个DNS查询报文,将字符串www.google.com放入DNS报文的问题段中。该DNS报文放入一个具有53号(DNS服务器)目的端口的UDP报文段中。UDP报文段被放入具有DNS服务器IP为目的IP地址的和源IP地址(自己电脑IP)的数据报中。
电脑将包含DNS请求报文的数据报放入一个以太网帧中,该帧将发送到(链路层寻址)默认网关中。但此时个人电脑不知道网关路由器的MAC地址,为了获取网关的MAC地址,个人电脑运行ARP协议。
个人电脑生成一个具有目的地址为默认网关IP的ARP查询报文,将该ARP报文放置在一个具有广播目的地址(FF:FF:FF:FF:FF:FF)的以太网帧中,并向交换机发送该以太网帧,交换机将会广播这个以太网帧。
网关路由器将会接受到该ARP帧,发现其目的IP地址就是自己的IP,于是准备一个ARP回答,指示它的mac与ip地址,并将ARP回答放在一个以太网帧中,目的地址为个人电脑mac地址,并向交换机发送该帧。
个人电脑拿到ARP回答帧,从中抽取网关路由器mac地址
个人电脑终于能使包含DNS查询的以太网帧寻址到网关路由器的mac地址。该以太网帧的目的地址为网关路由器的mac,内部ip数据报的ip目的地址为DNS服务器的IP。交换机拿到该帧后转发给路由器
仍在仍在准备:域内路由选择到DNS服务器
网关路由器接受该帧并抽取包含DNS查询的IP数据报。路由器查找该数据报的目的IP地址,根据其转发表决定该数据报应该发送到哪个相连的路由器。IP数据报放置在链路层帧中,该链路将默认网关路由器连到其他路由器上。
外部路由器拿到该帧,抽取IP数据报,检查目的IP地址,根据其转发表确定出接口,经过该接口向DNS服务器转发数据报。(转发表已根据域内协议如RIP,OSPF以及域间协议BGP配置好)
最终DNS服务器拿到这条DNS查询的IP数据报。抽取出DNS查询报文后,在DNS数据库中查找名字www.google.com,找到对应的IP地址源记录。DNS服务器形成了一个包含这种主机名到IP映射的DNS回答报文,将该DNS回答报文放入UDP报文段中,该报文段放入寻址到个人主机的IP数据报中,反向转发回个人电脑中。
便携机从DNS报文抽取服务器www.google.com的IP地址。个人电脑终于能接触谷歌的服务器!
Web客户-服务器交互:TCP和HTTP
电脑有了google的IP地址后,操作系统生成TCP套接字,该套接字将用于向www.google.com发送HTTP GET报文。生成套接字时必须首先与谷歌服务器中的TCP执行三次握手。电脑首先生成一个具有80目的端口(HTTP)的TCP SYN报文段,该报文段放置在目的地址为默认网关的mac的帧中,并向交换机发送该帧。
如14~16,途经的路由器根据转发表转发该数据报
最终包含TCP SYN的数据报到达www.google.com。从数据报中抽取TCP SYN报文并分解到与端口80(俺寻思此处应有Nginx配置反向代理)相联系的欢迎套接字。对于谷歌HTTP服务器和电脑之间的TCP连接生成一个连接套接字。产生一个TCP SYN ACK报文段。放入一个向个人主机寻址的一个数据报中,最后放入链路层帧中,该链路将www.google.com连接到其第一跳路由器。
包含TCP SYN ACK报文段的数据通过中间路由器最终到达个人主机的以太网卡。数据报在操作系统中分解到步骤18生成的TCP套接字,从而进入连接状态。
借助套接字,个人主机终于可以向www.google.com发送字节了。浏览器生成包含要获取的URL的HTTP GET报文。报文写入套接字,报文段放入数据报,交付到www.google.com
www.google.com的HTTP服务器从TCP套接字读取HTTP GET报文,生成一个HTTP响应报文,将请求的web内容放入HTTP响应体中,发送进TCP套接字中。
包含回答报文的数据报转发回个人主机。浏览器程序从套接字读取HTTP响应,从响应体中抽取Web网页的Html,最终显示Web页面。