https://github.com/crisxuan/bestJavaer

这是一个旧调重弹的话题,文章将详细描述发生在这一过程中的内容。

要求 URL

当我们在浏览器里输入一个网址,比如

php怎么连接mss从你输入网址到看到网页详解中央产生的进程 JavaScript

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 地址。

域名解析做事器是基于 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:FFIP 地址中的 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 中的物理层。
集线器的基本功能是信息分发,它把一个端口吸收的所有旗子暗记向所有端口分发出去。
一些集线器在分发之前将弱旗子暗记重新天生,一些集线器整理旗子暗记的时序以供应所有端口间的同步数据通信。

集线器实际便是一种多端口的中继器。
集线器一样平常有 4、8、16、24、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 通报数据的。

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

到这里,才创造想要把一个网络要求完全的理解,还是须要花很多功夫的。

原文:https://www.cnblogs.com/huansky/p/13955620.html

在我的 程序员cxuan 同名公众号下回答 cxuan 领取下面这些 PDF,纯自己手写。