输入网址到显示到底经历了什么
用户从输入网址到收到网页,客户端需要发送三次数据:
- DNS域名解析
- 建立TCP/IP连接
- 发送请求网页信息
DNS域名解析
先在浏览器缓存里找(chrome浏览器用chrome://net-internals/#dns
来进行查看)
没有则查找系统缓存(windows系统通过命令行ipconfig /displaydns
可以看到,也可以尝试在C:\WINDOWS\system32\drivers\etc
下,叫hosts.sam
文件里查看域名对应的IP地址)
如果在本机也找不到域名对应的IP地址,就要向DNS服务器进行请求获取。
获取过程为:
首先,客户端在应用层会封装DNS报文到达传输层,在传输层标识源端口和目的端口(源端口号为大于1023的随机数,目的端口号为UDP53端口)和应用层服务标识。传输层封装数据产生数据段传给网络层,在网络层标识源IP地址和目的IP地址(源地址为客户端IP地址,目的IP地址为DNS服务器IP地址),网络层将数据段封装为数据包传送给数据链路层,所以IP地址转换到MAC地址的过程就更清晰了:
-
首先得到IP包需要送达的目的地址IP-des;
-
查路由表,根据匹配 IP-des 的路由表项得到下一跳(next hop)的中间目的地址 ip-next (可以保证 ip-next 是局域网中的地址);
-
在arp缓存中查找 ip-next 对应的mac地址,如果缓存中没有,再到局域网中使用arp协议进行询问;
-
得到了mac地址,一切就好办了——将mac地址放到帧头,发送数据。
由此看出绝不是仅仅ARP那么简单。
在数据链路层,如果ARP缓存没有相关数据,就发送ARP广播请求,等待ARP回应,得到回应后,将IP地址与路由下一跳MAC地址对应的信息写入ARP缓存表。写入缓存后,以路由下一跳地址填充目的MAC地址,在数据包里加入源MAC地址和目的MAC地址(源MAC地址为客户端网卡MAC地址,目的MAC地址为DNS服务器MAC地址)。数据链路层根据客户端和DNS服务器之间的链路,将数据包封装成帧,传给物理层。
物理层将数据帧转化为电信号放到物理介质上进行传递。电信号到达DNS服务器后会从物理层到达应用层,进行刚才的逆过程,即解封装。DNS服务器做完域名解析后再将数据传给客户端,传输过程和客户端发送过程相同。
DNS一般情况下使用UDP通讯,但有两种情况例外:
- 当客户端发出DNS查询请求,从服务器收到的响应报文中的TC(删减标志)比特被置为1时,此时意味着服务器响应长度超过512字节,而仅返回前512字节。在遇到这种情况时,客户端会使用TCP重发起原来的DNS查询请求,它将运行返回的响应超过512字节。
- 2.DNS的主辅名字服务器在同步时使用TCP协议。辅名字服务器一般每3小时向主名字服务器发起查询,看主服务器是否有新的记录变动,如有变动,将执行一次区域传送,区域传送使用TCP协议。
三次握手和请求数据
假设输入的网址已经DNS解析为:1.1.1.1,本机IP地址为2.2.2.2
-
HTTP 层把client 的数据组织好,称为data,调用TCP socket 的连接函数:TCP_connect(1.1.1.1,80)
-
TCP client 触发三次同步握手,协商各自的sequence number,即各自数据第一个字节对应的序列号,这样就可以对发送的每一个字节数据进行编号,方便对方确认;同时还协商window size,告知对方自己最大的接收缓冲区大小,可以用来进行流量控制,免得对方发送太快而本地没有足够缓冲区而丢弃;在TCP option 里告知彼此的MSS,以免引起不必要的IP分片,同时还可能协商SACK,NACK,window scaling ,authentication,分别的作用是减少数据丢包而引起的重传数目,加大window size,对TCP Data 进行完整性保护。
-
调用TCP socket 的发送函数:TCP_send(1.1.1.1,80,data)
-
TCP完成TCP头、TCP payload 所有字段的封装,称之为segment,调用IP接口函数:IP_send(1.1.1.1,segment )
-
IP层检查路由表,决定出口,决定下一跳,通过ARP查询下一跳的MAC,假定为MAC2;然后IP层判定包是否需要分片,如果分片,需要把TCP segment 做切割成小片处理,假定这里不需要分片,于是IP层完成了IP packet 的所有封装,调用 Ethernet_send ( MAC2, packet)。
期间可能经过多个服务器。主要协议有IP、IPX(Internetwork Packet Exchange protocol,互联网数据包交换协议)、RIP(Routing Information Protocol,路由信息协议)、OSPF(开放最短路径优先)等。
-
网络接口、网卡完成所有的封装,加上Ethernet header ,所有信息都知道了,source MAC,这个是自己的MAC,Destination MAC,这个是MAC2,Ether Protocol:0x0800,然后把计算的校验码CRC放入FCS,形成了Ethernet Frame。
-
发连续7个字节preamble:10101010,再发一个字节的SFD:10101011,然后发送Ethernet frame。
the end!
发送回来的网址里,还有很多需要再次请求的网址,都要经历刚才所说的这些过程,查找域名,发送请求,重定向等等。但不像动态页面那样,静态文件会允许浏览器对其进行缓存。有的文件可能会不需要与服务器通讯,而从缓存中直接读取。服务器的响应中包含了静态文件保存的期限信息,所以浏览器知道要把它们缓存多长时间。还有,每个响应都可能包含像版本号一样工作的ETag头(被请求变量的实体值)(在SDWebImage中对旧址新图也有同样的处理方法),如果浏览器观察到文件的版本ETag信息已经存在,就马上停止这个文件的传输。
那么有些网址可能是向CDN发送信息。其实就是内容分发网络,利用内容分发网络 (CDN)分发像图片,CSS表和 JavaScript文件这些静态文件。所以,这些文件会在各地很多CDN的数据中心中留下备份。这种技术可以避开高峰高并发的请求压力,传输数据更快,缓解中心服务器的压力。淘宝双十一就是最好的例子。
拓展:七层模型
下图较为全面的介绍了七层模型:
物理层
它的主要作用是传输比特流(就是由转化为电流强弱来进行传输到达目的地后在转化为,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。
RJ45、CLOCK、IEEE802.3 (中继器,集线器,网关)
数据链路层
封装成帧(帧头mac等,帧尾校验和)、透明传输(数据和帧开始符或结束符冲突,添转义符)、差错检验
PPP、FR、HDLC、VLAN、MAC (网桥,交换机)
网络层
在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。
在实现网络层功能时,需要解决的主要问题如下: 1.寻址:数据链路层中使用的物理地址(如MAC地址)仅解决网络内部的寻址问题。在不同子网之间通信时,为了识别和找到网络中的设备,每一子网中的设备都会被分配一个唯一的地址。由于各子网使用的物理技术可能不同,因此这个地址应当是逻辑地址(如IP地址)。
2.交换:规定不同的信息交换方式。常见的交换技术有:线路交换技术和存储转发技术,后者又包括报文交换技术和分组交换技术。
3.路由算法:当源节点和目的节点之间存在多条路径时,本层可以根据路由算法,通过网络为数据分组选择最佳路径,并将信息从最合适的路径由发送端传送到接收端。
4.连接服务:与数据链路层流量控制不同的是,前者控制的是网络相邻节点间的流量,后者控制的是从源节点到目的节点间的流量。其目的在于防止阻塞,并进行差错检测。
IP、ICMP、ARP、RARP、OSPF、IPX、RIP、IGRP、(路由器)
传输层
该层的主要任务是:向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输。 1.传输连接管理:提供建立、维护和拆除传输连接的功能。传输层在网络层的基础上为高层提供“面向连接”和“面向无连接”的两种服务。 2.处理传输差错:提供可靠的“面向连接”和不太可靠的“面向无连接”的数据传输服务、差错控制和流量控制。在提供“面向连接”服务时,通过这一层传输的数据将由目标设备确认,如果在指定的时间内未收到确认信息,数据将被重发。 3.监控服务质量。
TCP、UDP、SPX
会话层
通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是或者是主机名)。
NFS、SQL、NETBIOS、RPC
表示层
可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如,程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。
表示层的具体功能如下: 1.数据格式处理:协商和建立数据交换的格式,解决各应用程序之间在数据格式表示上的差异。 2.数据的编码:处理字符集和数字的转换。例如由于用户程序中的数据类型(整型或实型、有符号或无符号等)、用户标识等都可以有不同的表示方式,因此,在设备之间需要具有在不同字符集或格式之间转换的功能。 3.压缩和解压缩:为了减少数据的传输量,这一层还负责数据的压缩与恢复。 4.数据的加密和解密:可以提高网络的安全性。
JPEG、MPEG、ASII
应用层
应用层(Application Layer)是OSI参考模型的最高层,它是计算机用户,以及各种应用程序和网络之间的接口,其功能是直接向用户提供服务,完成用户希望在网络上完成的各种工作。它在其他6层工作的基础上,负责完成网络中应用程序与网络操作系统之间的联系,建立与结束使用者之间的联系,并完成网络用户提出的各种网络服务及应用所需的监督、管理和服务等各种协议。此外,该层还负责协调各个应用程序间的工作。
应用层为用户提供的服务和协议有:文件服务、目录服务、文件传输服务(FTP)、远程登录服务(Telnet)、电子邮件服务(E-mail)、打印服务、安全服务、网络管理服务、数据库服务等。上述的各种网络服务由该层的不同应用协议和程序完成,不同的网络操作系统之间在功能、界面、实现技术、对硬件的支持、安全可靠性以及具有的各种应用程序接口等各个方面的差异是很大的。
应用层的主要功能如下: 用户接口:应用层是用户与网络,以及应用程序与网络间的直接接口,使得用户能够与网络进行交互式联系。 实现各种服务:该层具有的各种应用程序可以完成和实现用户请求的各种服务。
FTP、DNS、Telnet、SMTP、HTTP、WWW、NFS
OSI7层模型的小结
由于OSI是一个理想的模型,因此一般网络系统只涉及其中的几层,很少有系统能够具有所有的7层,并完全遵循它的规定。
在7层模型中,每一层都提供一个特殊的网络功能。从网络功能的角度观察:下面4层(物理层、数据链路层、网络层和传输层)主要提供数据传输和交换功能,即以节点到节点之间的通信为主;第4层作为上下两部分的桥梁,是整个网络体系结构中最关键的部分;而上3层(会话层、表示层和应用层)则以提供用户与应用程序之间的信息和数据处理功能为主。简言之,下4层主要完成通信子网的功能,上3层主要完成资源子网的功能。