标题：NetBIOS协议
NETBIOS 的应用
英文原义：NetBIOS Services Protocols
中文释义：（RFC-1001，1002）网络基本输入/输出系统协议
应用：在Windows操作系统中，默认情况下在安装TCP/IP协议后会自动安装NetBIOS。比如在Windows 2000/XP中，当选择“自动获得IP”后会启用DHCP服务器，从该服务器使用NetBIOS设置；  Windows中NetBIOS的安装如果使用静态IP地址或DHCP服务器不提供NetBIOS设置，则启用TCP/IP上的NetBIOS。具体的设置方法如下：首先打开“控制面板”，双击“网络连接”图标，打开本地连接属性。接着，在属性窗口的“常规”选项卡中选择“Internet协议（TCP/IP）”，单击“属性”按钮。然后在打开的窗口中，单击“高级”按钮；在“高级TCP/IP设置”窗口中选择“WINS”选项卡，在“NetBIOS设置”区域中就可以相应的NetBIOS设置。
NetBIOS 与 NetBEUI
NetBIOS是应用程序访问符合NetBIOS规范的转输协议的接口，NetBEUI是该接口的一个扩展版本（1985年由IBM开发成功）。
两者的区别如下：　
NetBIOS最多只能与其他节点建立254个通讯话路。NetBEUI不再有此限制，它允许WindowsNT机器上的每个进程都能够与多达254个节点进行通讯。　
NetBIOS名称最多可有15个字符，通话层应用程序通过它来与远程计算机进行通讯。NetBEUI则是通过SMB协议（ServerMessageBlock——服务器消息块，最初应用于3COM公司的LANManager）来实现在逻辑通道中的消息传送的。　NetBEUI总是包含在NetBIOS中，NetBIOS可以运行在几种不同的传输协议上，包括NetBEUI、TCP/IP和IPX/SPX，后三者位于网络层驱动接口与传输层驱动接口之间。但运行在一种传输协议上的NetBIOS服务不能和运行另一种传输协议上的NetBIOS服务通信。NetBIOS可以使用的四种类型的SMB(赋予Windows计算机本地文件重定向功能以便进入远端文件系统)
命令：　
话路控制命令，用于建立或终止与远程计算机上某个资源的逻辑连接。　
文件命令：
用于远程文件访问。　
打印机命令：
用于传送数据给一个远程打印队列，同时也检查该打印队列中各项任务的执行状态。　
消息命令：
用于实现计算机之间的消息传送。
NetBIOS简析
Netbios (网络基本输入/输出系统）最初由 IBM，Sytek 作为API开发，使用户软件能使用局域网的资源。自从诞生，Netbios成为许多其他网络应用程序的基础。严格意义上，Netbios 是接入网络服务的接口标准。
Netbios 原来是作为THE网络控制器为 IBM 局域网设计的，是通过特定硬件用来和网络操作系统连接的软件层。Netbios经扩展，允许程序使用Netbios接口来操作IBM令牌环结构。Netbios 已被公认为工业标准，通常参照 Netbios-compatible LANs。
它提供给网络程序一套方法，相互通讯及传输数据。基本上，Netbios 允许程序和网络会话。它的目的是把程序和任何类型的硬件属性分开。它也使软件开发员可以免除以下负担：开发网络错误修复，低层信息寻址和路由。使用Netbios接口，可以为软件开发员做许多工作。
Netbios使程序和局域网操作能力之间的接口标准化。有它们可以将程序细化到为OSI模型的哪一层所写，使程序能移植到其他网络上。在Netbios局域网环境下，计算机通过名字被系统知道。网络中每台计算机都有通过不同方法编的永久性名称。这些名称将在下面做进一步讨论。
通过使用Netbios的数据报或广播方式，在Netbios局域网上的pc机建立会话彼此联络。会话允许更多的信息被传送，探测错误，和纠正。通信是在一对一的基础上的。数据报或广播方式允许一台计算机和多台其他的计算机同时通信，但信息大小受限。使用数据报或广播方式没有探测错误和纠正。然而，数据报通信可以不必建立一个会话。
在这种环境下所有的通信以一种称为“网络控制块“的格式提交给NetBIOS。内存中这些块的分配依赖于用户程序。这些“网络控制块“分配到域中，分别为输入/输出保留。
在当今的环境中，NetBIOS是使用很普遍的协议。以太网，令牌环，IBM PC网都支持NetBIOS。在它原始版本中，它仅作为程序和网络适配器的接口。从那以后，传输类功能加入NetBIOS，使它功能日益增多。
在NetBIOS里，面向连接(tcp)和无连接(udp)通信均支持。它支持广播和复播，支持三个分开的服务：命名,会话，数据报。
计算机名与NetBIOS协议
在网络中使用计算机名通讯就是使用NetBIOS协议。　　
NetBIOS 名称
NetBIOS名称用来在网络上鉴别资源。程序用这些名称开始和结束会话。你能用多个程序配置一台单独的机器，每个程序都有独特的NetBIOS名称。每台支持应用的pc机也有用户定义或通过内部方法获得的NetBIOS站名。
NetBIOS能包含至多16个阿尔法数字字母。在整个资源路由网络里，字母的组合必须独特。在一台使用NetBIOS的pc机在网络上能完全工作起来之前，PC必须先登记NetBIOS名称。  NetBIOS协议当客户端活跃时，客户端广播它的名称。当它成功广播自己，并没有其他人和它重名，客户端就登记成功。登记过程如下：
1.在登陆上，客户端在所有地方广播它自己和它的NetBIOS信息6到10次，确保其他网络成员收到信息。
2.如果有客户端A已用此名，客户端A发布它自己的广播，包括它正在使用的名字。请求登陆的客户端停止所有登记的企图。
3.如无其他客户端反对登记，请求登陆的客户端完成登记过程。
在NetBIOS环境中有两类名称：独特的和集合的。独特的名称必须在网络中独特。集合的名称不必在网络中独特，所有同名过程属于同一集合。每个NetBIOS节点包含一张该节点当前使用名称的表。
NetBIOS命名允许16个字母用在NetBIOS名称中。而微软只允许15个字母用在NetBIOS名称中，第十六个为NetBIOS后缀。NetBIOS后缀用在Microsoft Networking软件中，区别安装的功能，登记的设备和服务。
[注意：smb 和nbt（在tcp/ip上的NetBIOS）紧密的工作在一起，且都使用137，138，139端口。137端口是NetBIOS名称UDP,138端口是NetBIOS数据报UDP，139端口是NetBIOS会话tcp，进一步的NetBIOS信息，看rhino9网站上所列文章]
以下是Microsoft WindowsNT目前使用的NetBIOS后缀表。后缀是16进制。
名称 数字 类型 用途
============
00 U Workstation Service
01 U Messenger Service
02 U Master Browser
03 U Messenger Service
06 U RAS Server Service
1F U NetDDE Service
20 U File Server Service
21 U RAS Client Service
22 U Exchange Interchange
23 U Exchange Store
24 U Exchange Directory
30 U Modem Sharing Server Service
31 U Modem Sharing Client Service
43 U SMS Client Remote Control
44 U SMS Admin Remote Control Tool
45 U SMS Client Remote Chat
46 U SMS Client Remote Transfer
4C U DEC Pathworks TCPIP Service
52 U DEC Pathworks TCPIP Service
87 U Exchange MTA
6A U Exchange IMC
BE U Network Monitor Agent
BF U Network Monitor Apps
03 U Messenger Service
00 G Domain Name
1B U Domain Master Browser
1C G Domain Controllers
1D U Master Browser
1E G Browser Service Elections
1C G Internet Information Server
00 U Internet Information Server
[2B] U Lotus Notes Server
IRISMULTICAST [2F] G Lotus Notes
IRISNAMESERVER [33] G Lotus Notes
Forte_$ND800ZA [20] U DCA Irmalan Gateway Service
独特的(u)：该名仅有一个IP地址分给它。在网络设备中，一个名称的多次出现看来会被登记，但后缀是唯一的，使整个名称唯一。
集合的（g):普通集合，一个名称可有多个IP地址。
多址的(M):名称是唯一的，但由于在同一计算机上有多个网络接口，这种配置应该被允许登记。地址的最大数目是25。
Internet集合(I):这是组名的特殊配置，用在操作WINDOSNT的域名。
域名(D):在NT4.0中新引进的。
为了快速浏览一台服务器上登记的NETBIOS名称和服务，用以下命令：
nbtstat -a [ipaddress]
nbtstat -a [host]NetBIOS 会话NetBIOS 会话服务提供给用户程序一种面向连接，可靠的，完全双重的信息服务。 NetBIOS要求一个是客户端程序，一个是服务器端程序。NetBIOS会话的建立需要双方预定的合作。一个程序必须先发出listen命令，其他程序才可以发出call令。listen命令参考在它的NetBIOS名称表中的名称（或windows服务器中的），也参考用于作为会话另一端的远端程序的名称。如果聆听者不在聆听，call命令将不会成功。如果call成功，各程序将接到会话id，以作为会话建立的确认。
send和receive命令操作传输数据。在会话最后，各程序将执行挂起命令。没有为会话服务的实际流控制，因为假定局域网足够快，能够传输需要的数据。NetBIOS 数据报数据报可以发送到特定的地点，或组中所有成员，或广播到整个局域网。与其它数据服务相比，NetBIOS 数据报是无连接，非可靠的。Send_Datagram 命令需要调用者设定目的名。如果目的名是组名，组中每个成员都收到数据。Receive_Datagram 命令的调用者必须确定它接收数据的本地名。除了实际数据外，Receive_Datagram也返回发送者的名称。如果NetBIOS收到数据，但却没有Receive_Datagram 命令在等待，数据将被丢弃。
Send_Broadcast_Datagram 命令发送信息给本地网上每个NetBIOS系统。当NetBIOS节点收到广播数据，发布Receive_Broadcast_Datagram 命令的每个进程都收到数据。如果当广播数据被收到时，没有这些命令在运行，数据将被丢弃。
NetBIOS使应用程序能和另一个设备建立会话，使网络转发器和处理协议处理收到、发送到另一台机器的请求。NetBIOS实际上不操作数据。NetBIOS定义规定了用来到达这些服务的协议的网络接口，而非协议本身。历史上，NetBIOS曾与叫做NetBEUI的协议（网络扩展用户接口）捆绑。接口和协议的结合有时引起混淆，但它们是不同的。
网络协议为定位、连接到网络上特定的服务提供至少一种方法。这通常由将节点和服务名转化为网络地址（名称解析）完成。在连接用TCP/IP建立前，NetBIOS服务名必须解析成IP地址。大多数NetBIOS的TCP/IP 实现，用广播或LMHOSTS文件完成名称地址的解析。在Microsoft环境中，你最可能使用叫做WINS的NetBIOS 名称服务器。NetBEUI 解释NetBEUI是网络操作系统使用 NetBIOS协议的加强版本。它规范了在NetBIOS 中未标准化的传输帧，还加了额外的功能。传输层驱动器经常被Microsofts LAN Manager（微软局域网操作器）使用。NetBEUI执行 OSI LLC2 协议。NetBEUI是原始的PC网络协议和IBM为LanManger（局域网操作器）服务器设计的接口。本协议稍后被微软采用作为它们的网络产品的标准。它规定了高层软件通过NetBIOS帧协议发送、接收信息的方法。本协议运行在标准802.2数据链协议层上。NetBIOS 范围NetBIOS范围ID为建立在TCP/IP（叫做NBT）模块上的NetBIOS提供额外的命名服务。 NetBIOS范围ID的主要目的是隔离单个网络上的NetBIOS通信和那些有相同NetBIOS范围ID的节点。NetBIOS范围ID是附加在NetBIOS 名称上的字符串。两个主机上的NetBIOS范围ID必须匹配，否则两主机无法通信。NetBIOS范围ID允许 计算机使用相同的计算机名，不同的范围ID。范围ID是NetBIOS名称的一部分，使名称唯一。
NetBIOS协议的安全隐患
NetBIOS 是指网络输入输出系统，在计算机网络发展史中，NetBIOS 算得上是历史悠久。早在 1985 年，IBM 公司就开始在网络领域使用 NetBIOS，微软推出第一套基于 Windows 的网络操作系统－－Windows For Workgroups（面向工作组的视窗操作系统）时，就采用了一种适用于 Windows 的 NetBIOS 版本，即 NetBEUI。微软当年之所以选择 NetBEUI 作为网络传输的基本协议，是因为它占用系统资源少、传输效率高，尤为适用于由 20 到 200 台计算机组成的小型局域网。此外，NetBEUI 还有一个最大的优点：
可以方便地实现网络中各单机资源的共享。
后来，网络的发展速度之快，已大大超出人们的想象，进入 20 世纪未，全球的计算机就已可通过国际互联网络方便连接，随着互联网络的迅猛发展，TCP/IP 协议成为广泛使用的传输协议。
今天，TCP/IP 协议已是互联网领域的通用协议，几乎所有接入互联网的电脑都使用TCP/IP。但同时，NetBEUI 协议也还在局域网领域广泛使用，因此，在你安装 TCP/IP
协议时，NetBIOS 也被 Windows 作为默认设置载入了你的电脑，而电脑随即也具有了NetBIOS 本身的开放性。换句话讲，在不知不觉间，你的上网电脑已被打开了一个危险的“后门”。
NetBIOS 的开放，意味着你的硬盘可能会在网络中成为共享。对于网上四处游走的来讲，他们可以通过 NetBIOS 获知你电脑中的一切！
NetBIOS协议的安全隐患的解除
1、如果你使用的是最早版本的 Windows 95，那关闭 NetBIOS 就是一件非常容易的事　：找到系统里名为 Vnbt.386 的文件，随便将它改个名，如改为 Vnbt.out，这就算大功告成了。
2、如果你使用的是 Windows 95改进版、Windows 98、Windows 98 SE 或是 Windows 　Me,那就要稍微麻烦一点。首先，打开控制面板，进入“网络”对话窗，在配置表中，查看列表中是否已有 NetBEUI 组件，如果有，则直接跳过下一段。
3、如果在列表中没有 NetBEUI 组件，则先点击“添加”按钮，在“要安装的网络组件类型”列表中，选择“协议”一项，再次点击“添加”，在“网络协议”对话窗中，选　择 Microsoft 的 NetBEUI，然后，插入 Windows 安装盘，点击“确定”即可。
4、回到“网络”对话窗，在网络组件中选择“拨号适配器”，点击“属性”，在“属性”对话窗中选择“绑定”按钮，将除TCP/IP之外其它协议的复选框里的小勾清除掉。 　
5、最后，再次回到“网络”对话窗，选择 TCP/IP 协议，点击“属性”，这时有可能会弹出一个警告窗口，不用理它，直接点“OK”就行了，进入 TCP/IP 的“属性”窗口后，选择“绑定”，将所有网络协议复选框内的小勾去掉，点击“确定”，这时，Windows 会提示你至少应选择一种协议，仍然不用理它，点击“No”，关闭窗口。重新启动你　的计算机，这样，你计算机中的 NetBIOS后门就已被关闭了。
NetBIOS的名字解析
NetBIOS 名包含的内容NetBIOS 名——即计算机名称，用来标识独立的用户或计算机。独立的 NetBIOS 名是工作组的成员，它们属于一个默认的工作组或由用户自定义可以加入一个自选的工作组。
工作组名——用来标识某个工作组的成员。
域名——同工作组名一样，域名也是一种 NetBIOS 组名，它是通过域控制器来标识、证实其成员的。但在域名服务中这两者被认为是一样的，这也就是在“网络控制面板”的属性的“标识”页框中只有计算机名、工作组、计算机说明等项目而没有“域名”的原因。NetBIOS 名的登记NetBIOS 在小型网络中登记名字的方法是广播。NetBIOS 名字服务提供的功能有：自动登记名字、查询名字、响应名字查询、在关机时释放名字等，但它并不需要专门的名字服务器，甚至可以通过直接通信来进行名字登记。NetBIOS 名字的解析方法（绑定协议为TCP/IP）1、NetBIOS 名字缓存——本地的名字缓存通过预先加载或地址解析而将地址在存放在客户机的内存中。其优点是从缓存中查询名字的速度特别快，缺点是缓存中每条记录的生存周期只有10分钟，需要不停的刷新。2、广播查询——如果名字在缓存中不能被查询到，同时系统没有配置 WINS 服务器，系统就使用 UDP 端口137和138的 NetBIOS Datagram Distribution Service(NDDS，中文意思就是 NetBIOS 数据报分布服务)来进行查询。本地网上的计算机在网络中搜索它们的名字列表，如果目标主机在同一网络中，就发出一个响应。缺点是 NDDS 服务不能通过路由器，只能在单段网络上使用广播查询。3、WINS——这个我们已经做了专门的介绍，客户机通过配置使用 WINS 服务器来登记和撤消自己的名字。其优点是可以指引 UDP 端口137和138的消息通过路由器，使得可以查询本地网以外的主机。4、LMHOSTS——这与我们讲到的名字缓存有关了。LMHOSTS 是一种在存储在本地机器上的纯文本的主机文件，采用的是 LAN Manager格式。其一般是在广播查询失败后才用到，其方法是通过标记 #PRE 将 LMHOSTS 名预先加载到本地的 NetBIOS 名字缓存，以避免使用广播查询用到的主机名。
这里我们同时看看 Windows 系统中用到的另外两种名字解析方法：5、HOSTS——HOSTS 也是一种在存储在客户本地机器上的纯文本主机文件，但采用的是 UNIX格式。同样是在广播查询失败及 LMHOSTS 查询失败后才用到。其优点是可以存储别名和全域名，其缺点是不支持 Tag 操作。6、DNS——这一点我们也已经做了专门讲述了。如果客户机允许“启动 DNS”来进行 Windows 名字解析，客户机在上面的所有查询操作都失败后将查询 DNS 服务器。
我们可以看出这两种解析方式是一种域名查询方式，一般说来它们用于 IP主机名的解析。
接下来，我们来看一下 HOSTS 文件，对于 LMHOSTS 我们准备作为一个专题独立出来集中讲述。
HOSTS 文件的示范文件可以在 C:\WINNT\SYSTEM32\DRIVERS\ETC 目录中得到，其文件名是：HOSTS.SAM。SAM 即 SAMPLE，是Microsoft 提供给用户的一个如何配置 HOSTS 的例子，其中带有说明性的文字。在用户需要进行 HOSTS 配置的时候，可以直接将其改名复制为 HOSTS 并做相应修改即可。
NetBIOS 协议的节点类型
这里有一个术语叫 node designation，中文意思我认为就是节点指定，它主要用来表明某计算机节点解析计算机名称及地址的方法。每个 NetBIOS 计算机都有一种节点类型，共有四种节点类型对应于四种解析方法：B节点——只使用广播方法。该类型的节点在本地子网上使用广播消息来发现位于同一子网中的计算机。
广播节点（B节点）只通过广播数据报来解析LAN子网中计算机名和地址，即它的有效范围只是它所在的子网。其工作方式是：客户机发送一条广播消息到其所在的局域子网上，这条消息包含有要查找的计算机的IP地址和其本身的MAC地址。由于使用广播方式，则该网上的所有计算机都会接收到，如果该数据报中所要求的地址的计算机存在，则它就会根据包含在此数据报中的发出该消息的计算机的MAC地址作出回应。这样，计算机就会把经常用到的MAC地址缓存起来，通过这些地址实现与远程计算机的直接通信。
采用B节点方式的缺点：1、增大网络上不必要的通信流量，形成大量的广播消息泛滥。2、大多数路由器不会转发这些广播，阻止了B节点解析路由器另一边的计算机，即B节点不能查找到其所在子网以外的计算机地址。
解决的办法：1、采用 WINS 服务器可以减少通信流量。2、采用一个 LMHOSTS 或 HOSTS 文件将路由器另一边的计算机的地址存入本地 NetBIOS 名字缓存，避免通过广播查找。
因此，一个完整的 NetBIOS B节点解析方式可作如下描述：
1、通过 NetBIOS 名字缓存进行查询，如果成功，返回一个IP地址，完成解析；如果不成功，转向下一步：
2、通过广播进行查询，如果成功，返回一个IP地址，完成解析；如果不成功，转向下一步：
3、通过本地 LMHOSTS 和 HOSTS 文件进行查询，无论成功与否都结束解析。
P节点——只和名字服务器使用点对点通信。该类型的节点使用服务（如WINS服务器）来进行查询以获取要解析的地址。
P节点不是用广播来解析名称的，它通过点对点通信由UDP的数据报和TCP对话登记到一个 NetBIOS 名字服务器(WINS)，因此，它会直接向这台服务器查询以进行地址翻译，然后再直接将信息发送到目的计算机。因此，P节点的好处就是减少了本地广播的数量，同时可以跨过路由器与位于其它子网中的 WINS 服务器进行通信。
采用P节点方式的缺点：1、客户机在配置时为P节点时必须知道 WINS 服务器的IP地址。2、配置P节点还要使用到 DHCP 服务器。3、如果 WINS 服务器停止服务，P节点也就失去解析名称和翻译地址的能力。M节点——先使用广播，再点对点通信。该类型的节点在LAN上发送广播消息来查找另一台电脑，如果没有回应或查找失败，就转为使用P点节方式继续查询。它向名称解析服务器注册自己的名称时也是用的广播消息。
M节点先使用广播，在解析失败后就直接和 WINS 服务器通信，因此，它是前面讲的两种方式的组合。在实际应用中很少配置计算机为这种节点类型，这样的唯一好处是在一个远程没有 WINS 服务器的广域网节点所需的大多数服务都在一个子网，即通信都发生在同一子网中，它可以减少路由器的信息传送量。同时，即使 WINS 服务器停止服务，它还可以使用广播方式来查询本地子网中的计算机。H节点——先使用点对点通信，然后使用广播。该类型的节点使用 NetBIOS 名称解析服务来进行注册或解析，如果无法连接到名称解析服务器(如WINS服务器)则再转为使用B节点方式继续查询。
H节点如我们上面的测试中所示，在 Windows 9x 中它被称为交叉节点，而在实际应用中，它也被称为混合节点。它与M节点恰好相反，它先使用P节点方式请求 WINS 服务器解析计算机名，如果这种方式失败，它再使用广播方式来解析。
因此，H节点与B节点的不同是，H节点可以通过路由器解析在同一个 WINS 服务器上登记的所有计算机。
H节点与M节点的不同是，如果其配置的 WINS 服务器没有在线，H节点在解析过程中也继续与其联系，即是说，只要该 WINS 服务器重新开始服务，H节点就会立即改为使用 WINS 服务器来解析计算机名称，即使此时它正以广播方式与目的计算机进行通信。
一个完整的 NetBIOS H节点解析方式可作如下描述：
1、通过 NetBIOS 名字缓存进行查询，如果成功，返回一个IP地址，完成解析；如果不成功，转向下一步：
2、通过 WINS 服务器进行查询，如果成功，返回一个IP地址，完成解析；如果不成功，转向下一步：
3、通过广播进行查询，如果成功，返回一个IP地址，完成解析；如果不成功，转向下一步：
4、通过本地 LMHOSTS 和 HOSTS 文件进行查询，无论成功与否都结束解析。