DNS出现及演化

网络出现的早期 是使用IP地址通讯的,那时就几台主机通讯。但是随着接入网络主机的增多,这种数字标识的地址非常不便于记忆,UNIX上就出现了建立一个叫做hosts的文件(Linux和windows也继承保留了这个文件)。这个文件中记录这主机名称和IP地址的对应表。这样只要输入主机名称,系统就会去加载hosts文件并查找对应关系,找到对应的IP,就可以访问这个IP的主机了。

但是后来主机太多了,无法保证所有人都能拿到统一的最新的hosts文件,就出现了在文件服务器上集中存放hosts文件,以供下载使用。互联网规模进一步扩大,这种方式也不堪负重,而且把所有地址解析记录形成的文件都同步到所有的客户机似乎也不是一个好办法。这时DNS系统出现了,随着解析规模的继续扩大,DNS系统也在不断的演化,直到现今的多层架构体系。

DNS概括

DNS(Domain Name System,域名系统),因特网上作为域名和IP地址互相映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。

DNS的分布数据库是以域名为索引的,每个域名实际上就是一棵很大的逆向树中路径,这棵逆向树称为域名空间(domain name space),如下图所示树的最大深度不得超过127层,树中每个节点都有一个可以长达63个字符的文本标号。

DNS域名解析过程

首先,客户端检测自身缓存,如果没有,检测hosts文件,如果没有,客户端发出DNS请求翻译IP地址或者主机名。DNS服务器在收到客户机的请求后:

1)检查DNS服务器的缓存,若查到请求的地址或名字,即向客户机发出应答信息;

2)若没有查到,则在数据库中查找,若查到请求的地址或名字,即向客户机发出应答信息;

3)若没有查到,则将请求发给根域DNS服务器,并依序从根域查找顶级域,由顶级域查找二级域,二级域查找三级,直至找到要解析的地址或名字,即向客户机所在网络的DNS服务器发出应答信息,DNS服务器收到应答后先在缓存中存储,然后将解析结果发给客户机。

4)若没有找到,则返回错误信息。

DNS分类

主DNS服务器:就是一台存储着原始资料的DNS服务。

从DNS服务器:使用自动更新方式从主DNS服务器同步数据的DNS服务器。也称辅助DNS服务器。

备注:一般生产环境,主DNS服务器做管理使用,从DNS服务器提供服务。

缓存服务器:不负责本地解析,采用递归方式转发客户机查询请求,并返回结果给客户机的DNS服务器。同时缓存查询回来的记过,也叫递归服务器。

转发器:这台DNS发现非本机负责的查询请求时,不再向根域发起请求,而是直接转发给指定的一台或者多台服务器。自身并不缓存查询结果。

DNS中记录类型

DNS命名规范

1.  26个英文字母

2. “0,1,2,3,4,5,6,7,8,9,”十个数字

3. “-”(英文中的连词号)

4.  最多63字节长度

备注:要不按照这个规范命名,bing支不支持? 支持,不合适,不建议。 非要不按照这个,怎么办? master-view文件上配置check-name ignore;

DNS三个命令:DIG、NSLOOKUP、HOST介绍

# yum install bind-utils -y

DNS原理入门 http://www.ruanyifeng.com/blog/2016/06/dns.html

DNS发展趋势

1、DNSMASQ

DNSmasq是一个小巧且方便地用于配置DNS和DHCP的工具,适用于小型网络,它提供了DNS功能和可选择的DHCP功能。它服务那先只在本地使用的域名,这些域名是不会在全球的DNS服务器中出现的。

DHCP服务器和DNS服务器结合,并且允许DHCP分配的地址能在DNS中正常解析,而这些DHCP分配的地址和相关命令可以配置到每台主机中,也可以配置到一台核心设备中(比如路由器),DNSmasq支持静态和动态两种DHCP配置方式。

有一些公司在每台服务器上都起着dnsmasq,充当本地dns缓存服务,来提高dns解析性能同时减轻dnsserver的压力。

2、HTTPDNS

但凡使用域名来给用户提供服务的互联网企业,都或多或少无法避免在有中国特色的互联网环境中遭遇到各种域名被缓存、用户跨网访问缓慢等问题。

首先是域名缓存,不同运营商、不同节点的缓存时间设置的差别较大。这样在流量切换时,就会产生新、旧应用数据不一致的现象。

其次就是域名解析过了太多层的nat,这就导致dns获取客户端地址时很难准确定位,从而智能dns的准确度大打折扣。

最近几年httpdns出现了,用户明确的知道我在访问某厂的服务时,应该去找哪个ip要对应的域名,实现这个的前提是你可以左右用户的访问习惯,目前应用最合适的场景是app。

  • DNS中递归查询和迭代查询的区别

1、 递归查询: 一般客户机和服务器之间属递归查询,即当客户机向DNS服务器发出请求后,若DNS服务器本身不能解析,则会向另外的DNS服务器发出查询请求,得到结果后转交客户机。

2、 迭代查询(反复查询): 一般DNS服务器之间属迭代查询,如:若DNS2不能响应DNS1的请求,则它会将DNS3的IP给DNS2,以便其再向DNS3发出请求。

以一个DNS请求解析为例:

1)用户发起域名请求到dnsA,这时dnsA有这个记录,将结果返回给用户,这个过程是递归查询。

2)用户发起域名请求到dnsA,这时dns没有这个记录,它去向dnsB问有没有这个记录,以此类推,直到把结果返回给用户,这个过程是递归查询。

3)用户发起域名请求到dnsA,这时dnsA没有这个记录,它告诉用户,我没有这个记录,你去问dnsB吧,这个过程是迭代查询。

#####################################################

  • DNS部署(主从)

安装环境:CentOS 6.8

准备两台主机:192.168.137.13(主DNS)、192.168.137.14(从DNS)

EPEL仓库使用阿里源

# rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-6.noarch.rpm

192.168.137.13(主DNS)安装

# yum install -y bind-utils bind bind-devel bind-chroot

检查

# rpm -qa |grep bind

配置named.conf文件

# vim /etc/named.conf
options {
version "1.1.1";
listen-on port 53 {any;};
directory "/var/named/chroot/etc/";
pid-file "/var/named/chroot/var/run/named/named.pid";
allow-query { any; };
Dump-file "/var/named/chroot/var/log/binddump.db";
Statistics-file "/var/named/chroot/var/log/named_stats";
zone-statistics yes;
memstatistics-file "log/mem_stats";
empty-zones-enable no;
forwarders {202.106.196.115;8.8.8.8; };
}; key "rndc-key" {
algorithm hmac-md5;
secret "Eqw4hClGExUWeDkKBX/pBg==";
}; controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
}; logging {
channel warning {
file "/var/named/chroot/var/log/dns_warning" versions 10 size 10m;
severity warning;
print-category yes;
print-severity yes;
print-time yes;
};
channel general_dns {
file "/var/named/chroot/var/log/dns_log" versions 10 size 100m;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
category default {
warning;
};
category queries {
general_dns;
};
}; include "/var/named/chroot/etc/view.conf";

配置rndc.key文件

# vim /etc/rndc.key
key "rndc-key" {
algorithm hmac-md5;
secret "Eqw4hClGExUWeDkKBX/pBg==";
};

配置rndc.conf文件

# vim /etc/rndc.conf
key "rndc-key" {
algorithm hmac-md5;
secret "Eqw4hClGExUWeDkKBX/pBg==";
}; options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};

配置view.conf文件

# vim /var/named/chroot/etc/view.conf
view "View" {
zone "swj.com" {
type master;
file "shhnwangjian.com.zone";
allow-transfer {
192.168.137.14;
};
notify yes;
also-notify {
192.168.137.14;
};
};
};

配置shhnwangjian.com.zone文件

# vim /var/named/chroot/etc/shhnwangjian.com.zone
$ORIGIN .
$TTL 3600 ; 1 hour
swj.com IN SOA op.swj.com. dns.swj.com. (
2000 ; serial
900 ; refresh (15 minutes)
600 ; retry (10 minutes)
86400 ; expire (1 day)
3600 ; minimum (1 hour)
)
NS op.swj.com.
$ORIGIN swj.com.
shanks A 1.2.3.4
op A 1.2.3.4
a A 1.2.3.4

1)Serial:只是一个序号,但这个序号可被用来作为slave与master更新的依据。

举例来说,master序号为100但slave序号为90时,那么这个zone file的资料就会被传送到slave来更新了。由于这个序号代表新旧资料,通常我们建议你可以利用日期来设定。例如上面的资料是在2015/10/20所写的第一次,所以用2015102001作为序号代表。(yyyymmddnn,nn代表这一天是第几次修改)

2)Refresh:除了根据Serial来判断新旧之外,我们可以利用这个refresh(更新)命令slave多久进行一次主动更新、

3)Retry:如果到了Refresh的时间,但是slave却无法连接到master时,那么在多久之后,slave会再次的主动尝试与主机连接。

4)Expire:如果slave一直无法与master连接上,那么经过多久的时间之后,则命令slave不要再连接了。也就是说,此时我们假设masterDNS可能遇到重大问题而无法上线,则等待系统管理员处理完毕后,再重新到slaveDNS重启bind。

5)Minimum:这个类似TTL。

修改目录权限,并启动服务

# cd /var && chown -R named.named named/
# /etc/init.d/named start
# chkconfig named on

解析测试

# dig @127.0.0.1 a.swj.com

备注:修改配置文件可以执行rndc reload

192.168.137.14(从DNS)

# yum install -y bind-utils bind bind-devel bind-chroot

配置named.conf文件

# vim /etc/named.conf
options {
version "1.1.1";
listen-on port 53 {any;};
directory "/var/named/chroot/etc/";
pid-file "/var/named/chroot/var/run/named/named.pid";
allow-query { any; };
Dump-file "/var/named/chroot/var/log/binddump.db";
Statistics-file "/var/named/chroot/var/log/named_stats";
zone-statistics yes;
memstatistics-file "log/mem_stats";
empty-zones-enable no;
forwarders {202.106.196.115;8.8.8.8; };
}; key "rndc-key" {
algorithm hmac-md5;
secret "Eqw4hClGExUWeDkKBX/pBg==";
}; controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
}; logging {
channel warning {
file "/var/named/chroot/var/log/dns_warning" versions 10 size 10m;
severity warning;
print-category yes;
print-severity yes;
print-time yes;
};
channel general_dns {
file "/var/named/chroot/var/log/dns_log" versions 10 size 100m;
severity info;
print-category yes;
print-severity yes;
print-time yes;
};
category default {
warning;
};
category queries {
general_dns;
};
}; include "/var/named/chroot/etc/view.conf"; 

配置rndc.key文件

# vim /etc/rndc.key
key "rndc-key" {
algorithm hmac-md5;
secret "Eqw4hClGExUWeDkKBX/pBg==";
};

配置rndc.conf文件

# vim /etc/rndc.conf
key "rndc-key" {
algorithm hmac-md5;
secret "Eqw4hClGExUWeDkKBX/pBg==";
}; options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};

备注:主从DNS主机配置named.conf、rndc.key、rndc.conf文件一样

配置view.conf文件

# vim /var/named/chroot/etc/view.conf
view "SlaveView" {
zone "swj.com" {
type slave;
masters {192.168.137.13; };
file "slave.shhnwangjian.com.zone";
};
};

修改目录权限,并启动服务

# cd /var && chown -R named.named named/
# /etc/init.d/named start
# chkconfig named on

添加A、CNAME、MX、PTR记录(主DNS)

A记录

编辑master节点/var/named/chroot/etc/shhnwangjian.com.zone,在文件末尾添加记录

a               A       192.168.1.100
将serial + 1

执行rndc reload

检查从DNS主机,slave.shhnwangjian.com.zone文件已同步更新。

CNAME记录

编辑master节点/var/named/chroot/etc/shhnwangjian.com.zone,在文件末尾添加记录

cname       CNAME   a.swj.com.
将serial + 1

执行rndc reload

检查从DNS主机,slave.shhnwangjian.com.zone文件已同步更新。

测试 host a.swj.com 127.0.0.1

MX记录

编辑master节点/var/named/chroot/etc/shhnwangjian.com.zone,在文件末尾添加记录

mx      MX 5    192.168.1.101
将serial + 1

执行rndc reload

检查从DNS主机,slave.shhnwangjian.com.zone文件已同步更新。

测试 host mx.swj.com 127.0.0.1

PTR记录(反向解析)

编辑master节点/var/named/chroot/etc/view.conf,加入ptr的zone配置

zone "168.192.in-addr.arpa" {
type master;
file "168.192.zone";
allow-transfer{
192.168.137.14;
};
notify yes;
also-notify{
192.168.137.14;
};
};

编辑master节点/var/named/chroot/etc/168.192.zone

$TTL 3600       ; 1 hour
@ IN SOA op.swj.com. dns.swj.com. (
2003 ; serial
900 ; refresh (15 minutes)
600 ; retry (10 minutes)
86400 ; expire (1 day)
3600 ; minimum (1 hour)
)
NS op.swj.com.
100.1 IN PTR a.swj.com.

修改168.192.zone文件属主

# chown named.named 168.192.zone
# rndc reload

编辑slave节点/var/named/chroot/etc/view.conf,加入ptr的zone配置

zone "168.192.in-addr.arpa" {
type slave;
masters {192.168.137.13; };
file "slave.168.192.zone";
};

执行rndc reload

slava节点/var/named/chroot/etc目录下生成slave.168.192.zone文件。

解析测试: host 192.168.1.100 127.0.0.1

DNS实现服务的负载均衡

编辑master节点/var/named/chroot/etc/shhnwangjian.com.zone,在文件末尾添加记录

1
2
a               A       192.168.1.102
将serial + 1

执行rndc reload

master和slave执行解析:nslookup a.swj.com 127.0.0.1,结果如下(轮询)

  • 配置DNS视图(智能DNS)

编辑master节点/var/named/chroot/etc/named.conf,在include上面添加(对客户端IP分组)

acl group1 {
192.168.137.13;
}; acl group2 {
192.168.137.14;
};

编辑master节点/var/named/chroot/etc/view.conf

view "GROUP1" {
match-clients { group1; };
zone "viewswj.com" {
type master;
file "group1.viewswj.com.zone";
};
}; view "GROUP2" {
match-clients { group2; };
zone "viewswj.com" {
type master;
file "group2.viewswj.com.zone";
};
};

编辑master节点/var/named/chroot/etc/group1.viewswj.com.zone

$ORIGIN .
$TTL 3600 ; 1 hour
viewswj.com IN SOA op.viewswj.com. dns.viewswj.com. (
2000 ; serial
900 ; refresh (15 minutes)
600 ; retry (10 minutes)
86400 ; expire (1 day)
3600 ; minimum (1 hour)
)
NS op.viewswj.com.
$ORIGIN viewswj.com.
view A 192.168.122.1
op A 192.168.122.1

编辑master节点/var/named/chroot/etc/group2.viewswj.com.zone

$ORIGIN .
$TTL 3600 ; 1 hour
viewswj.com IN SOA op.viewswj.com. dns.viewswj.com. (
2000 ; serial
900 ; refresh (15 minutes)
600 ; retry (10 minutes)
86400 ; expire (1 day)
3600 ; minimum (1 hour)
)
NS op.viewswj.com.
$ORIGIN viewswj.com.
view A 192.168.122.2
op A 192.168.122.2

修改文件属主,加载配置

# chown named.named /var/named/chroot/etc/group*.zone
# rndc reload

测试,在192.168.137.13主机上执行host view.viewswj.com 192.168.137.13

在192.168.137.14主机上执行host view.viewswj.com 192.168.137.13

构建DNS(企业级)

1、硬件选型

CPU:12C以上配置

内存:16G

网络:千兆

2、初始化系统配置

关闭 iptables

# service iptables stop
# chkconfig iptables off

关闭 selinux

# vim /etc/sysconfig/selinux
SELINUX=disabled

调整ulimit限制

vim /etc/security/limits.conf
* soft nproc 65536
* hard nproc 65536
* soft nofile 65536
* hard nofile 65536

3、高性能、高可用DNS

1)高可用

物理层:  首先确保两台lvs不在同一机柜、同一物理交换机接入;

其次确保将所有dns服务器也做到不在同一机柜、同一物理交换机接入;

在不通的idc构建多套dns集群,为客户端提供可切换的配置。

服务层:  坚决摒弃lvs上端口检测这种方式,采用自定义脚本检测,为dns的健康检测单独设置一个域名,为了lvs检测dns是否存活而设计。

客户端层:  多idc之间的流量切换是通过客户端的健康检测cron实现的,脚本可以按分钟运行一次,分别检测每个dns集群虚地址的可用性。

#!/bin/sh
timeout=5
Q=""
host="/usr/bin/host"
if test -z "$1" ; then
echo "You need to supply a DNS server to check. Quittind"
exit;
fi
SERVER=$10
ERC=`$host -s -w $timeout $Q SERVER > /dev/null 2>$1; echo $?`
if [ $ERC -eq 0 ] ; then
exit 0
else
exit 10
fi

2)高性能

通过lvs可以对每个集群做横向扩容,是否需要扩容的依据是对现有系统的压测结果,以及实时的监控数据。或者可以在最靠近应用层处,加上一次cache-only集群,但前提是你的线上环境中,没有任何系统依赖于dns负载均衡。

4、压测

# cd /usr/local/src/
# wget http://ftp.isc.org/isc/bind9/9.9.1-P1/bind-9.9.9-P1.tar.gz
# tar -xvf bind-9.9.9-P1.tar.gz
# cd /usr/local/src/bind-9.9.9-P1/contrib/queryperf
# ./configure
# makecp queryperf /usr/bin

压测自己创建的DNS服务,创建一个文件test.txt,内容如下(前面为域名,后面为A记录)

view.viewswj.com A
view.viewswj.com A
view.viewswj.com A
view.viewswj.com A
view.viewswj.com A

执行命令: /usr/bin/queryperf -d test.txt -s 192.168.137.13

结果:

DNS Query Performance Testing Tool
Version: $Id: queryperf.c,v 1.12 2007/09/05 07:36:04 marka Exp $ [Status] Processing input data
[Status] Sending queries (beginning with 192.168.137.13)
[Status] Testing complete Statistics: Parse input file: once
Ended due to: reaching end of file Queries sent: 5 queries
Queries completed: 5 queries
Queries lost: 0 queries
Queries delayed(?): 0 queries RTT max: 0.000283 sec
RTT min: 0.000017 sec
RTT average: 0.000142 sec
RTT std deviation: 0.000076 sec
RTT out of range: 0 queries Percentage completed: 100.00%
Percentage lost: 0.00% Started at: Wed Oct 26 21:49:31 2016
Finished at: Wed Oct 26 21:49:31 2016
Ran for: 0.000311 seconds Queries per second: 16077.170418 qps

5、监控

系统基础性能: 使用zabbix自带的模板。CPU、内存、硬盘、系统load等

LOOPBACK地址绑定状态监控: 该架构中,dnsserver在集群中充当realserver的角色,在dr中,需要绑定lookback地址方能同信,因此当loopback地址没有绑定上是,lvs健康检测通过,但是当请求到达dnsserver时,请求被拒绝,dns集群会出现异常。

DNS数据与MASTER一致性监控:

1)通过写zabbix自定义discovery,获取dns配置中所有zone,然后分别比对slave和master每个zone的serial值,当slave与master的值持续5分钟不一致报警。

2)写脚本,每15分钟获取master上所有域名解析结果,与每个slave的结果比对,当出现结果不一致情况时报警。

DNS响应时间监控:远端一组主机跑在fullnat下(提供高可用),通过dig命令检测dnsserver的响应时间。

DNS每秒请求数监控:在每台dns主机上,编写zabbix脚本,分析named_state文件,获取每秒请求数。

DNS可用性监控:远端一组主机跑在fullnat下(提供高可用),通过hosts命令检测dnsserver的可用性,脚本与lvs健康检测脚本类似。

学习DNS(二)的更多相关文章

  1. crawler4j 学习(二)

    crawler4j 学习(二) 实现控制器类以制定抓取的种子(seed).中间数据存储的文件夹.并发线程的数目: public class Controller { public static voi ...

  2. 从零开始学习jQuery (二) 万能的选择器

    本系列文章导航 从零开始学习jQuery (二) 万能的选择器 一.摘要 本章讲解jQuery最重要的选择器部分的知识. 有了jQuery的选择器我们几乎可以获取页面上任意的一个或一组对象, 可以明显 ...

  3. Android Animation学习(二) ApiDemos解析:基本Animators使用

    Android Animation学习(二) ApiDemos解析:基本Animatiors使用 Animator类提供了创建动画的基本结构,但是一般使用的是它的子类: ValueAnimator.O ...

  4. AspectJ基础学习之二搭建环境(转载)

    AspectJ基础学习之二搭建环境(转载) 一.下载Aspectj以及AJDT 上一章已经列出了他的官方网站,自己上去download吧.AJDT是一个eclipse插件,开发aspectj必装,他可 ...

  5. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  6. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  7. MyBatis学习系列二——增删改查

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...

  8. MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存

    目录(?)[-] 二SQL语句映射文件2增删改查参数缓存 select insert updatedelete sql parameters 基本类型参数 Java实体类型参数 Map参数 多参数的实 ...

  9. MyBatis学习 之 二、SQL语句映射文件(1)resultMap

    目录(?)[-] 二SQL语句映射文件1resultMap resultMap idresult constructor association联合 使用select实现联合 使用resultMap实 ...

  10. UML学习(二)-----类图

    UML学习(二)-----类图 http://www.cnblogs.com/silent2012/archive/2011/09/07/2169946.html http://www.cnblogs ...

随机推荐

  1. Centos7使用kubeadm安装1.23.1版本的k8s集群

    系统环境 #cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) #Linux内核一定要大约等于3.10,也就是centos版本要大 ...

  2. 在 Linux 下确认 NTP 是否同步的方法

    NTP 意即网络时间协议Network Time Protocol,它通过网络同步计算机系统之间的时钟.NTP 服务器可以使组织中的所有服务器保持同步,以准确时间执行基于时间的作业.NTP 客户端会将 ...

  3. gurbi安装

    1,下载相应版本gurobi,msi文件,双击安装.注意安装路径,一般默认,否则容易出错. 2,注册gurobi账号,在校园网下电脑终端运行许可grbgetkey 3,添加许可路径到系统path 4, ...

  4. c/c++中sort函数用法

    转载自博主:九江镇中https://www.cnblogs.com/jjzzx/ c++标准库里的排序函数的使用方法 I)Sort函数包含在头文件为#include<algorithm>的 ...

  5. docker学习笔记(4)——Dockerfile

    参考资料: 1.官网教程:https://docs.docker.com/engine/reference/builder/ (官网教程,稍后我做一下总结和翻译输出到本文) 2.官网练习推荐:http ...

  6. sprintf的用法总结

    大概知道sprintf的用法,今天在CSDN上看到一篇关于sprintf比较好的总结,现在抄下来,emmmmmmm....... srpintf()函数的功能非常强大:效率比一些字符串操作函数要高:而 ...

  7. 支持向量机(SVM):用一条线分开红豆与绿豆

    算法原理 要找到一些线,这些线都可以分割红豆和绿豆,找到正确的方向或者斜率的那条线,确认马路的宽度,得到最优解--马路的中轴 超平面:在三维空间中,平面是两个点距离相同的点的轨迹.一个平面没有厚度,而 ...

  8. ArcMap线上均匀生成点

    面中均匀生成点方法: [创建渔网]→[要素转点](或[要素折点转点])→[裁剪](或[按位置选择]→[导出数据]),即可. ArcMap中随机生成点: [随机生成点]工具 最近博主的朋友有均匀布点的需 ...

  9. Prism 框架解读之一系列

    名词解释 1.什么是IOC IOC是 Inversion of Control的缩写,多数书籍翻译成"控制反转". IOC 和依赖注入(DI) 所谓依赖注入,就是由IOC容器在运行 ...

  10. Linux 电子数据取证入门

    目录 Linux Basic Analysis 一.常见的Linux 发行版 二.Linux 系统的典型目录结构(Dir Structure) 三.Linux 系统重要文件夹与文件的内容 四.Linu ...