【网络】DNS | ICMP | NAT | 代理服务器
🐱作者:一只大喵咪1201
🐱专栏:《网络》
🔥格言:你只管努力,剩下的交给时间!
前面几篇文章虽然讲介绍了整个网络通信的协议栈,我们也知道了完整的网络通信过程,但是还有几个坑没填,以及一些重要的协议和技术没有讲解。
DNS | ICMP | NAT | 代理服务器
- 😽DNS
- 😽ICMP协议
- 😽NAT技术
- 😽代理服务器
- 😽总结
😽DNS
- DNS是一整套从域名映射到IP地址的系统,也就是域名解析服务。
- DNS服务的默认端口号是53。
本喵在讲解网络通信的时候,都是说的IP地址,但是我们生活中访问一些网站时都用的域名,如www.baidu.com
访问的就是百度的服务器。
在整个网络通信的协议栈中我们也并没有看到和域名有关的任何东西,因为网络通信的实现就是通过IP地址,并不是域名,域名也需要转换成IP地址,然后再进行通信。
对于使用网络的人来说,IP地址并不方便记忆,因为它是数字性的东西,所以将域名和IP地址映射起来,形成一一对应的关系,在是使用的时候直接使用域名字符串就行。
最初,在每个人的主机上都存在一个hosts
文件文件,该文件中存放的就是域名和IP地址的映射关系,如上图所示,主机名host-a
对应着IP地址172.20.2.1
。
这个hosts
文件是由互联网中心(SRI-NIC)来管理的:
- 如果一个新计算机要接入网络,或者某个计算机IP变更,都需要到信息中心申请变更
hosts
文件。 - 其他计算机也需要定期下载更新新版本的
hosts
文件才能正确上网。
每当我们访问一个服务器输入域名的时候,浏览器都会自动去本地的hosts
文件中查找对应的IP地址,然后再进行绑定创建套接字等发起网络请求。
如上图所示,查看/etc/hosts
路径的文件,可以看到hosts
文件中的内容,红色框中的是IP地址,绿色框中是与之映射的域名,也就是字符串。
但是这样的方式太麻烦了,需要定期去更新hosts
文件,增加时还要修改再提交申请等等,所以就产生了DNS
系统。
- DNS:一个组织的系统管理机构,维护系统内的每个主机的IP和域名的对应关系,该机构就像CA机构一样,具有权威性。
- 如果新计算机接入网络,需要将这个信息注册到数据库中。
- 用户输入域名的时候,会自动查询DNS服务器,由DNS服务器检索数据库,得到对应的IP地址,返回给用户。
域名简介:
既然有了一个权威性的机构来提供域名解析服务,所以域名也有命名规则,以www.baidu.com
为例:
com
: 一级域名,表示这是一个企业域名,同级的还有net
(网络提供商),org
(非盈利组织) 等。baidu
:二级域名,一般是公司名或者组织的名称。www
:只是一种习惯用法,不写都可以,直接使用baidu.com
也可以访问百度的服务器。
域名解析过程:
在Linux机器上使用yum -y install bind-utils
指令可以安装一个dig
工具,可以看到域名解析的过程。
如上图,是解析域名www.baidu.com
的过程。
- 第一个绿色框中的内容是
dig
工具的版本号等信息。 - 第二个绿色框是域名解析的结果,
NOERROR
表示解析成功。 - 第三个绿色框是要解析的域名。
- 第四个绿色框是解析后的结果,在解析时,先将
www.baidu.com
解析成了www.a.shifen.com
,然后再将www.a.shifen.com
解析成了两个IP地址。 - 最后一个绿色框是解析后的结构统计,包括解析时长,
DNS
服务器的IP地址等信息。
如上图所示,在浏览器中输入解析出来的IP地址112.80.248.76
,也可以直接访问到百度的首页,和输入域名www.baidu.com
结果一样,区别在于:
- 使用IP地址访问时,浏览器自动采用
HTTP
协议。 - 使用域名访问时,浏览器自动采用
HTTPS
协议。
😽ICMP协议
如上图所示,主机A向主机B发送数据,数据经过多次局域网转发后到了路由器2,路由器2为了获取主机B的MAC地址,发送ARP
请求,但是发送了多次都没有收到主机B的ARP
应答。
此时路由器2会返回一个Destination Unreachable
结果给主机A,主机A收到以后就知道了数据传送错误的原因。
这种返回错误的功能之前IP协议是没有的,如果发送不成功,传输层就会触发超时重传再次发送。这种方式对于使用者来说是没有问题的,但是对于网络管理员来说不够。
他们需要知道错误的原因从而进行修复,让网络通信正常,此时ICMP
协议就派上了用场。
ICMP
协议是一个网络层协议,它能确认IP数据包是否成功到达目标地址。- 如果没有发送成功,通知发送端IP数据包被丢弃的原因。
-
ICMP
协议也是基于IP协议工作的,它并不是传输层的功能,所以我们把它归结为网络层协议。
ICMP
只能搭配IPv4使用,如果是IPv6的情况,需要使用ICMPv6
协议。
协议格式(了解):
关于协议格式,本喵不会详细讲解,有个了解就可以,ICMP
报文大致分为两类,一类是通知出错原因,一类是用于诊断查询。
如上图表所示便是ICMP
常见代码和代码所代表的内容。
ping命令:
我们在验证一个机器的网络是否连接成功时,通常都会使用ping
。
如上图就是本喵在对www.baidu.com
使用ping
命令,可以在Linux上进行,也可以在Windows上进行。
- 此处
ping
的是一个域名,而不是url
(服务器web文件路径),域名可以通过DNS
解析成IP地址。ping
命令不仅能验证网络的连通性,而且也会统计响应的时间和TTL
(IP协议中的生存时间,也就是跳数)。ping
命令会先发送一个IMCP的Echo Request
给对端,对端接收到之后会返回一个IMCP的Echo Reply
。
ping
命令是通过ICMP
协议实现的,是网络层的协议,所以没有端口号,它绕过了应用层和传输层,直接从网络层开始。
如上图所示,traceroute 域名
指令可以查询当前主机当目标主机之前经历了多少路由器,这也是基于ICMP
协议实现的。
😽NAT技术
前面本喵在讲解IP协议数据发送的时候的时候,数据从局域网发送到公网服务器的过程中,每经过一个入口路由器,就会将IP报头中的目的IP地址替换成当前路由器的WAN
口IP。
NAT
能够将私有IP对外通信时转为公网IP,也就是一种将私有IP和公网IP相互转化的技术方法。
如上图所示,此时局域网的客户端A向公网中的服务器发送数据,客户端A将数据在网络层的时候封装IP报头,其中目的IP地址是服务器的公网IP地址163.221.120.9
,源IP地址是自己的私有IP地址10.0.0.10
,数据最后以MAC帧的形式发送到NAT
路由器。
-
NAT
路由器的内网LAN
口IP地址是10.0.0.1
,公网WAN
口IP地址是202.244.174.37
。
数据帧被路由器进行解包分用交给自己的网络层后,将IP报头中的源IP地址换成了WAN
口IP地址,然后再封装成数据帧发送给公网中的服务器。
当目标IP地址的服务器响应时,同样也需要封装IP报头,其中目的IP就填路由器的WAN
口IP,路由器拿到这个响应后,再将IP报头中的目的IP改成客户端A的IP地址10.0.0.10
,再发送给客户端A。
问题来了,如果局域网中有多台客户端主机都访问这同一个服务器,甚至每台主机上有多个进程在访问这个服务器,请求数据包都可以通过NAT
路由器发送给服务器,服务器也可以将响应返回给路由器。
- 但是,路由器收到数据包后,所有数据的IP报头中的目的IP地址都是
WAN
口IP,路由器如何判断这个数据是给局域网中的哪个主机呢?又是该给主机上的哪个进程呢?
NAPT:
这个时候NAT
就来解决问题了,采用的是IP + port
的方式建立一个转换表。
如上图所示,局域网中的每台客户端的IP地址都是唯一的,一台客户端上每个进程的端口号又是唯一的,所以将IP地址和端口号组合成IP:port
也是唯一的。
所有客户端,所有进程访问的都是同一台服务器的同一个服务进程,所以它们的目的IP和端口都是相同的。
- 将
源IP:源port
和目的IP:目的port
组合在一起形成一个四元组,这个四元组在局域网中也是唯一的。
一个四元组其实就是IP报头中的一部分,当数据传送到NAT
路由器以后,路由器会维护一份转换表,如上图所示。
转换表中,将局域网四元组的源IP地址替换成WAN
口IP,四元组中的端口号也替换成一个唯一的数字,此时就形成了一个新的四元组,该四元组在公网中是唯一的,然后和旧的四元组形成一个映射关系。
- 这个映射关系是互为键值的。
路由器也是一个主机,客户端A的数据包和客户端B的数据包,它们的四元组不同,路由器就好像是创建了两个“进程”来转发这两个数据包,并且将这两个数据包的源IP地址替换,端口号替换。
由于是路由器的不同“进程”在转发数据包,所以每一对映射关系中,路由器的四元组中的端口号都是不同的,和操作系统分配端口号是一个规则。
当服务器响应多个数据包给NAT
路由器的时候,虽然目的IP地址都是WAN
口IP,但是端口号不同。
路由器再根据不同端口号的公网四元组找到对应的局域网四元组,将数据发给相应客户端的相应进程。
NAT
路由器中的映射关系转换表是由路由器自动维护的。- 假设使用TCP协议,当连接建立时,路由器中就会生成这对通信双方的映射表项,断开连接后就会删除这个表项。
路由器通常情况下都带有NAT
功能,否则无法完成内网和公网的IP地址转换问题。
NAT技术的缺陷:
由于NAT
技术非常依赖映射转换表,所以就有诸多限制:
- 服务器无法从公网主动给内网中的客户端发数据,因为路由器中没有映射关系,映射关系是在客户端给服务端发送数据时建立的。
- 转换表的生成和销毁都需要一定的开销,会增大路由器的负担。
- 通信过程中,一旦
NAT
设备异常,所有的TCP
连接就会出现异常。
😽代理服务器
假设你想买一些韩国的化妆品,但是你去韩国不方便,正好有个同学在韩国留学,此时你就可以让他帮你去实体店买,然后再给你。这个过程中,你同学扮演的就是正向代理的角色。
由于这个化妆品很好,所以你周围有很多人都让你同学帮代购,你同学觉得不停的去买比较麻烦,所以就在他国内的家里屯了一堆化妆品,有人让他代购的时候,他就将家里的化妆品给它,此时你同学扮演的就是反向代理的角色。
假设现在你的学校里办活动需要自己买一些东西,你和你的同学们一起从淘宝买,此时你们使用的都是校园网,淘宝为了满足大量客户的访问,所以它的服务器不止一台,而是一个服务器机群。
你和同学在访问淘宝服务器时,其实并不是你的客户端在直接访问,而是你将自己的请求交给学校的正向代理服务器,然后正向代理服务器代替你去请求淘宝。
当多个请求发送给淘宝服务器时,并不是直接发给了机群中的某台服务器,这样会导致服务器扛不住压力而奔溃。所以这些请求都是交给了淘宝的反向代理服务器。
反向代理服务器通过一些均衡策略,让这些大量的请求去访问不同的服务器,将请求压力分摊给每一台服务器,保证它的正常服务。
- 比如
Nginx
就是专门用来做负载均衡,以及支持大量线程并发访问的服务器。
- 这也就是为什么我们在访问淘宝时,并不需要区分具体哪个服务器,只需要访问淘宝即可。
- 因为我们访问的实际上是淘宝的反向代理服务器。
上面过程中,学校的代理服务器离我们近,它是正向代理服务器,淘宝的代理服务器离我们远,它是反向代理服务器。
如上图所示,假设你用学校的校园网去看《战狼2》电影,你从客户端向腾讯视频发起请求,你的请求会被学校的代理服务器拦截下来,然后由代理服务器替你向腾讯视频发起请求。
腾讯视频收到代理服务器的请求后,将对应的电影资源响应给代理服务器,代理服务器收到响应后再将这个响应转发给你,并且将这个电影的响应缓存到代理服务器中。
你给你的同学推荐了这个电影,你的同学也用腾讯视频看这个电影,当他发起请求后,同样会被代理服务器拦截,然后发现本地有这个电影的缓存资源,就直接将这个资源给他返回了,代理服务器也不再向腾讯视频的服务器发起代理请求了。
这个过程中,你的同学拿到这个电影的资源比你会快很多,因为学校的代理服务器离你们更近。
- 代替客户端发起请求的,就是正向代理服务器。
- 用来作缓存的一般就是反向代理服务器。
实际上,正向代理服务器和反向代理服务器并没有非常明确的界限,就像上面例子中,学校的代理服务器既代替我们发起请求,也缓存了电影资源,它既是一个正向代理服务器也是一个反向代理服务器。
NAT和代理服务器:
代理服务器看起来和NAT设备有一点像,客户端向代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器; 服务器返回结果后,代理服务器又把结果回传给客户端。
局域网中的客户端将请求交给NAT
设备,NAT
设备再将请求通过路由发送给目标服务器,目标服务器再将响应发送给NAT
设备,NAT
设备再将响应转发给局域网中的客户端。
二者的区别:
- 从应用上讲,
NAT
设备是网络基础设备之一,解决的是IP不足的问题。代理服务器则是更贴近具体应用,像迅游这样的加速器,也是通过代理服务器缓存数据来达到加速的目的。 - 从底层实现上讲,
NAT
是工作在网络层,直接对IP地址进行替换。代理服务器工作在应用层。 - 从使用范围上讲,
NAT
一般在局域网的出口部署。代理服务器可以在局域网,也可以在广域网,也可以跨网。 - 从部署位置上看,
NAT
一般集成在防火墙,路由器等硬件设备上,代理服务器则是一个软件程序,需要部署在服务器上。
😽总结
这篇文章填了一些前面的坑,还介绍了网络中常用的技术和协议,是用来完善网络体系才写的,这些内容仅作为了解,并不是重点内容。
相关文章:
【网络】DNS | ICMP | NAT | 代理服务器
🐱作者:一只大喵咪1201 🐱专栏:《网络》 🔥格言:你只管努力,剩下的交给时间! 前面几篇文章虽然讲介绍了整个网络通信的协议栈,我们也知道了完整的网络通信过程ÿ…...
详细手机代理IP配置
嗨,亲爱的朋友们!作为一家代理产品供应商,我知道有很多小伙伴在使用手机进行网络爬虫和数据采集时,常常会遇到一些IP限制的问题。别担心!今天我要给大家分享一下手机IP代理的设置方法,让你们轻松应对这些限…...
【C++】—— 简述C++11新特性
序言: 从本期开始,我将会带大家学习的是关于C11 新增的相关知识!废话不多说,我们直接开始今天的学习。 目录 (一)C11简介 (二)统一的列表初始化 1、{}初始…...
协议的分层结构
1.1TCP/IP 协议 为了使各种不同的计算机之间可以互联,ARPANet指定了一套计算机通信协议,即TCP/IP 协议(族). 注意TCP /IP 协议族指的不只是这两个协议 而是很多协议, 只要联网的都使用TCP/IP协议族 为了减少 协议设计的复杂度 ,大…...
Linux下彻底卸载jenkins
文章目录 1、停服务进程2、查找安装目录3、删掉相关目录4、确认已完全删除 1、停服务进程 查看jenkins服务是否在运行,如果在运行,停掉 ps -ef|grep jenkins kill -9 XXX2、查找安装目录 find / -name "jenkins*"3、删掉相关目录 # 删掉相…...
Nebula基础的查询操作介绍
Nebula基础的查询操作介绍 这里只是对Nebula基础查询进行介绍,其目的是为了让未接触过Nebula的同学最短时间了解其语句。更详细更准确的内可以查看官方文档。 docs.nebula-graph 关于查询这里并没有使用官方例子数据,而是自己实际尝试了文档中的语句。 …...
C++ STL序列式容器(详解)
STL基础 C STL基本组成(6大组件13个头文件) 通常认为,STL 是由容器、算法、迭代器、函数对象、适配器、内存分配器这 6 部分构成,其中后面 4 部分是为前 2 部分服务的,它们各自的含义如表 1 所示。 表 1 STL 组成…...
C++获取map最小值算法,STL---std::min_element()!
std::min_element 定义于头文件 <algorithm> 以下是API文档说明! 寻找范围 [first, last) 中的最小元素。 1) 用 operator< 比较元素。 3) 用给定的二元比较函数 comp 比较元素。 2,4) 同 (1,3) ,但按照 policy 执行。这些重载仅若 std::is…...
如何在Java实现TCP方式发送和接收Socket消息(多线程模式)
目录 导言:正文:1. 创建Server端:2. 创建Client端:3. 多线程模式: 代码示例Server端代码示例:Client端代码示例:同步模式发送TCP消息异步模式 结论: 导言: 在Java编程中…...
SYBASE查询全量字段及对应的表名方法
SELECT COLUMN_name,table_name,user_type,COLUMN_type,width FROM syscolumn a,systable b WHERE a.table_idb.table_id AND COLUMN_name...
Alions 8.6 下 Redis 7.2.0 集群搭建和配置
Redis 7.2.0 搭建和集群配置 一.Redis 下载与单机部署1.Redis 下载2.虚拟机配置3.Redis 单机源码安装和测试4.Java 单机连接测试1.Pom 依赖2.配置文件3.启动类4.配置类5.单元测试6.测试结果 二.Redis 集群部署1.主从1.从节点配置2.Java 测试 2.哨兵1.哨兵节点配置2.复制一个哨兵…...
Android Retrofit 使用及原理详解~
简介 在 Android 开发中,网络请求是一个极为关键的部分。Retrofit 作为一个强大的网络请求库,能够简化开发流程,提供高效的网络请求能力。本文将深入介绍 Retrofit 的高级使用与原理,帮助读者更全面地理解和应用这一库。 什么是…...
三种主要的云交付服务和安全模型
对于许多企业来说,当今的数字化转型之旅包括一个关键决策:采用符合其需求的云交付服务。 云计算已成为现代 IT 基础设施的主要组成部分,具有从可扩展性到成本效率等诸多优势。然而,与所有技术一样,云也有其自身的网络…...
python爬虫实战(3)--爬取某乎热搜
1. 分析爬取地址 打开某乎首页,点击热榜 这个就是我们需要爬取的地址,取到地址某乎/api/v3/feed/topstory/hot-lists/total?limit50&desktoptrue 定义好请求头,从Accept往下的请求头全部复制,转换成json headers {Accep…...
IPv4,IPv6,TCP,路由
主要回顾一下TCP/IP的传输过程,在这个过程中,做了什么事情 ip : 网际协议,IP协议能让世界上任意两台计算机之间进行通信。 IP协议的三大功能: 寻址和路由传递服务:不可靠(尽最大努力交付传输数据包&…...
Java 计算文本相似度
接受一个字符串和一个字符串列表作为参数的 Java 方法,用于计算两个字符串之间的相似度。 方法 import java.util.HashSet; import java.util.List; import java.util.Set;public class StringSimilarity {/*** 计算两个字符串之间的相似度* param str1 第一个字符…...
MySQL 视图
目录 一、视图概述 二、视图的作用和优点 三、视图的使用规则 四、视图操作 1、创建视图 2、查看视图 1)查看视图基本信息 2)查看视图详细信息 3、修改视图 4、更新视图 5、删除视图 一、视图概述 视图是数据库中的一个虚拟表,同真…...
深入理解回调函数qsort:从入门到模拟实现
🍁博客主页:江池俊的博客 💫收录专栏:C语言进阶之路 💡代码仓库:江池俊的代码仓库 🎪我的社区:GeekHub 🎉欢迎大家点赞👍评论📝收藏⭐ 文章目录 前…...
【Git基础】获取远程仓库
我们通常从远程服务器克隆一个Git仓库或者将本地仓库初始化为Git仓库。 1 从远程服务器克隆一个Git仓库 $ git clone https://github.com/your-username/your-repo-name你可以自定义其仓库名称: $ git clone https://github.com/your-username/your-repo-name cu…...
chatGPT界面
效果图: 代码: <!DOCTYPE html> <html> <head><title>复选框样式示例</title> </head> <style>* {padding:0;margin: 0;}.chatpdf{display: flex;height: 100vh;flex-direction: row;}.chatpdf .pannel{widt…...
windows一键启动jupyter
windows一键启动jupyter jupyter简介 Jupyter是一个开源的交互式计算环境,主要用于数据分析、数据可视化和科学计算。它的名字来源于三种编程语言的缩写:Julia、Python和R,这三种语言都可以在Jupyter环境中运行。如果您想进行数据分析、科学…...
树形结构的快速生成
背景 相信大家都遇到过树形结构,像是文件列表、多级菜单、评论区的设计等等,我们都发现它有很多层级,第一级可以有多个,下边的每一个层级也可以有多个;有的可以设计成无限层级的,有的只能设计成两级。那么…...
Android笔记(二十七):自定义Dialog实现居中Toast
背景 记录实现符合项目需求的Toast弹窗 具体实现 class MyTipDialog private constructor(val context: Activity): Dialog(context, R.style.MyTipTheme) {val resId ObservableField(0)private val mainHandler Handler(Looper.getMainLooper())init {setCanceledOnTouc…...
css实现文字的渐变,适合大屏
1 在全局写一个全局样式,文字渐变 2 在组件中使用 CSS3利用-webkit-background-clip: text;实现文字渐变效果_css如何把盒子底部的文字变成透明渐变_I俩月亮的博客-CSDN博客 CSS 如何实现文字渐变色 ?_css字体颜色渐变_一个水瓶座程序猿.的博客-CSDN博客…...
软考高级系统架构设计师系列论文八十七:论企业应用集成
软考高级系统架构设计师系列论文八十七:论企业应用集成 一、企业应用集成相关知识点二、摘要三、正文四、总结一、企业应用集成相关知识点 软考高级系统架构设计师系列之:企业集成平台技术的应用和架构设计二、摘要 本文讨论了某公司的应用系统集成项目。某公司为了应对市场变…...
C++设计模式之适配器模式
一、适配器模式 适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成另一个类所期望的接口,以便两个类能够协同工作。 适配器模式可以解决现有类接口与所需接口不匹配的问题,使得原本因接口不…...
山西电力市场日前价格预测【2023-08-24】
日前价格预测 预测明日(2023-08-24)山西电力市场全天平均日前电价为319.98元/MWh。其中,最高日前电价为370.78元/MWh,预计出现在19: 30。最低日前电价为272.42元/MWh,预计出现在12: 45。 价差方向预测 1: 实…...
一文速学-让神经网络不再神秘,一天速学神经网络基础(一)
前言 思索了很久到底要不要出深度学习内容,毕竟在数学建模专栏里边的机器学习内容还有一大半算法没有更新,很多坑都没有填满,而且现在深度学习的文章和学习课程都十分的多,我考虑了很久决定还是得出神经网络系列文章,…...
百度Q2财报:营收341亿元实现加速增长,净利润高速增长44%,增长强劲全线重构
北京时间8月22日,百度发布了截至2023年6月30日的第二季度未经审计的财务报告。第二季度,百度实现营收341亿元,同比增长15%;归属百度的净利润(non-GAAP)达到80亿元,同比增长44%。营收和利润双双实…...
ARM DIY(二)配置晶振频率
文章目录 前言串口乱码问题定位内核修改晶振频率uboot 修改晶振频率番外篇 前言 上篇文章《ARM DIY 硬件调试》介绍了 DIY ARM 板的基础硬件焊接,包括电源、SOC、SD 卡座等,板子已经可以跑起来了。 但是发现串口乱码,今天就来解决串口乱码问…...
门户网站样式/seo任务平台
1.题目描述: 2.算法分析: 首先肯定是定义一个double类型数组存放数据,然后的一个问题是怎么判断浮点数最近的整数的差, 使用round函数即可 floor : 不大于自变量的最大整数 ceil :不小于自变量的最大整数 round:四舍五入到最邻近…...
淄博网站制作设计定制/企业推广公司
JavaFX教程 - JavaFX按钮当用户单击按钮时,JavaFX Button类可以触发事件。Button类扩展标记的类,它可以显示文本,图像,或两者兼而有之。以下代码显示了如何向Button添加单击操作侦听器。import javafx.application.Application;im…...
做一个在线支付网站/建立一个网站需要多少钱?
一,现象:1. 1 远程连接数据库mariadb时,报错二,定位:2. 1 首先本地连接上数据库,然后操作权限表数据,然后远程再次连接依然连接不上;2. 2 搜索mariadb的配置文件,一一…...
安装wordpress之后/谷歌搜索引擎下载
前提 这里做下笔记,记录下项目中遇到的问题 eslint别名设置 javascrpt开发 没有使用typescript之前,只需要在webpack或者vue.config.js设置alias即可。 // WEBPACK配置 configureWebpack{resolve: {extensions: [.js, .less, .sass, .css, .vue],alias:…...
网站建设seo/每日财经要闻
大家好,我是“前端点线面”,一位新生代农民工,欢迎关注我获取最新前端知识和《前端百题斩》pdf版。1. 前言大家好,我是若川。最近组织了源码共读活动。每周读 200 行左右的源码。很多第一次读源码的小伙伴都感觉很有收获ÿ…...
苹果园做网站的公司/爱战网关键词挖掘查询工具
这可真不是一个人干的活儿啊转载于:https://blog.51cto.com/colinshares/410833...