NETBIOS协议是由IBM公司开发,主要用于数十台计算机的小型局域网。该协议是一种在局域网上的程序可以使用的应用程序编程接口(API),为程序提供了请求低级服务的统一的命令集,作用是为了给局域网提供网络以及其他特殊功能。系统可以利用WINS服务、广播及Lmhost文件等多种模式将NetBIOS名-——特指基于NETBIOS协议获得计算机名称——解析为相应IP地址,实现信息通讯,所以在局域网内部使用NetBIOS协议可以方便地实现消息通信及资源的共享。因为它占用系统资源少、传输效率高,所以几乎所有的局域网都是在NetBIOS协议的基础上工作的。NetBIOS是Network Basic Input/Output System的简称,一般指用于局域网通信的一套API NetBIOS是一个网络协议,在上世纪80年代早期由IBM和Sytec联合开发,用于所谓的PC-Network。虽然公开发表的文档很少,协议的API却成为了事实上的标准。 随着PC-Network被令牌环和以太网取代,NetBIOS也应该退出历史舞台。但是,由于很多软件使用了NetBIOS的API,所以NetBIOS被适配到了各种其他的协议上,比如IPX/SPX和TCP/IP。 使用令牌环和以太网传输的NetBIOS现在被称为NetBEUI。在Micrsoft Windows 98发布之前,一直广泛使用。在TCP/IP上运行的NetBIOS称为NBT,由RFC 1001和RFC 1002定义。NBT的基本思想是在基于IP的网络上模拟基于NetBIOS的PC-Network。NBT在Windows 2000中引入,是现在首选的NetBIOS传输。 NetBIOS是网络的基本输入输出系统。 NetBIOS 定义了一种软件接口以及在应用程序和连接介质之间提供通信接口的标准方法。NetBIOS 是一种会话层协议,应用于各种 LAN (Ethernet、Token Ring 等)和 WAN 环境,诸如 TCP/IP、PPP 和 X.25 网络。 NetBIOS 使得应用程序无需了解包括差错恢复(会话模式)在内的网络细节。NetBIOS 请求以网络控制块(NCB:Network Control Block)的形式提供,NCB 中包含了信息存放位置和目标名称等信息。 NetBIOS 提供开放系统互联(OSI)模型中的会话层和传输层服务,但不支持标准帧或数据格式的传输。NetBIOS 扩展用户接口(NetBEUI)支持标准帧格式,它为 NetBIOS 提供网络层和传输层服务支持。 NetBIOS 支持两种通信模式:会话(session)或数据报(datagram)。会话模式是指两台计算机为“对话”建立一个连接,允许处理大量信息,并支持差错监测和恢复功能。数据报模式面向“无连接”(信息独立发送)操作,发送的信息较小,由应用程序提供差错监测和恢复功能。此外数据报模式也支持将信息广播到局域网中的每台计算机上。 NetBIOS 名称为 16 字节长(必要情况下使用填充位填满),对使用的字节值几乎没有限制。对于不执行路由的小型网络,将 NetBIOS 名称映射到 IP 地址上有三种方法: 1. IP 广播 - 当目标地址不在本地 cache 上时,广播一个 包含目标计算机 NetBIOS 名称的数据包。目标计算机返回其 IP 地址。 2. lmhosts 文件 - 这是一个负责映射 IP 地址和 NetBIOS 计算机名称的文件。 3. NBNS - NetBIOS 命名服务器负责将 NetBIOS 名称映射到 IP 地址上。该服务由 Linux 环境下的后台程序(nmbd daemon)执行。 NetBIOS 数据包有很多不同格式,主要取决于服务和信息类型,以及用以传送 NetBIOS 数据包的传输协议。NetBIOS 包含三种基本服务:NAME、SESSION 和 DATAGRAM。作为例子,我们提供 TCP/IP 环境中的 NetBIOS 名称数据包格式: Header (12 bytes) Question Entry (variable) Answer Resource Records (variable) Authority Resource Records (variable) Additional Resource Records (variable) NBTSTAT命令可以用来查询涉及到NetBIOS信息的网络机器。另外,它还可以用来消除NetBIOS高速缓存器和预加载LMHOSTS文件。这个命令在进行安全检查时非常有用。 用法:nbtstat [-a RemoteName] [-A IP_address] [-c] [-n] [-R] [-r] [-S] [-s] [-RR] 参数 :-a 列出为其主机名提供的远程计算机名字表。 -A 列出为其IP地址提供的远程计算机名字表。 -c 列出包括了IP地址的远程名字高速缓存器。 -n 列出本地NetBIOS名字。 -r 列出通过广播和WINS解析的名字。 -R 消除和重新加载远程高速缓存器名字表。 -S 列出有目的地IP地址的会话表。 -s 列出会话表对话。 -RR 发送数据包名称到WINS,然后开始刷新 NBTSTAT生成的列标题具有以下含义: Input :接收到的字节数。 Output :发出的字节数。 In/Out :无论是从计算机(出站)还是从另一个系统连接到本地计算机(入站)。 Life :在计算机消除名字表高速缓存表目前“度过”的时间。 Local Name :为连接提供的本地NetBIOS名字。 Remote Host :远程主机的名字或IP地址。 Type :一个名字可以具备两个类型之一:unique or group 在16个字符的NetBIOS名中,最后一个字节往往有具体含义,因为同一个名可以在同一台计算机上出现多次。这表明该名字的最后一个字节被转换成了16进制。 State NetBIOS连接将在下列“状态”(任何一个)中显示: 状态含义: Accepting: 进入连接正在进行中。 Associated: 连接的端点已经建立,计算机已经与IP地址联系起来。 Connected: 这是一个好的状态!它表明您被连接到远程资源上。 Connecting: 您的会话试着解析目的地资源的名字-IP地址映射。 Disconnected: 您的计算机请求断开,并等待远程计算机作出这样的反应。 Disconnecting: 您的连接正在结束。 Idle: 远程计算机在当前会话中已经打开,但没有接受连接。 Inbound: 入站会话试着连接。 Listening: 远程计算机可用。 Outbound: 您的会话正在建立TCP连接。 Reconnecting: 如果第一次连接失败,就会显示这个状态,表示试着重新连接 不管使用哪一种传输方式,NetBIOS提供三种不同的服务: 名字服务:名字登记和解析 会话服务:可靠的基于连接的通信 数据包服务:不可靠的无连接通信 当NetBIOS是数据链路层协议时,可以通过5Ch中断访问其功能。传递给这些函数的消息使用NCB格式。 NetBIOS和NetBEUI被设计为仅仅用于局域网,因此不支持路由,并且最多只能处理72个节点或者设备。NetBIOS和NetBEUI经常使用广播实现,尤其是名字服务的相关操作。 NBT使用一个或多个NBNS(NetBIOS Name Server(s))将名字服务扩展到多个子网。NBNS是动态DNS的一种,Microsoft的NBNS实现称为WINS。另外,为了将虚拟的NetBIOS网络扩展到多个IP子网,WINS标准还引入了一个或者多个NBDD(NetBIOS Datagram Distribution) 服务器。
hosts:包含由IP地址和相应的主机名称组成的静态查询表 lmhosts:包含由IP地址和相应的NetBIOS计算机名称组成的静态查询表 lmhosts是用来进行NETBIOS名静态解析的。将NETBIOS名和IP地址对应起来,功能类似于DNS,只不过DNS是将域名/主机名和IP对应。 LMHOSTS 文件是个纯文本文件,微软提供了一个示例程序 LMHOSTS.SAM,位于 C:\WinNT\System32\Drivers\Etc 目录下。
DHCP 是 Dynamic Host Configuration Protocol(动态主机分配协议)缩写,它的前身是 BOOTP。BOOTP 原本是用于无磁盘主机连接的网络上面的:网络主机使用 BOOT ROM 而不是磁盘起动并连接上网络,BOOTP 则可以自动地为那些主机设定 TCP/IP 环境。但 BOOTP 有一个缺点:您在设定前须事先获得客户端的硬件地址,而 且,与 IP 的对应是静态的。换而言之,BOOTP 非常缺乏 “动态性” ,若在有限的 IP 资源环境中,BOOTP 的一对一对应会造成非常可观的浪费。 DHCP 可以说是 BOOTP 的增强版本,它分为两个部份:一个是服务器端,而另一个是客户端。所有的 IP 网络设定数据都由 DHCP 服务器集中管理,并负责处理客户端的 DHCP 要求;而客户端则会使用从服务器分配下来的IP环境数据。比较起 BOOTP ,DHCP 透过 “租约” 的概念,有效且动态的分配客户端的 TCP/IP 设定,而且,作为兼容考虑,DHCP 也完全照顾了 BOOTP Client 的需求。 DHCP 的分配形式 首先,必须至少有一台 DHCP 工作在网络上面,它会监听网络的 DHCP 请求,并与客户端搓商 TCP/IP 的设定环境。它提供两种 IP 定位方式: Automatic Allocation 自动分配,其情形是:一旦 DHCP 客户端第一次成功的从 DHCP 服务器端租用到 IP 地址之后,就永远使用这个地址。 Dynamic Allocation 动态分配,当 DHCP 第一次从 HDCP 服务器端租用到 IP 地址之后,并非永久的使用该地址,只要租约到期,客户端就得释放(release)这个 IP 地址,以给其它工作站使用。当然,客户端可以比其它主机更优先的更新(renew)租约,或是租用其它的 IP 地址。 动态分配显然比自动分配更加灵活,尤其是当您的实际 IP 地址不足的时候,例如:您是一家 ISP ,只能提供 200 个IP地址用来给拨接客户,但并不意味着您的客户最多只能有 200 个。因为要知道,您的客户们不可能全部同一时间上网的,除了他们各自的行为习惯的不同,也有可能是电话线路的限制。这样,您就可以将这 200 个地址,轮流的租用给拨接上来的客户使用了。这也是为什么当您查看 IP 地址的时候,会因每次拨接而不同的原因了(除非您申请的是一个固定 IP ,通常的 ISP 都可以满足这样的要求,这或许要另外收费)。当然,ISP 不一定使用 DHCP 来分配地址,但这个概念和使用 IP Pool 的原理是一样的。 DHCP 除了能动态的设定 IP 地址之外,还可以将一些 IP 保留下来给一些特殊用途的机器使用,它可以按照硬件地址来固定的分配 IP 地址,这样可以给您更大的设计空间。同时,DHCP 还可以帮客户端指定 router、netmask、DNS Server、WINS Server、等等项目,您在客户端上面,除了将 DHCP 选项打勾之外,几乎无需做任何的 IP 环境设定。 DHCP 的工作原理 根据客户端是否第一次登录网络,DHCP 的工作形式会有所不同。 第一次登录的时候: 寻找 Server。当 DHCP 客户端第一次登录网络的时候,也就是客户发现本机上没有任何 IP 数据设定,它会向网络发出一个 DHCP DISCOVER 封包。因为客户端还不知道自己属于哪一个网络,所以封包的来源地址会为 0.0.0.0 ,而目的地址则为 255.255.255.255 ,然后再附上 DHCP discover 的信息,向网络进行广播。 在 Windows 的预设情形下,DHCP discover 的等待时间预设为 1 秒,也就是当客户端将第一个 DHCP discover 封包送出去之后,在 1 秒之内没有得到响应的话,就会进行第二次 DHCP discover 广播。若一直得不到响应的情况下,客户端一共会有四次 DHCP discover 广播(包括第一次在内),除了第一次会等待 1 秒之外,其余三次的等待时间分别是 9、13、16 秒。如果都没有得到 DHCP 服务器的响应,客户端则会显示错误信息,宣告 DHCP discover 的失败。之后,基于使用者的选择,系统会继续在 5 分钟之后再重复一次 DHCP discover 的过程。 提供 IP 租用地址。当 DHCP 服务器监听到客户端发出的 DHCP discover 广播后,它会从那些还没有租出的地址范围内,选择最前面的空置 IP ,连同其它 TCP/IP 设定,响应给客户端一个 DHCP OFFER 封包。 由于客户端在开始的时候还没有 IP 地址,所以在其 DHCP discover 封包内会带有其 MAC 地址信息,并且有一个 XID 编号来辨别该封包,DHCP 服务器响应的 DHCP offer 封包则会根据这些资料传递给要求租约的客户。根据服务器端的设定,DHCP offer 封包会包含一个租约期限的信息。 接受 IP 租约。如果客户端收到网络上多台 DHCP 服务器的响应,只会挑选其中一个 DHCP offer 而已(通常是最先抵达的那个),并且会向网络发送一个DHCP request广播封包,告诉所有 DHCP 服务器它将指定接受哪一台服务器提供的 IP 地址。 同时,客户端还会向网络发送一个 ARP 封包,查询网络上面有没有其它机器使用该 IP 地址;如果发现该 IP 已经被占用,客户端则会送出一个 DHCPDECLINE 封包给 DHCP 服务器,拒绝接受其 DHCP offer ,并重新发送 DHCP discover 信息。 事实上,并不是所有 DHCP 客户端都会无条件接受 DHCP 服务器的 offer ,尤其这些主机安装有其它 TCP/IP 相关的客户软件。客户端也可以用 DHCP request 向服务器提出 DHCP 选择,而这些选择会以不同的号码填写在 DHCP Option Field 里面: 换一句话说,在 DHCP 服务器上面的设定,未必是客户端全都接受,客户端可以保留自己的一些 TCP/IP 设定。而主动权永远在客户端这边。 租约确认。当 DHCP 服务器接收到客户端的 DHCP request 之后,会向客户端发出一个 DHCPACK 响应,以确认 IP 租约的正式生效,也就结束了一个完整的 DHCP 工作过程。 DHCP 发放流程 第一次登录之后: 一旦 DHCP 客户端成功地从服务器哪里取得 DHCP 租约之后,除非其租约已经失效并且 IP 地址也重新设定回 0.0.0.0 ,否则就无需再发送 DHCP discover 信息了,而会直接使用已经租用到的 IP 地址向之前之 DHCP 服务器发出 DHCP request 信息,DHCP 服务器会尽量让客户端使用原来的 IP 地址,如果没问题的话,直接响应 DHCPack 来确认则可。如果该地址已经失效或已经被其它机器使用了,服务器则会响应一个 DHCPNACK 封包给客户端,要求其从新执行 DHCP discover。 至于 IP 的租约期限却是非常考究的,并非如我们租房子那样简单, 以 NT 为例子:DHCP 工作站除了在开机的时候发出 DHCP request 请求之外,在租约期限一半的时候也会发出 DHCP request ,如果此时得不到 DHCP 服务器的确认的话,工作站还可以继续使用该 IP ;然后在剩下的租约期限的再一半的时候(即租约的75%),还得不到确认的话,那么工作站就不能拥有这个 IP 了。至于为什么不是到租约期限完全结束才放弃 IP 呢?,对不起,小弟也是不学无术之人,没有去深究了,只知道要回答 MCSE 题目的时候,您一定要记得 NT 是这么工作的就是了。 要是您想退租,可以随时送出 DHCPLEREASE 命令解约,就算您的租约在前一秒钟才获得的。 跨网络的 DHCP 运作 从前面描述的过程中,我们不难发现:DHCDISCOVER 是以广播方式进行的,其情形只能在同一网络之内进行,因为 router 是不会将广播传送出去的。但如果 DHCP 服务器安设在其它的网络上面呢?由于 DHCP 客户端还没有 IP 环境设定,所以也不知道 Router 地址,而且有些 Router 也不会将 DHCP 广播封包传递出去,因此这情形下 DHCP DISCOVER 是永远没办法抵达 DHCP 服务器那端的,当然也不会发生 OFFER 及其它动作了。要解决这个问题,我们可以用 DHCP Agent (或 DHCP Proxy )主机来接管客户的 DHCP 请求,然后将此请求传递给真正的 DHCP 服务器,然后将服务器的回复传给客户。这里,Proxy 主机必须自己具有路由能力,且能将双方的封包互传对方。 若不使用 Proxy,您也可以在每一个网络之中安装 DHCP 服务器,但这样的话,一来设备成本会增加,而且,管理上面也比较分散。当然喽,如果在一个十分大型的网络中,这样的均衡式架构还是可取的。端视您的实际情况而定了。
arcanist 是 phabricator 接口的命令工具,主要用于提交 diff 和 push review 通过的commit。
安装
下载源码,然后指定系统的环境变量即可
$ some_install_path/ $ git clone https://github.com/phacility/libphutil.git
$ some_install_path/ $ git clone https://github.com/phacility/arcanist.git
指定环境变量
– 修改 .bash_profile(如果装有 zsh, 则修改 .zshrc),下面的 /Users/Grissom/mydocs/arc/arcanist/bin 就是我本机 arc 源码所在的路径
$ export PATH=${PATH}:/usr/local/mysql/bin:/Users/Grissom/mydocs/arc/arcanist/bin
– 然后运行以下命令使之起效
$ source .bash_profile
– 查看是否安装好
$ arc help
– 配置arc的默认编辑器,我使用vim
$ arc set-config editor “vim”
–配置默认的phabricator的uri,uri为团队的phabricator主页的url
$ arc set-config default
一个典型的 Linux 系统要能运行的话,它至少需要两个文件系统: boot file system (bootfs):包含 boot loader 和 kernel。用户不会修改这个文件系统。实际上,在启动(boot)过程完成后,整个内核都会被加载进内存,此时 bootfs 会被卸载掉从而释放出所占用的内存。同时也可以看出,对于同样内核版本的不同的 Linux 发行版的 bootfs 都是一致的。 root file system (rootfs):包含典型的目录结构,包括 /dev, /proc, /bin, /etc, /lib, /usr, and /tmp 等再加上要运行用户应用所需要的所有配置文件,二进制文件和库文件。这个文件系统在不同的Linux 发行版中是不同的。而且用户可以对这个文件进行修改。 Linux 系统在启动时,roofs 首先会被挂载为只读模式,然后在启动完成后被修改为读写模式,随后它们就可以被修改了。