从你输入网址,到看到网页——详解中间发生的过程

这是一个老生常谈的话题,文章将详细描述发生在这一过程当中的内容。html

 请求 URL

当咱们在浏览器里输入一个网址,好比 算法

https://www.baidu.com/ 

URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。也可认为由4部分组成:协议、主机、端口、路径。浏览器

URL的通常语法格式为:
// 带方括号[]的为可选项
protocol :// hostname[:port] / path / [;parameters][?query]#fragment

生成 HTTP 请求信息

拿到 URL 后,须要对 URL 进行必定的解析,好比这个 URL 请求表达了什么(是请求图片,html,txt ?请求域名是什么?),因而会对 URL 进行解析以后,浏览器肯定了 Web 服务器和文件名,接下来就是根据这些信息来生成 HTTP 请求消息了。缓存

 

HTTP 的消息格式服务器

生成数据包之后,可是此时仍是不知道本身的目的地是哪里,因而就须要根据 URL 来获取 IP 地址。网络

经过 DNS 获取 IP 地址

输入网址后,会对网址中的域名进行解析获取 IP 地址。尽管 IP 地址可以惟一地标记网络上的计算机,但 IP 地址是一长串数字,不直观,并且用户记忆十分不方便,因而人们又发明了另外一套字符型的地址方案,即所谓的域名地址。IP 地址和域名是一一对应的,这份域名地址的信息存放在一个叫域名服务器 (DNS,Domain name server) 的主机内,使用者只需了解易记的域名地址,其对应转换工做就留给了域名服务器。域名服务器就是提供 IP 地址和域名之间的转换服务的服务器。负载均衡

在广域网中是基于 IP 地址进行通讯的。但一般客户访问的是一个网址,为此须要先获得网址对应的 IP 地址,这就须要域名服务系统将域名转换成 IP 地址。在客户端浏览器中输入网址时,浏览器会根据本地客户端 DNS 服务器配置,向 DNS 服务器获取域名对应的 IP 地址。post

域名解析服务器是基于 UDP 协议实现的一个应用程序,一般经过监听 53 端口来获取客户端的域名解析请求。        学习

DNS 查找过程为:网站

浏览器缓存->系统缓存->路由器缓存->ISP DNS缓存->递归搜索

递归搜索过程为:从根域名服务器顶级域名服务器到所查询的域名服务器。

DNS 的解析过程,具体以下图所示:

域名解析的工做流程

若是你访问的网站使用了云平台,并配置了智能 DNS 和全局负载均衡,在权威 DNS 服务中,通常是经过配置 CNAME 的方式,咱们能够起一个别名,例如 vip.yourcomany.com,而后告诉本地 DNS 服务器,让它请求 GSLB 解析这个域名,GSLB 就能够在解析这个域名的过程当中,经过本身的策略实现负载均衡。

GSLB 经过查看请求它的本地 DNS 服务器所在的运营商和地址,就知道用户所在的运营商和地址,而后将距离用户位置比较近的 Region 里面 IP 地址,返回给本地 DNS 服务器。本地 DNS 解析器将结果缓存后将结果返回。

对于手机 App 来讲,能够绕过刚才的传统 DNS 解析机制,只要 HTTPDNS 服务经过,直接调用 HTTPDNS 服务器,获得这多个 SLB 的公网 IP 地址。

别忘了互联网上还有另一个重要的角色 CDN,它也会在 DNS 的解析过程当中“插上一脚”。DNS 解析可能会给出 CDN 服务器的 IP 地址,这样你拿到的就会是 CDN 服务器而不是目标网站的实际地址。

由于 CDN 会缓存网站的大部分资源,好比图片、CSS 样式表,因此有的 HTTP 请求就不须要再发到 Apple,CDN 就能够直接响应你的请求,把数据发给你。

由 PHP、Java 等后台服务动态生成的页面属于“动态资源”,CDN 没法缓存,只能从目标网站获取。因而你发出的 HTTP 请求就要开始在互联网上的“漫长跋涉”,通过无数的路由器、网关、代理,最后到达目的地。

协议栈

经过 DNS 获取到 IP 后,就能够把 HTTP 的传输工做交给操做系统中的协议栈。

协议栈的内部分为几个部分,分别承担不一样的工做。上下关系是有必定的规则的,上面的部分会向下面的部分委托工做,下面的部分收到委托的工做并执行。

应用程序(浏览器)经过调用 Socket 库,来委托协议栈工做。协议栈的上半部分有两块,分别是负责收发数据的 TCP 和 UDP 协议,它们两会接受应用层的委托执行收发数据的操做。

协议栈的下面一半是用 IP 协议控制网络包收发操做,在互联网上传数据时,数据刽被切分红一块块的网络包,而将网络包发送给对方的操做就是由 IP 负责的。

此外 IP 中还包括 ICMP 协议和 ARP 协议。

  • ICMP 用于告知网络包传送过程当中产生的错误以及各类控制信息。

  • ARP 用于根据 IP 地址查询相应的以太网 MAC 地址。

IP 下面的网卡驱动程序负责控制网卡硬件,而最下面的网卡则负责完成实际的收发操做,也就是对网线中的信号执行发送和接收操做。

可靠传输 —— TCP

HTTP 是基于 TCP 协议传输的,关于 TCP 协议 能够参考文章 TCP 三次握手和四次挥手图解(有限状态机)

在 HTTP 传输数据以前,首先须要 TCP 创建链接,这里就不细说创建链接过程了。

若是 HTTP 请求消息比较长,超过了 MSS 的长度,这时 TCP 就须要把 HTTP 的数据拆解一块块的数据发送,而不是一次性发送全部数据。

MTU 与 MSS

  • MTU:一个网络包的最大长度,以太网中通常为 1500 字节。

  • MSS:除去 IP 和 TCP 头部以后,一个网络包所能容纳的 TCP 数据的最大长度。

数据会被以 MSS 的长度为单位进行拆分,拆分出来的每一块数据都会被放进单独的网络包中。也就是在每一个被拆分的数据加上 TCP 头信息,而后交给 IP 模块来发送数据。

 

数据包分割

TCP 报文生成

TCP 协议里面会有两个端口,一个是浏览器监听的端口(一般是随机生成的),一个是 Web 服务器监听的端口(HTTP 默认端口号是 80, HTTPS 默认端口号是 443)。

在双方创建了链接后,TCP 报文中的数据部分就是存放 HTTP 头部 + 数据,组装好 TCP 报文以后,就需交给下面的网络层处理。

至此,网络包的报文以下图。

远程定位 —— IP 

咱们先看看 IP 报文头部的格式:

IP 包头格式

在 IP 协议里面须要有源地址 IP 和 目标地址 IP:

  • 源地址IP,便是客户端输出的 IP 地址;

  • 目标地址,即经过 DNS 域名解析获得的 Web 服务器 IP。

由于 HTTP 是通过 TCP 传输的,因此在 IP 包头的协议号,要填写为 06(十六进制),表示协议为 TCP。

两点传输 —— MAC

生成了 IP 头部以后,接下来网络包还须要在 IP 头部的前面加上 MAC 头部。

MAC 头部是以太网使用的头部,它包含了接收方和发送方的 MAC 地址等信息。

MAC 包头格式

在 MAC 包头里须要发送方 MAC 地址和接收方目标 MAC 地址,用于两点之间的传输。

通常在 TCP/IP 通讯里,MAC 包头的协议类型只使用:

  • 0800 :IP 协议

  • 0806 :ARP 协议

MAC 发送方和接收方如何确认?

发送方的 MAC 地址获取就比较简单了,MAC 地址是在网卡生产时写入到 ROM 里的,只要将这个值读取出来写入到 MAC 头部就能够了。

接收方的 MAC 地址就有点复杂了,只要告诉以太网对方的 MAC 的地址,以太网就会帮咱们把包发送过去,那么很显然这里应该填写对方的 MAC 地址。

因此先得搞清楚应该把包发给谁,这个只要查一下路由表就知道了。在路由表中找到相匹配的条目,而后把包发给 Gateway 列中的 IP 地址就能够了。

既然知道要发给谁,按如何获取对方的 MAC 地址呢?

不知道对方 MAC 地址?不知道就喊呗。

此时就须要 ARP 协议帮咱们找到路由器的 MAC 地址。

ARP 广播

ARP 协议会在以太网中以广播的形式,对以太网全部的设备喊出:“这个 IP 地址是谁的?请把你的 MAC 地址告诉我”。

而后就会有人回答:“这个 IP 地址是个人,个人 MAC 地址是 XXXX”。

若是对方和本身处于同一个子网中,那么经过上面的操做就能够获得对方的 MAC 地址。而后,咱们将这个 MAC 地址写入 MAC 头部,MAC 头部就完成了。

好像每次都要广播获取,这不是很麻烦吗?

放心,在后续操做系统会把本次查询结果放到一块叫作 ARP 缓存的内存空间留着之后用,不过缓存的时间就几分钟。

也就是说,在发包时:

  • 先查询 ARP 缓存,若是其中已经保存了对方的 MAC 地址,就不须要发送 ARP 查询,直接使用 ARP 缓存中的地址。

  • 而当 ARP 缓存中不存在对方 MAC 地址时,则发送 ARP 广播查询。

至此,网络包的报文以下图。

MAC 层报文

网卡

IP 生成的网络包只是存放在内存中的一串二进制数字信息,没有办法直接发送给对方。所以,咱们须要将数字信息转换为电信号,才能在网线上传输,也就是说,这才是真正的数据发送过程。

负责执行这一操做的是网卡,要控制网卡还须要靠网卡驱动程序。

网卡驱动从 IP 模块获取到包以后,会将其复制到网卡内的缓存区中,接着会其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列。

 

物理层数据包

  • 起始帧分界符是一个用来表示包起始位置的标记

  • 末尾的 FCS(帧校验序列)用来检查包传输过程是否有损坏

最后网卡会将包转为电信号,经过网线发送出去。

交换机

下面来看一下包是如何经过交换机的。交换机的设计是将网络包原样转发到目的地。交换机工做在 MAC 层,也称为二层网络设备。

交换机的包接收操做

首先,电信号到达网线接口,交换机里的模块进行接收,接下来交换机里的模块将电信号转换为数字信号。

而后经过包末尾的 FCS 校验错误,若是没问题则放到缓冲区。这部分操做基本和计算机的网卡相同,但交换机的工做方式和网卡不一样。

计算机的网卡自己具备 MAC 地址,并经过核对收到的包的接收方 MAC 地址判断是否是发给本身的,若是不是发给本身的则丢弃;相对地,交换机的端口不核对接收方 MAC 地址,而是直接接收全部的包并存放到缓冲区中。所以,和网卡不一样,交换机的端口不具备 MAC 地址。

将包存入缓冲区后,接下来须要查询一下这个包的接收方 MAC 地址是否已经在 MAC 地址表中有记录了。

交换机的 MAC 地址表主要包含两个信息:

  • 一个是设备的 MAC 地址,

  • 另外一个是该设备链接在交换机的哪一个端口上。

举个例子,若是收到的包的接收方 MAC 地址为 00-02-B3-1C-9C-F9,则与图中表中的第 3 行匹配,根据端口列的信息,可知这个地址位于 3 号端口上,而后就能够经过交换电路将包发送到相应的端口了。

因此,交换机根据 MAC 地址表查找 MAC 地址,而后将信号发送到相应的端口。

当 MAC 地址表找不到指定的 MAC 地址会怎么样?

地址表中找不到指定的 MAC 地址。这多是由于具备该地址的设备尚未向交换机发送过包,或者这个设备一段时间没有工做致使地址被从地址表中删除了。

这种状况下,交换机没法判断应该把包转发到哪一个端口,只能将包转发到除了源端口以外的全部端口上,不管该设备链接在哪一个端口上都能收到这个包。

这样作不会产生什么问题,由于以太网的设计原本就是将包发送到整个网络的,而后只有相应的接收者才接收包,而其余设备则会忽略这个包。

有人会说:“这样作会发送多余的包,会不会形成网络拥塞呢?”

其实彻底不用过于担忧,由于发送了包以后目标设备会做出响应,只要返回了响应包,交换机就能够将它的地址写入 MAC 地址表,下次也就不须要把包发到全部端口了。

局域网中每秒能够传输上千个包,多出一两个包并没有大碍。

此外,若是接收方 MAC 地址是一个广播地址,那么交换机会将包发送到除源端口以外的全部端口。

如下两个属于广播地址:

  • MAC 地址中的 FF:FF:FF:FF:FF:FF

  • IP 地址中的 255.255.255.255

路由器

路由器与交换机的区别

网络包通过交换机以后,如今到达了路由器,并在此被转发到下一个路由器或目标设备。

这一步转发的工做原理和交换机相似,也是经过查表判断包转发的目标。

不过在具体的操做过程上,路由器和交换机是有区别的。

  • 由于路由器是基于 IP 设计的,俗称三层网络设备,路由器的各个端口都具备 MAC 地址和 IP 地址;

  • 而交换机是基于以太网设计的,俗称二层网络设备,交换机的端口不具备 MAC 地址。

路由器基本原理

路由器的端口具备 MAC 地址,所以它就可以成为以太网的发送方和接收方;同时还具备 IP 地址,从这个意义上来讲,它和计算机的网卡是同样的。

当转发包时,首先路由器端口会接收发给本身的以太网包,而后路由表查询转发目标,再由相应的端口做为发送方将以太网包发送出去。

路由器的包接收操做

首先,电信号到达网线接口部分,路由器中的模块会将电信号转成数字信号,而后经过包末尾的 FCS 进行错误校验。

若是没问题则检查 MAC 头部中的接收方 MAC 地址,看看是否是发给本身的包,若是是就放到接收缓冲区中,不然就丢弃这个包。

总的来讲,路由器的端口都具备 MAC 地址,只接收与自身地址匹配的包,遇到不匹配的包则直接丢弃。

查询路由表肯定输出端口

完成包接收操做以后,路由器就会去掉包开头的 MAC 头部。

MAC 头部的做用就是将包送达路由器,其中的接收方 MAC 地址就是路由器端口的 MAC 地址。所以,当包到达路由器以后,MAC 头部的任务就完成了,因而 MAC 头部就会被丢弃。

接下来,路由器会根据 MAC 头部后方的 IP 头部中的内容进行包的转发操做。

转发操做分为几个阶段,首先是查询路由表判断转发目标。

 路由器转发流程图

举个例子

假设地址为 10.10.1.101 的计算机要向地址为 192.168.1.100 的服务器发送一个包,这个包先到达图中的路由器。

判断转发目标的第一步,就是根据包的接收方 IP 地址查询路由表中的目标地址栏,以找到相匹配的记录。

路由匹配和前面讲的同样,每一个条目的子网掩码和 192.168.1.100 IP 作 & 与运算后,获得的结果与对应条目的目标地址进行匹配,若是匹配就会做为候选转发目标,若是不匹配就继续与下个条目进行路由匹配。

如第二条目的子网掩码 255.255.255.0 与 192.168.1.100 IP 作 & 与运算后,获得结果是 192.168.1.0 ,这与第二条目的目标地址 192.168.1.0 匹配,该第二条目记录就会被做为转发目标。

实在找不到匹配路由时,就会选择默认路由,路由表中子网掩码为 0.0.0.0 的记录表示「默认路由」。

路由器的发送操做

接下来就会进入包的发送操做。

首先,咱们须要根据路由表的网关列判断对方的地址。

  • 若是网关是一个 IP 地址,则这个IP 地址就是咱们要转发到的目标地址,还未抵达终点,还需继续须要路由器转发。

  • 若是网关为空,则 IP 头部中的接收方 IP 地址就是要转发到的目标地址,也是就终于找到 IP 包头里的目标地址了,说明已抵达终点。

知道对方的 IP 地址以后,接下来须要经过 ARP 协议根据 IP 地址查询 MAC 地址,并将查询的结果做为接收方 MAC 地址。路由器也有 ARP 缓存,所以首先会在 ARP 缓存中查询,若是找不到则发送 ARP 查询请求。

接下来是发送方 MAC 地址字段,这里填写输出端口的 MAC 地址。还有一个以太类型字段,填写 0080 (十六进制)表示 IP 协议。

网络包完成后,接下来会将其转换成电信号并经过端口发送出去。这一步的工做过程和计算机也是相同的。发送出去的网络包会经过交换机到达下一个路由器。因为接收方 MAC 地址就是下一个路由器的地址,因此交换机会根据这一地址将包传输到下一个路由器。

接下来,下一个路由器会将包转发给再下一个路由器,通过层层转发以后,网络包就到达了最终的目的地。

不知你发现了没有,在网络包传输的过程当中,源 IP 和目标 IP 始终是不会变的,一直变化的是 MAC 地址,由于须要 MAC 地址在以太网内进行两个设备之间的包传输。

数据包抵达了服务器,服务器确定高兴呀,正所谓有朋自远方来,不亦乐乎?

拆包--服务器和客户端

服务器高兴的不得了,因而开始扒数据包的皮!就好像你收到快递,能不兴奋吗?

数据包抵达服务器后,服务器会先扒开数据包的 MAC 头部,查看是否和服务器本身的 MAC 地址符合,符合就将包收起来。

接着继续扒开数据包的 IP 头,发现 IP 地址符合,根据 IP 头中协议项,知道本身上层是 TCP 协议。

因而,扒开 TCP 的头,里面有序列号,须要看一看这个序列包是否是我想要的,若是是就放入缓存中而后返回一个 ACK,若是不是就丢弃。TCP头部里面还有端口号, HTTP 的服务器正在监听这个端口号。

因而,服务器天然就知道是 HTTP 进程想要这个包,因而就将包发给 HTTP 进程。

服务器的 HTTP 进程看到,原来这个请求是要访问一个页面,因而就把这个网页封装在 

HTTP 响应报文里。

HTTP 响应报文也须要穿上 TCP、IP、MAC 头部,不过此次是源地址是服务器 IP 地址,目的地址是客户端 IP 地址。

穿好头部衣服后,从网卡出去,交由交换机转发到出城的路由器,路由器就把响应数据包发到了下一个路由器,就这样跳啊跳。

最后跳到了客户端的城门把手的路由器,路由器扒开 IP 头部发现是要找城内的人,因而把包发给了城内的交换机,再由交换机转发到客户端。

客户端收到了服务器的响应数据包后,一样也很是的高兴,客户能拆快递了!

因而,客户端开始扒皮,把收到的数据包的皮扒剩 HTTP 响应报文后,交给浏览器去渲染页面,一份特别的数据包快递,就这样显示出来了!

最后,客户端要离开了,向服务器发起了 TCP 四次挥手,至此双方的链接就断开了。

其余

网关和路由的区别

简单版

‘网关’一个大概念,不具体特指一类产品,只要链接两个不一样的网络的设备均可以叫网关;而‘路由器’么通常特指可以实现路由寻找和转发的特定类产品,路由器很显然可以实现网关的功能。 

详细版

网关(Gateway)就是一个网络链接到另外一个网络的“关口”。按照不一样的分类标准,网关也有不少种。TCP/IP 协议里的网关是最经常使用的,在这里咱们所讲的“网关”均指 TCP/IP 协议下的网关。        

那么网关究竟是什么呢?网关实质上是一个网络通向其余网络的IP地址。好比有网络 A 和网络 B,网络A的IP地址范围为 “192.168.1.1~192. 168.1.254”,子网掩码为 255.255.255.0;网络B的IP地址范围为 “192.168.2.1~192.168.2.254”,子网掩码为 255.255.255.0。在没有路由器的状况下,两个网络之间是不能进行 TCP/IP 通讯的,即便是两个网络链接在同一台交换机(或集线器)上,TCP/IP 协议也会根据子网掩码(255.255.255.0)断定两个网络中的主机处在不一样的网络里。而要实现这两个网络之间的通讯,则必须经过网关。若是网络A中的主机发现数据包的目的主机不在本地网络中,就把数据包转发给它本身的网关,再由网关转发给网络B的网关,网络 B 的网关再转发给网络B的某个主机。网络B向网络A转发数据包的过程也是如此。        

因此说,只有设置好网关的 IP 地址,TCP/IP 协议才能实现不一样网络之间的相互通讯。那么这个 IP 地址是哪台机器的 IP 地址呢?网关的IP地址是具备路由功能的设备的 IP 地址,具备路由功能的设备有路由器、启用了路由协议的服务器(实质上至关于一台路由器)、代理服务器(也至关于一台路由器)。       

路由器(Router)是一种负责寻径的网络设备,它在互连网络中从多条路径中寻找通信量最少的一条网络路径提供给用户通讯。路由器用于链接多个逻辑上分开的网络。对用户提供最佳的通讯路径,路由器利用路由表为数据传输选择路径,路由表包含网络地址以及各地址之间距离的清单,路由器利用路由表查找数据包从当前位置到目的地址的正确路径。路由器使用最少时间算法或最优路径算法来调整信息传递的路径,若是某一网络路径发生故障或堵塞,路由器可选择另外一条路径,以保证信息的正常传输。路由器可进行数据格式的转换,成为不一样协议之间网络互连的必要设备。  

集线器(HUB)  

集线器就是将网线集中到一块儿的机器,也就是多台主机和设备的链接器。集线器的主要功能以扩大网络的传输距离,是中继器的一种形式,区别在于集线器可以提供多端口服务,也称为多口中继器。集线器在 OSI/RM 中的物理层。集线器的基本功能是信息分发,它把一个端口接收的全部信号向全部端口分发出去。一些集线器在分发以前将弱信号从新生成,一些集线器整理信号的时序以提供全部端口间的同步数据通讯。

集线器实际就是一种多端口的中继器。集线器通常有 四、八、1六、2四、32 等数量的 RJ45 接口,经过这些接口,集线器便能为相应数量的电脑完成“中继”功能(将已经衰减得不完整的信号通过整理,从新产生出完整的信号再继续传送)。因为它在网络中处于一种“中心”位置,所以集线器也叫作 “HUB”。 

集线器的工做原理很简单,好比有一个具有8个端口的集线器,共链接了 8 台电脑。集线器处于网络的“中心”,经过集线器对信号进行转发,8 台电脑之间能够互连互通。具体通讯过程是这样的:假如计算机1要将一条信息发送给计算机8,当计算机1的网卡将信息经过双绞线送到集线器上时,集线器并不会直接将信息送给计算机 8,它会将信息进行“广播”——将信息同时发送给 8 个端口,当 8 个端口上的计算机接收到这条广播信息时,会对信息进行检查,若是发现该信息是发给本身的,则接收,不然不予理睬。因为该信息是计算机1发给计算机 8的,所以最终计算机 8 会接收该信息,而其它7台电脑看完信息后,会由于信息不是本身的而不接收该信息。

交换机(Switch)

交换机是集线器的升级换代产品,外形上和集线器没什么分别,是一种在通讯系统中自动完成信息交换功能的设备,用途和 HUB 同样也是链接组网之用,可是它具备比集线器更强大的功能。

交换机也叫交换式集线器,它经过对信息进行从新生成,并通过内部处理后转发至指定端口,具有自动寻址能力和交换做用,因为交换机根据所传递信息包的目的地址,将每一信息包独立地从源端口送至目的端口,避免了和其余端口发生碰撞。广义的交换机就是一种在通讯系统中完成信息交换功能的设备。  

在计算机网络系统中,交换机是针对共享工做模式的弱点而推出的。集线器是采用共享工做模式的表明,若是把集线器比做一个邮递员,那么这个邮递员是个不认识字的“傻瓜”——要他去送信,他不知道直接根据信件上的地址将信件送给收信人,只会拿着信分发给全部的人,而后让接收的人根据地址信息来判断是否是本身的!而交换机则是一个“聪明”的邮递员——交换机拥有一条高带宽的背部总线和内部交换矩阵。交换机的全部的端口都挂接在这条背部总线上,当控制电路收到数据包之后,处理端口会查找内存中的地址对照表以肯定目的MAC(网卡的硬件地址)的 NIC(网卡)挂接在哪一个端口上,经过内部交换矩阵迅速将数据包传送到目的端口。目的 MAC 若不存在,交换机才广播到全部的端口,接收端口回应后交换机会“学习”新的地址,并把它添加入内部地址表中。 

 总结

  • 应用层到网卡以前,其实都是在为发送数据前作准备,好比添加各类头部信息,MAC,IP 地址;

  • 网络传输过程主要是经过 交换机-路由器-...-路由器 最终将数据传到对方服务器上。

  • 服务器和客户端都要经历添加和删除头部的过程,交换机是经过 MAC 传递数据的,路由器是经过 MAC 和 IP 传递数据的。

本文也只是把请求的流程给作了讲解,可是真的在网络传输过程当中,还涉及到加密,缓存,负载均衡,数据传输等各类过程。

到这里,才发现想要把一个网络请求完整的理解,仍是须要花不少功夫的。

  

参考文章

从你输入一个网址,到网页显示,其间发生了什么?

相关文章
相关标签/搜索