这是因当DNS在自身权威记录中搜索不到记录时,会到根DNS去解析,而正因为在测试环境不能与外网连接,导致需要一直等待,直到10s后解析失败。
那是否可以做到,当查询不存在的域名时,直接返回失败,而不发起到根DNS查询这一步呢答案是肯定的。
bind的forward功能可以做到。
以下为bind9管理员手册arm(administrator reference manual)对于forward功能的描述
forward
此选项只有当forwarders列表中有内容的时候才有意义。当值是First,默认情况下,使服务器 先查询设置的forwarders,如果他没有得到回答,服务器就会自己寻找答案。如果设定的是 only,服务器就只会把请求转发到其他服务器上去。
根据实际测试,可以做出以下总结:
1 如果是forward first, DNS首先会在本地资源文件查找,如果找不到,就会到forwarders的服务器 里面去找,再找不到,就会自己到根服务器去找,如果联系不到根,就会一直长尝试,持续10s。
2 如果是forward only, DNS首先会在本地资源文件查找,如果找不到,就会到forwarders的服务器 里面去找,再找不到,就直接不找了。
所以,如果要解决本文开始提到的问题,就必须设定forward only,最终两台DNS的配置如下:
DNS1:负责解析权威记录,设置forward only参数,并设置forwarders为DNS2
forward only;
forwarders {DNS2};
DNS2:本地没有权威记录,且设置本身为非递归查询服务器,recursion为no
recursion no;
额外的情况
以baiducom为例子,如果DNS1上有baiducom这个zone,而此时,chinabaiducom需要做NS记录指到ns1baiducom(DNS3)上做解析,此时会产生一个问题。
NS记录与forward究竟哪一个优先呢?答案是forward优先,DNS会认为NS记录并不属于本地权威记录,会优先到forwarders去寻找,因此要消除此效果还需在zone的定义时加上一个参数
zone baiducom {
forwarders {};
};
forwarders为空会令此zone不走转发,接着才会到指定的NS记录上解析。
用户: 需求发起者。
数据传输过程图:
应用程序: 发起数据的传输交流过程。
过程:
过程:
过程:
过程:
过程:
过程:
过程:
注: OSI参考模型总结 - 小白的博客 - CSDN博客
访问服务器的过程可以通过 windows+R 快捷命令 --> 进入运行界面--->然后通过cmd 命令 --->进入控制台--->然后输入命令 tracert + 访问的域名网址-->查看访问过程。
ping命令来测试网络连接:
物理层常见故障:
硬件连接问题:1接触不良2硬件未连通
数据链路层故障:
1MAC地址冲突不能上网;
2交换机与计算机网卡的带宽协商不一致,网速不一致导致网络不通;
3ADSL欠费导致网络不通;
4将计算机错误的连接到VLAN(Virtual Local Area Network)。
注:
网络层故障:
1计算机IP地址设置错误。
2计算机没有设置网关。
3计算机子网掩码配置错误。
4沿途路由器路由表错误。
传输层故障:
表示层故障:
乱码问题(字符集对应错误)
应用层故障:
应用层程序配置问题(浏览器服务器的配置问题导致上网故障等)
物理层安全:
防止非法计算机接入公司网络(包括无线AP)
数据链路层安全:
1设置WiFi密码,属于网络链路层添加秘钥的方法。
2公司内部的交换机可以设置哪个Mac地址可以接入,设置接多少台计算机。
3家里的ASDL拨号上网的需要登入账号密码。
4划分不同的VLAN(Virtual Local Area Network)
网络层安全:
1在路由器上设置ACL控制数据包转发,控制网络。
2在计算机上设置网络安全,设置访问权限。
应用层安全:
发现软件漏洞,增补丁。
TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做套接字(socket)或插口。套接字可以实现将多个客户连接到一个服务器。
它是网络通信中端点的抽象表示,包含进行网络通信必需的五种信息:1连接使用的协议,2本地主机的IP地址,3本地进程的协议端口,4远地主机的IP地址,5远地进程的协议端口。
1域: 套接字通信中使用的网络介质,常见的有AF_INET(因特网络)
2类型:
a 流式套接字(sock_stream): 用于提供面向连接、有序的、可靠的双向jie节流的链接式数据传输服务,由类型sock_stream指定,他是在AF_INET域中通过TCP/IP链接实现的。
b 数据报套接字(sock_dgram): 提供了一种无连接的服务,是AF_INET域中通过UDP/IP链接实现的。
c 原始套接字(sock_raw): 允许对较低层次的协议直接访问,比如IP、ICMP协议,他常用于检验新的协议的实现或者访问现有服务中配置的新设备。网络监听技术很大程度上依赖于socket_raw
3协议: 套接字协议一般采用默认值。即默认参数为0。
1套接字是用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
2当前应用进程需要使用网络进行通信时,就会发出系统调用,请求 *** 作系统为其创建“套接字”,以便把网络通信所需要的系统资源分配给该应用进程。
3 *** 作系统为这些资源的总和,用一个叫做套接字描述符的号码表示,并把此号码返回给应用进程,应用进程所进行的网络 *** 作都必须使用这个号码。
4通信完毕后,应用进程通过一个关闭套接字的系统调用通知 *** 作系统回收与该“号码”相关的所有资源。
1连接创建阶段
a套接字被创建后,其端口号和IP地址都是空的,应用进程调用bind(绑定)来指明套接字的本地地址(在服务器端调用bind时就是把熟知端口号和本地IP填写到已创建的套接字中)
b服务器调用bind后 ,还必须调用listen(收听)把套接字设置为被动方式,以便随时接收客户的服务请求。(UDP服务器由于只提供了无限连接服务,不使用listen系统调用)
c客户进程发送连接请求后,服务器紧接着调用accept(接受),以把客户进程发来的连接请求提取出来。(系统调用accept的一个变量就是要指明哪一个套接字发起的连接。)
2数据传输阶段
客户和服务器都在TCP连接上使用send系统调用传送数据,使用recv系统调用接收数据。
3连接释放阶段
一旦客户或者服务器结束使用套接字,就把套接字撤销,此时调用close释放连接和撤销套接字。应用层总结-系统调用和应用编程接口 - 十分残念的博客 - CSDN博客
其过程示意图如下:
网络编程的目的:
直接或间接地通过网络协议与其他计算机进行通讯。
网络编程的问题:
1如何准确的定位网络上一台或多态主机。
2找到主机后,如何快速高效的传输数据。
网络编程的对象:
传输层提供的面向应用的可靠或非可靠的数据传输机制。
网络编程流行模型:
1CS模型(客户端/服务器模型)
2BS模型(浏览器/服务器模型)
参考网络编程--Socket(套接字) - A-祥子 - 博客园
注: 扩展链接内关于TCP/IP的相关知识讲解也相当详细,可以参考浏览一下。
bind()函数的使用方法很简单,但是它是怎么实现的呢?
本文将从应用层出发,沿着网络协议栈,分析了bind()、 listen()的系统调用、Socket层实现,以及它的TCP层实现。
应用层
int bind(int sockfd, const struct sockaddr my_addr, socklen_t addrlen);
bind() gives the socket sockfd the local address my_addr
给socket描述符绑定IP和端口,一般服务器才需要。端口号的范围为0 ~ 65535。调用bind()时,一般不要把端口号置为小于1024的值,因为1到1023是保留端口号。
系统调用
bind()是由glibc提供的,声明位于include/sys/socketh中,实现位于sysdeps/mach/hurd/bindc中,主要是用来从用户空间进入名为sys_socketcall的系统调用,并传递参数。sys_scoketcall()实际上是所有socket函数进入内核空间的共同入口。
在sys_socketcall()中会调用sys_bind()。
经过了socket层的总入口sys_socketcall(),现在进入sys_bind()。
经过了socket层的总入口sys_socketcall(),现在进入sys_bind()。
通过文件描述符,找到对应的file结构。
通过file结构,找到对应的socket结构。
把用户空间的socket地址复制到内核空间,同时检查是否合法,成功返回0。
socket层
SOCK_STREAM套接口的socket层 *** 作函数集实例为inet_stream_ops,其中绑定函数为inet_bind()。
socket层做的主要事情为合法性检查、绑定IP地址,而真正的端口绑定是在TCP层进行的。
应用层
int listen(int sockfd, int backlog);
Accept incoming connections and a queue limit for incoming connections
backlog的定义
Now it specifies the queue length for completely established sockets waiting to be accepted,
instead of the number of incomplete connection requests The maximum length of the queue
for incomplete sockets can be set using the tcp_max_syn_backlog sysctl When syncookies
are enabled there is no logical maximum length and this sysctl setting is ignored
全连接队列的最大长度:
backlog保存的是完成三次握手、等待accept的全连接,而不是半连接。
负载不高时,backlog不用太大。(For complete connections)
系统最大的、未处理的全连接数量为:min(backlog, somaxconn),netcoresomaxconn默认为128。
半连接队列的最大长度:
tcp_max_syn_backlog默认值为256。(For incomplete connections)
当使用SYN Cookie时,这个参数变为无效。
半连接队列的最大长度为backlog、somaxconn、tcp_max_syn_backlog的最小值。
listen()是由glibc提供的,声明位于include/sys/socketh中,实现位于sysdeps/mach/hurd/listenc中,主要是用来从用户空间进入名为sys_socketcall的系统调用,并传递参数。sys_socketcall()实际上是所有socket函数进入内核空间的共同入口。
在sys_socketcall()中会调用sys_listen()。
经过了socket层的总入口sys_socketcall(),现在进入sys_listen()。
SOCK_STREAM套接口的socket层 *** 作函数集实例为inet_stream_ops,其中监听函数为inet_listen()。
检查套接口的状态、当前连接的状态是否合法,然后调用inet_csk_listen_start()启动监听。
启动监听时,做的工作主要包括:
listen_sock结构用于保存SYN_RECV状态的连接请求块,所以也叫半连接队列。
(1)创建
queue是连接请求控制块,nr_table_entries是半连接的最大个数,即backlog。
(2)销毁
销毁连接请求块中的listen_sock实例,释放半连接队列。
在调用bind函数是,可以指定一个端口号,或指定一个IP地址,也可以两者都指定,还可以都不指定。 服务器在启动时捆绑它们的众所周知端口。如果一个TCP客户或服务器未曾调用bind捆绑一个端口,当调用connect或listen时,内核就要为相应的套接字选择一个临时端口。bind相关文件:主要有2个,一个区域文件/etc/namedrfc1912zones,主要的作用是申明dns为哪个区域(zone)服务。另外一个是解析数据文件/var/named/,主要作用是保存主机名和ip的这种对应关系,其中/var/named/namedca是存放13个根域服务器的位置。模板文件:/usr/share/doc/bind-9114/,etc目录针对配置文件的模板,var针对解析数据的模板。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)