学习目标:
目标:掌握网络知识
学习内容:
本文内容:详解浏览器输入一个URL之后,都发生了什么
文章目录
1.前置知识
想要了解浏览器输入一个URL之后都发生了什么,我们要先认识以下几个知识
1.1 TCP/IP五层模型
在这里简单介绍一下TCP/IP的五层模型
TCP/IP是一组协议的代名词,他还包括许多协议,组成了TCP/IP协议簇
TCP/IP通讯协议采用了5层 的层次结构,每一层都呼叫他的下一层所提供的的网络来完成自己的需求,主要分为一下五层
- 物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞 线)、早期以太网采用的 的同轴电缆(现在主要用于有线电视)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理 层.
- 数据链路层: 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网 线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校 验等工作. 有以太网、令牌环网, 无线LAN等标准. 交换机(Switch)工作在数据链路层.
- 网络层: 负责地址管理和路由选择. 例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层.
- 传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机 发送到目标主机.
- 应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等.
1.2 DNS协议
什么是DNS协议?
DNS(域名系统)协议是一个应用层协议,可以将域名和IP地址相互映射的以层次结构分布的数据库系统,简单来说就是域名和ip之间相互转换的协议。
什么是域名?
比如www.baidu.com ,就是我们经常用的百度的域名,域名主要是为了人们方便记忆而设置的,而在网络传输中,是通过ip寻找主机的而不是域名,所以每一个域名都会对应一个ip ,我们可以通过ping的方式来获取到域名对应的ip:
其中14.215.177.38就是百度的域名对应的ip地址,ping 的时候使用ip地址和使用域名会有同样的效果
1.3 ARP协议
地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址(MAC);收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
1.4 NAT技术
NAT是路由器使用的一种技术,NAT能够将私有ip对外通信是转为全局ip,也就是一种将私有ip和全局ip相互转换的一种技术,可以很好地解决ip地址数量不够的问题。
对于NAT还存在着一个问题,就是当同一局域网内,有多个主机都访问同一外网服务器,那么对于服务器返回的数据中,目的ip都是相同的,那么NAT路由器如何判断这个数据包发送给局域网的那个主机?
为了解决这个问题又有了新技术就是NAPT技术,NAPT技术使用ip+端口来建立这个关联关系
2. 输入URL,发送请求流程
2.1域名解析
在浏览器输入一个URL之后,第一步就是基于DNS域名转IP协议获取到请求的IP也就是目的IP
2.2封装
得到了目的IP之后,就要对请求的数据进行封装,封装是时从上到下进行封装,封装的顺序就是应用层、传输层、网络层、数据链路层、物理层
- 应用层:
当发送一个请求时,第一步封装就是在应用层,在应用层中,会根据应用层的HTTP协议将请求封装成HTPP格式,然后将封装好的数据交给传输层进一步封装 - 传输层:
传输层得到应用层封装好的数据之后,传输层基于TCP协议进一步封装,在原有的数据中加上源端口和目的端口,然后发送给网络层 - 网络层:
网络层得到传输层的数据之后,基于IP协议继续封装,加上源IP和目的IP,然后发送给数据链路层 - 数据链路层:
得到网络层的数据之后基于以太网帧封装,加上帧头和帧尾,其中包含源MAC和目的MAC - 物理层:
将封装好的数据包通过硬件设备传输
封装的时候时不知道MAC地址的,获取方式就是使用ARP地址解析协议,首先查看目的主机和源主机是否在同一网段,将目的IP和子网掩码按位相与得到网段,如果在同一网段就直接通过ARP获取目的MAC,如果不在同一网段就将数据交给网关处理,使用APR查找网关的MAC,目的MAC就是网关的MAC
2.3分用
网关得到数据报之后先进行从下到上分用
- 数据链路层
在数据链路层解析出数据帧,剥离帧头帧尾,取出IP数据报交给网络层 - 网络层
网络层拿到网络层数据报之后,再解析,去掉网络层协议报头,再交给传输层 - 传输层
传输层得到传输层协议报之后,解析,去除传输层包头,交给应用层 - 应用的得到应用层数据报之后,解析应用层数据包,得到请求内容
分用完成之后,继续封装,这次封装时,进行以下操作
- 要修改源IP、源端口、源MAC、目的MAC
- 然后基于NAPT技术,将局域网IP,端口修改为公网IP,端口
- 基于路由技术,在路由表中查询下一跳设备IP
- 在通过ARP查找MAC地址
2.4 响应
在路途中经过的设备,都需要经过以上的封装和分用,最后一步将请求消息成功交给目的主机后,先分用,然后交给目的端口对应的应用程序处理响应
当应用时tomcat时:首先解析HTTP请求,然后判断URL请求的时静态资源还是动态资源
- 当请求资源时静态资源时,直接返回静态的响应数据
- 当请求时servlet时,首先将HTTP协议数据封装为HTTPServletRequest,然后调用service()方法,调用子类重写的doXXX()方法
- 执行完毕之后,tomcat将HTTP响应基于HTTPServletResponse封装
- 返回响应,从上到下封装,然后返回响应给请求的主机