Internet上的每一个网页都具有一个唯一的名称标识,通常称之为URL(Uniform Resource Locator, 统一资源定位器)。它是www的统一资源定位标志,简单地说URL就是web地址,俗称“网址”。
解析URL
URL格式
首先浏览器的第一步是对URL进行解析,从而 发送给Web服务器的请求信息。
假如说没有访问路径的话,就会访问根目录下的默认文件,即 /index.html或者 /defalut.html。
解析URL:实际就是查询服务器域名对应的IP地址。
首先浏览器会先看自身缓存中有没有这个域名,如果有,就直接返回,如果没有就去问操作系统,操作系统先查看自己的缓存,如果有就直接返回,如果没有,再去host文件看,再没有的话,就会去访问本地DNS服务器。
域名的级别
www.baidu.com
域名都是用" . "来分隔的,在域名中,越靠右的位置表示其层级越高。
实际上域名最后还有一个点,比如
" www.baidu.com." ,这个最后的一个点表示根域名。
所以该域名的层级是.根域是最顶层,它的下一层是.com,再下面是server.com。
所以说,域名的层级关系类似一个树状结构。
因此,客户端只要找到任意一台DNS服务器,就能通过它找到根域DNS服务器,然后再一路顺藤摸瓜找到位于下层的某台目标DNS服务器就可以了。
而具体的查询过程我在这篇 博文里面有写。
对URL解析完之后,浏览器确定了Web服务器和文件名之后,接下来就是根据这些信息生成HTTP请求消息了。
当生成消息后接下来的传输过程就由操作系统来完成了。
操作系统协议栈
浏览器通过调用Socket库,来委托协议栈工作,协议栈的上半部分有两块协议,分别是收发数据的TCP和UDP,这两个协议会接受应用层的委托执行收发数据的操作。
协议栈的下面是用IP协议控制网络数据包收发操作,在互联网上发送数据时候,数据会被分为一块快的网络包,而将网络包发送给对方的操作就是由IP负责的。
另外IP中还包括 ICMP协议和ARP协议。
- ICMP用来告知网络数据包传送过程中产生的错误以及各种控制信息。
- ARP用于根据IP地址查询相应的以太网MAC地址(物理地址)。
IP下面的网卡驱动程序负责网卡硬件,而最下面的网卡则负责完成实际的收发操作,即对网络中的信号执行发送和接受操作。
TCP封装
HTTP是基于TCP协议传输的,我们先来介绍一下TCP协议。
TCP包头格式
- TCP源端口:源计算机上的应用程序的端口号。
- TCP目的端口:目标计算机的应用程序端口号。
- 序号:它表示本报文段所发送数据的第一个字节的编号。这个是为了解决乱序的问题。
- 确认号:确认序列号是接收确认端所期望收到的下一序列号。确认序号应当是上次已成功收到数据字节序号加 1。
- 首部头长度:指明了数据部分在段内的起始位置。
接下来的是一些状态位
- CER和ECE是拥塞控制的信号。当TCP接收端收到了网络拥塞的指示后,就设置ECE以便给发送端发ECN-Echo型号,告诉发送端放慢发送速率,TCP发送端设置CWR,给TCP接收端发CWR信号,只要接收端就知道发送端已经收到信号了,不会再给发送端发ECN-Echo信号了。
- URG为紧急信号,如果使用了紧急指针,则将URG设置为1,紧急指针指向从当前序号开始找到紧急数据的字节偏移量。
- ACK设置为1则表示确认有效。
- PSH指出中国是被推送的数据,特此请求接收端一旦收到数据后就直接较给应用程序,而不是将它缓存在缓冲区。
- RST是重新连接信号。
- SYN是建立连接信号.
- FIN是断开信号。
TCP是面向连接的,所以需要这些带状态的包来改变双方状态。
而它还有流量控制机制,就是通信双方各声名一个窗口(缓存大小),用来表示自己的处理能力
除了这个,它还会做拥塞控制,来控制自己发送的速度。
而在HTTP传输消息前,首先得建立TCP连接。
下面是TCP连接建立过程
TCP分割数据
如果HTTP的请求消息比较长,超过了MSS,这时TCP就需要把HTTP的数据拆解成一块块的数据发送。
数据会被以MSS的长度为单位进行拆分,拆分出来的数据又放到一个单独的数据包中,就是在每个被拆分的数据加上TCP头信息,然后交给IP模块来发送数据。
TCP报文生成
TCP协议有两个端口
一个是浏览器监听的端口(随机生成)
一个是Web服务器监听的端口(HTTP的默认端口是80,HTTPS的默认端口是443)。
在双方建立连接后,TCP的报文就是TCP头部+ HTTP头部+数据。
即如下图
IP封装
TCP模块在执行连接,收发,断开等各阶段操作时,都需要委托IP模块将数据封装成数据包发送给通信对象。
IP包头格式
在IP协议里面有源地址IP和目标地址IP
源地址IP :即是客户端输出的IP地址。
目标地址IP:即通过DNS域名解析得到的Web服务器IP
因为HPPT是经过TCP传输的,所以在IP包头的协议号,要填写为06(十六进制), 表示协议为TCP。
另外在生成IP数据包时,还有一个问题,假如说客户端存在多个网卡时,在填写源IP地址时,该填写那个IP呐?=
这个时候就需要使用路由表规则,来判断哪一个网卡做为源地址IP。
在Linux操作系统中,我们可以使用 route -n ,命令查看当前系统的路由表。
我们假设Web服务器的目标地址是 192.168.10.200
1.首先和第一条目的子网掩码进行与运算,
192.168.10.200 & 255.255.255.0 得到的结果为192.168.10.0
192.168.10.0 与 192.168.3.0结果不一致,所以匹配失败。
2.再与第二条的子网掩码进行与运算,
19.168.10.200 & 255.255.255.0 得到的结果是192.168.10.0,所以将eth1网卡的IP地址作为IP包头的源地址。
假如Web服务器的目标地址是10.100.20.100,最后匹配的结果是第三条。
第三条的目标地址和子网掩码都是0.0.0.0,这表示默认网关,如果其他所有条目都无法匹配,就会自动匹配这一行,并且后续就把包发给路由器,192.168.3.1即是路由器的IP地址。
IP报文生成
在生成了IP头部后,接下来网络包还需要在IP头部的前面加上MAC头部。
MAC封装
MAC包头格式
MAC头部是以太网使用的头部,它包含了接收方和发送方的MAC地址等信息。(用于两点之间的传输)
一般在TCP/IP通信里,MAC包头的协议类型只使用:
- 0808 :IP协议
- 0806: ARP协议
MAC发送方和接收方如何确认?
发送方的MAC地址:它在发送方的网卡中存着,只要将这个值读取出来写入到MAC头部就可以了。
接收方的MAC地址:
首先先查询ARP缓存,如果里面保存着对方的MAC地址,就直接使用。
如果缓存中没有的话,则发送ARP广播。这样就可以得到对方的MAC地址,接着操作系统会把本次查询结果放到ARP缓存中,不过只会缓存几分钟。
在Linux中,我们可以使用arp -a 来查询ARP缓存的内容。
MAC报文生成。
至此,MAC报文就生成好了。
网卡
数据包只是存放在内存中的一串二进制数字信息,没有办法直接发送给对方,因此,我们需要将数字信号转换为电信号,才能在网线上传输。
负责这一过程的是网卡,要控制网卡还需要靠网卡驱动程序。
网卡驱动获取网络包之后,会将其复制到网卡内的缓存区中,接着会在其开头加上报头和起始帧分解符,在末尾加上用于检测错误的帧校验序列。
- 起始帧分解符是用来标记包起始位置的标记。
- 末尾的FCS标记(帧校验序列)是用来检验包传输过程中是否有损害。
最后网卡会将包转换为电信号,通过网线发送过去。
交换机
首先,电信号到达网络接口,交换机中的模块进行接收,接下来交换机里的模块将电信号转换为数字信号。
然后通过包末尾的FCS校验错误,如果没有问题则放到缓冲区,这部分和网卡相同,但交换机的工作方式和网卡不同。
计算机的网卡本身具有MAC地址,并通过核对收到的包的接收方MAC地址判断是不是发给自己的,如果不是发给自己的则丢弃。
相反,交换机的端口不核对接收方MAC地址,而是直接接收所有的包并存放到缓存区中,因此,和网卡不同,交换机的端口不具有MAC地址。
查询MAC地址表
将包存入缓冲区后,接下来需要查询一下这个包的接收方MAC地址是否已经在MAC地址表中有记录了。
交换机的MAC地址表主要包含两个信息:
- 一个是设备的MAC地址。
- 一个是该设备连接在交换机的哪个端口上。
MAC地址表 | 端口 | 控制信息 |
---|---|---|
00-60-97-A5-43-3C | 1 | … |
00-00-C0-16-AE-Fb | 2 | … |
00-02-B3-1C-9C-F9 | 3 | … |
… | … | … |
交换机根据数据包的MAC地址,与MAC地址表进行匹配,从而判断应该把数据包发送到哪个端口。
假如说MAC地址表中没有指定的MAC地址。
这样的话,交换机无法判断应该把包转发到哪个端口,只能将包转发到除了源端口之外的所有端口上。
同时,如果接受方MAC地址是一个广播地址,那么交换机将把包发送到除源端口以外的所有端口。
广播地址
-
MAC地址中的广播地址 :FF:FF:FF:FF:FF:FF
-
IP地址中的广播地址:255.255.2555.255
路由器
网络包经过交换机之后,到达了路由器,并会被转发到下一个路由器或目标设备。(交换机是用来组成局域网的,路由器则是用来连接外网的。)
这一步转发的工作原理和交换机类似,也是通过查表判断包转发的目标。
不过它俩是有区别的
路由器是基于IP设计的,是三层网络设备,路由器的各个端口都具有MAC地址和IP地址。
而交换机是基于以太网设计的,是二层网络设备,交换机的端口不具有MAC地址。
路由器基本原理
路由器的端口具有MAC地址,因此它就能够成为以太网的发生方和接收方,同时还具有IP地址,从这个意义上来说,它和计算机的网卡是一样的。
当转发包时
首先路由器端口会接收发给自己的以太网包,然后路由表查询转发目标,再由相应的端口作为发生方将以太网包发送出去。
路由器包接收操作
首先,电信号到达网线接口部分,路由器中的模块会将电信号转换为数字信号,然后通过包末尾的FCS进行错误校验。
如果没有问题则检查MAC头部中的接收方MAC地址,看看是不是发送给自己的包,如果是就放到接收缓存区中,否则就丢弃到这个包。
总的来说,路由器的端口都具有MAC地址,只接收与自身地址匹配的包,遇到不匹配的则直接丢弃。
查询路由表确定输出端口
完成包接收操作之后,路由器就会去掉包开头的MAC头部。
交换机是二层设备,路由器是三层设备,MAC头部的作用就是将包送达路由器,其中的接收方MAC地址就是路由器的MAC地址,因此当到达录取之后,MAC头部就会被丢弃。
在这之后,路由器就会根据包的IP地址来对包进行转发。
首先是查询路由表判断转发目标。
目标地址 | 子网掩码 | 网关 | 接口 | 越点数 |
---|---|---|---|---|
10.10.1.0 | 255.255.255.0 | —— | eth2 | 1 |
192.168.1.0 | 255.255.255.0 | —— | eth3 | 1 |
0.0.0.0 | 0.0.0.0 | —— | eth1 | 1 |
假设目标地址为192.168.1.100。
匹配的时候,就是根据包的接收方IP地址查询路由表中的目标地址,以找到相匹配的记录。
它与第二条的子网掩码 做与运算。
192.168.1.100 & 255.255.255.0 得到 192.168.1.0。
与目标地址中的192.168.1.0一样。
因此,第二条记录就会做为转发目标。
实在找不到匹配路由时,就会选择默认路由,路由表中子网掩码为0.0.0.0的表示默认路由。
路由器的发送操作
首先,根据路由表的网关列判断对方的地址。
- 如果网关是一个IP地址,则这个IP地址就是我们要转发到的目标地址,还未抵达终点,还需要路由器转发。
- 如果网关为空,则IP头部中的接收方IP地址就是要转发的目标地址,也就是终于找到IP包头里的目的地址了,说明已抵达终点。
知道对方IP地址之后,接下来需要通过ARP协议根据IP查询MAC地址,并将查询的结果作为接收方MAC地址。
首先先查询ARP缓存,找不到的话则会发送ARP请求。
接下来是发送方MAC地址字段写为路由器输出端口的MAC地址,还有一个以太类型字段,填写0800(十六进制)表示IP协议。
网络包完成后,接下来会将其转换成电信号并通过端口发送出去,这一步的工作过程和计算机也是相同的。
而最终数据经过层层转发,到达路由器,再到达交换机,最终到达目的地。
在网络包传输过程中,源IP和目标IP始终是不会改变的,一直变化的是MAC地址,因为需要MAC地址在以太网中进行两个设备之间的包传输。
到达服务器
数据包到达了服务器之后。
-
服务器首先拆开数据包的MAC头部,查看是否和服务器自己的MAC地址符合,符合就将包收起来。
-
接着拆开数据包的IP头,发现IP地址符合,根据IP头中协议项,知道上层是TCP协议。
-
接着拆开TCP的头,里面有序列号,看一看序列号是否符合,如果是就放入缓存,返回一个ACK,如果不是则就丢弃,TCP头部里面还有端口号,HTTP服务正在监听这个端口号。
-
于是,服务器就把这个包发送给HTTP进程。
-
HTTP服务根据HTTP包中的请求,找到对方想要的资源,接着就把这个资源封装在HTTP响应报文中,再经过TCP,IP,MAC封装,从网卡发送出去。由交换机发送到出城的路由器,接着一次次转发,到达客户端。
-
最后客户端也执行拆包动作,把HTTP响应报文交给浏览器,让它去渲染页面。文章来源:https://www.toymoban.com/news/detail-401911.html
参考文章: 小林coding文章来源地址https://www.toymoban.com/news/detail-401911.html
到了这里,关于从输入URL到网页显示,期间发生了什么(详解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!