输入一个网站,从输入到回车再到响应是怎样一个过程?
(1)DHCP配置主机信息
假设主机最开始没有ip地址与其他信息,则首先要通过DHCP协议来获得IP地址,其整个过程是这样的:
   A:主机生成一个DHCP报文,由于DHCP协议是应用层的协议,所以这个报文段必须包含源ip,目标ip,源端口,目标端口,自己的MAC地址,下一跳的MAC地址,所以主机会根据这些信息配置数据包,首先源ip由于还没有从DHCP服务器获得,所以只能写0.0.0.0,目标IP(即DHCP服务器的IP)也没有获得,所以只能写255.255.255.255,当做广播包发出去,源MAC地址就写自己的MAC地址,下一跳的MAC地址也不知道,所以就写FF::FF::FF::FF::FF::FF,源端口68,目标端口是67,并将此广播包发送到与交换机连接的所有设备。连接在交换机的DHCP服务器收到DHCP报文后,知道有主机想要获得IP地址,就给他回一个DHCP的报文,告诉它分配的IP地址是多少,DNS服务器的ip地址是多少,默认网关路由器的IP地址是多少还有子网掩码,因为交换机具有自我学习能力,之前主机发送了广播包之后就记录了MAC地址到其转发接口的交换表项,因此交换机就可以直接知道应该向哪个接口发送该包。
(2)ARP解析MAC地址
   现在我知道本机的ip地址,网关的ip地址,源MAC地址,下一跳的MAC地址(即网关的MAC地址)未知,源端口,目的主机的端口(这些都是协议里规定的),所以下一步应该是获取下一跳即网关的MAC地址,由于我已经知道了网关服务器的ip地址,那么从ip向MAC地址转换是用ARP协议,由于ARP协议是网络层的协议,所以它只需要四个信息即源ip,目标ip,源MAC,下一跳的MAC地址,这里下一跳的MAC地址即使我们要寻找的网关服务器的MAC地址。现在开始做包,源ip为刚才DHCP服务器给我分配的IP地址,目标IP是刚才DHCP服务器给我还回的网关服务器的IP地址,源MAC地址是我自己的MAC地址,下一跳的MAC地址我写FF::FF::FF::FF::FF::FF,然后将这个包广播发送出去,网关服务器收到这个包之后发现有人在询问它的MAC地址,就给它回一个ARP报文,告诉它网关服务器的MAC地址是多少。
(3)DNS解析域名
   现在我们知道了源IP,源端口,目标端口,源MAC,下一跳的MAC,尚缺目标IP,现在我是知道域名的,那么由域名到IP是用什么协议呢?当然是DNS协议,由于在(1)中我已经知道了DNS服务器的IP地址,所以现在开始做包,源IP是自己被分配的IP地址,目标IP是DNS服务器的IP地址,源端口是自己的端口,目标端口是53(DNS协议的端口),源MAC是自己的MAC,目标MAC是下一跳的MAC地址,然后把这个DNS包发送出去。
     DNS的过程也十分有趣,首先,浏览器会检查自身缓存,看看有没有解析过这个域名对应的ip地址,如果有解析完成。如果没有(专业点叫命中),会去询问操作系统,例如windows系统中有个hosts文件,来记录指定的域名对应的ip地址,如果在这里仍然没有命中,就会去询问本地域名服务器,这个本地域名服务器一般在你的城市附近,不会太远,一般80%的查询到这里也就结束了,如果还没命中,就直接跳到Root Server也就是根域名服务器请求解析,如果还没命中,根域名服务器会还回给本地域名服务器主域名服务器的地址,此时本地域名服务器再发送请求给上一步还回的主域名服务器,接受请求的主域名服务器查找并还回这个域名对应的Name Server,这个Name Server就是网站注册的域名服务器,Name Server根据映射表找到目标IP,还回给主域名服务器,主域名服务器会记录这个域名和对应的IP,主域名服务器把解析的结果还回给用户,用户根据TTL值缓存到本地系统,域名解析到处结束。
(4)HTTP请求页面
  首先通过三次握手,建立TCP连接。三次握手的建立过程如下:
  首先,服务端处于listen状态,客户端A向服务端B发送一个请求报文,SYN=1,ACK=0,选择一个初始序列号为x,B收到这个连接请求,如果同意建立连接,向A发送连接确认报文,SYN=1,ACK=1,确认号为x+1,同时也选择了一个初始的序列号为y,A收到B的连接确认报文后,还要向B发送确认,确认号为y+1,序号为x+1,B收到A的确认后,建立连接。
  然后就是通过http请求进行愉快的交流了。