Ⅰ TCP/IP協議是怎麼實現的
TCP/IP(Transmission Control Protocol/Internet Protocol的簡寫,中文譯名為傳輸控制協議/互聯網路協議)協議是Internet最基本的協議,簡單地說,就是由底層的IP協議和TCP協議組成的。
在Internet沒有形成之前,各個地方已經建立了很多小型的網路,稱為區域網,Internet的中文意義是"網際網",它實際上就是將全球各地的區域網連接起來而形成的一個"網之間的網(即網際網)"。然而,在連接之前的各式各樣的區域網卻存在不同的網路結構和數據傳輸規則,將這些小網連接起來後各網之間要通過什麼樣的規則來傳輸數據呢?這就象世界上有很多個國家,各個國家的人說各自的語言,世界上任意兩個人要怎樣才能互相溝通呢?如果全世界的人都能夠說同一種語言(即世界語),這個問題不就解決了嗎?TCP/IP協議正是Internet上的"世界語"。
TCP/IP協議的開發工作始於70年代,是用於互聯網的第一套協議。
這里簡要介紹一下TCP/IP的內部結構,為討論與互聯網有關的安全問題打點基礎。TCP/IP協議組之所以流行,部分原因是因為它可以用在各種各樣的信道和底層協議(例如T1和X.25、乙太網以及RS-232串列介面)之上。確切地說,TCP/IP協議是一組包括TCP協議和IP協議,UDP(User Datagram Protocol)協議、ICMP(Internet Control Message Protocol)協議和其他一些協議的協議組。
1. TCP/IP整體構架概述
TCP/IP協議並不完全符合OSI的七層參考模型。傳統的開放式系統互連參考模型,是一種通信協議的7層抽象的參考模型,其中每一層執行某一特定任務。該模型的目的是使各種硬體在相同的層次上相互通信。這7層是:物理層、數據鏈路層、網路層、傳輸層、話路層、表示層和應用層。而TCP/IP通訊協議採用了4層的層級結構,每一層都呼叫它的下一層所提供的網路來完成自己的需求。這4層分別為:
應用層:應用程序間溝通的層,如簡單電子郵件傳輸(SMTP)、文件傳輸協議(FTP)、網路遠程訪問協議(Telnet)等。
傳輸層:在此層中,它提供了節點間的數據傳送服務,如傳輸控制協議(TCP)、用戶數據報協議(UDP)等,TCP和UDP給數據包加入傳輸數據並把它傳輸到下一層中,這一層負責傳送數據,並且確定數據已被送達並接收。
互連網路層:負責提供基本的數據封包傳送功能,讓每一塊數據包都能夠到達目的主機(但不檢查是否被正確接收),如網際協議(IP)。
網路介面層:對實際的網路媒體的管理,定義如何使用實際網路(如Ethernet、Serial Line等)來傳送數據。
2. TCP/IP中的協議
以下簡單介紹TCP/IP中的協議都具備什麼樣的功能,都是如何工作的:
IP
網際協議IP是TCP/IP的心臟,也是網路層中最重要的協議。
IP層接收由更低層(網路介面層例如乙太網設備驅動程序)發來的數據包,並把該數據包發送到更高層---TCP或UDP層;相反,IP層也把從TCP或UDP層接收來的數據包傳送到更低層。IP數據包是不可靠的,因為IP並沒有做任何事情來確認數據包是按順序發送的或者沒有被破壞。IP數據包中含有發送它的主機的地址(源地址)和接收它的主機的地址(目的地址)。
高層的TCP和UDP服務在接收數據包時,通常假設包中的源地址是有效的。也可以這樣說,IP地址形成了許多服務的認證基礎,這些服務相信數據包是從一個有效的主機發送來的。IP確認包含一個選項,叫作IP source routing,可以用來指定一條源地址和目的地址之間的直接路徑。對於一些TCP和UDP的服務來說,使用了該選項的IP包好象是從路徑上的最後一個系統傳遞過來的,而不是來自於它的真實地點。這個選項是為了測試而存在的,說明了它可以被用來欺騙系統來進行平常是被禁止的連接。那麼,許多依靠IP源地址做確認的服務將產生問題並且會被非法入侵。
TCP
如果IP數據包中有已經封好的TCP數據包,那麼IP將把它們向『上』傳送到TCP層。TCP將包排序並進行錯誤檢查,同時實現虛電路間的連接。TCP數據包中包括序號和確認,所以未按照順序收到的包可以被排序,而損壞的包可以被重傳。
TCP將它的信息送到更高層的應用程序,例如Telnet的服務程序和客戶程序。應用程序輪流將信息送回TCP層,TCP層便將它們向下傳送到IP層,設備驅動程序和物理介質,最後到接收方。
面向連接的服務(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它們使用了TCP。DNS在某些情況下使用TCP(發送和接收域名資料庫),但使用UDP傳送有關單個主機的信息。
UDP
UDP與TCP位於同一層,但對於數據包的順序錯誤或重發。因此,UDP不被應用於那些使用虛電路的面向連接的服務,UDP主要用於那些面向查詢---應答的服務,例如NFS。相對於FTP或Telnet,這些服務需要交換的信息量較小。使用UDP的服務包括NTP(網落時間協議)和DNS(DNS也使用TCP)。
欺騙UDP包比欺騙TCP包更容易,因為UDP沒有建立初始化連接(也可以稱為握手)(因為在兩個系統間沒有虛電路),也就是說,與UDP相關的服務面臨著更大的危險。
ICMP
ICMP與IP位於同一層,它被用來傳送IP的的控制信息。它主要是用來提供有關通向目的地址的路徑信息。ICMP的『Redirect』信息通知主機通向其他系統的更准確的路徑,而『Unreachable』信息則指出路徑有問題。另外,如果路徑不可用了,ICMP可以使TCP連接『體面地』終止。PING是最常用的基於ICMP的服務。
TCP和UDP的埠結構
TCP和UDP服務通常有一個客戶/伺服器的關系,例如,一個Telnet服務進程開始在系統上處於空閑狀態,等待著連接。用戶使用Telnet客戶程序與服務進程建立一個連接。客戶程序向服務進程寫入信息,服務進程讀出信息並發出響應,客戶程序讀出響應並向用戶報告。因而,這個連接是雙工的,可以用來進行讀寫。
兩個系統間的多重Telnet連接是如何相互確認並協調一致呢?TCP或UDP連接唯一地使用每個信息中的如下四項進行確認:
源IP地址---發送包的IP地址。
目的IP地址---接收包的IP地址。
源埠---源系統上的連接的埠。
目的埠---目的系統上的連接的埠。
註:埠是一個軟體結構,被客戶程序或服務進程用來發送和接收信息。一個埠對應一個16比特的數。服務進程通常使用一個固定的埠,例如,SMTP使用25、Xwindows使用6000。這些埠號是『廣為人知』的,因為在建立與特定的主機或服務的連接時,需要這些地址和目的地址進行通訊。
Ⅱ Fanuc 控制面板通信協議及其在數控端的配置文件是怎樣的
FANUC使用的自家開發的非開放協議,研究這個沒有任何意義。如果需要上位機與NC系統進行通訊,建議研究一下Focas函數庫相關內容
Ⅲ 如何設計實現一個簡單的通訊協議用C語言可以實現的。
用C語言肯定可以實現!要先在接收端的單片機處理設定好,就是你收到了什麼數據,要判定數據是否正確,要是正確的話,就要回復什麼數據;不正確就不響應。你可以看看485通信的例子。
Ⅳ 如何實現兩台主機之間的通信
VB用winsock控制項吧,網上例子太多了,你也可以看看書
用Winsock實現點對點通信
作者不詳
Winsock控制項是VB5.0的新增功能,它解決了以往應用VB編程時網路中應用程序之間無法實現點對點通信的難題。Winsock使用的TCP協議和UDP協議允許建立並保持一個到遠程計算機上的連接,且可以在連接結束之前實時地進行數據交換。用戶僅通過設置屬性並藉助事件處理就能夠輕而易舉地連接到一個遠程的計 算機上,而且只用兩個命令就可以實現數據交換。
使用TCP協議時,如果需要創建一個客戶應用程序,就必須識別伺服器的名稱或IP地址。
應用程序的通信埠隨時都將仔細監測對方發出的消息,這是系統進行可靠連接的保證。一旦連接發生,任何一方都可以通過SendData發送和接收數據,並藉助GetData把自己的數據分離出來。傳送數據時,需要先設定客戶機的LocalPort屬性,伺服器則只需要把RemoteHost屬性設定為客戶機乙太網的地址,並設定與客戶機LocalPort屬性相同的埠地址, 藉助SendData方法開始發送消息。客戶機則在GetData事件中通過DataArrival事件分離出發送的信息。
一個Winsock控制項可以讓本地計算機連接到遠程的計算機上,同時使用UDP或TCP協議,兩個協議都能創建客戶機和伺服器應用。
使用Winsock控制項時,通信的雙方需要選定相同的協議。TCP協議適用於傳送大容量、需要安全性保證的數據文件;而UDP協議適用於需要分別與很多下屬通信,或者建立的連接比較多且為時變的情況,特別是在數據量很小的時候。設定時可以使用Winsock1.Protocol =
sckTCPProtocol方法,首先要找到你的計算機的名稱,並把它添入Winsock的LocalHost屬性中。
創建一個應用程序時,首先要確定你建立的是客戶方應用還是伺服器服務,只有建立的伺服器應用開始工作,並進入監聽狀態時,客戶應用程序才開始建立連接,進入正常的通信狀態。筆者建立了一個應用程序,它的功能是當客戶方的滑鼠移動時,伺服器應用程序上能夠實時顯示該滑鼠的位置。下面是建立伺服器應用的方法:
1.創建一個新的標准EXE文件;
2.加入一個Winsock控制項;
3.加入如下代碼:
Private Sub Form Load()
tcpServer.LocalPort = 1001
tcpServer.Localhost = 〃servser〃
tcpServer.remotePort = 1002
tcpServer.Localhost = 〃klint〃
tcpServer.Listen
End Sub
′連接檢查
Private Sub tcpServer ConnectionRequest
(ByVal requestID As Long)
If tcpServer.State <> sckClosed Then
tcpServer.Close
tcpServer.Accept requestID
End Sub
′發送數據
Private Sub frmserver monsemove(x,y)
tcpServer.SendData 〃x〃& str(x)
tcpServer.SendData 〃y〃& str(y)
End Sub
建立客戶應用的方法為:
1.創建一個新的標准EXE文件;
2.加入一個Winsock控制項;
3.加入兩個TEXT框—— txt x和 txt y;
4.加入如下代碼:
Private Sub Form Load()
tcpServer.LocalPort = 1002
tcpServer.Localhost = 〃klint〃
tcpServer.remotePort = 1001
tcpServer.Localhost = 〃servser〃
tcpServer.Listen
End Sub
′連接檢查
Private Sub tcpklint ConnectionRequest
(ByVal requestID As Long)
If tcpklint.State <> sckClosed Then
tcpklint.Close
tcpklint.Accept requestID
End Sub
Private Sub tcpClient DataArrival
(ByVal bytesTotal As Long)
Dim strData As String
tcpklint.GetData strData
if left(strData,1)=〃X〃then
txt x.Text = strData
else
txt y.Text = strData
endif
End Sub
以上常式實現的是一個非常簡單的點對點通信,在此基礎上略加改造,可以形成功能復雜的實時計算機網路A-A交互通信系統,用於控制、圖形模擬等。
使用UDP協議建立對等通信和通過TCP建立客戶/伺服器通信的方法略有不同,它不需要建立客戶和伺服器,而是建立對等通信。此過程通過以下幾步實現:
1.設定Winsock的RemoteHost 屬性為一個通信的計算機名稱;
2.設定 RemotePort 為一個介面號;
3.調用Winsock的Bind 事件綁定本地的介面號。具體設定方法為:
Private Sub Form Load()
With Winsock1
.RemoteHost= 〃PeerB〃
.RemotePort = 1001 ′遠程連接號
.Bind 1002
′綁定的本地號
End With
End Sub
程序的其它部分與TCP方法類似,即通過SendData 和GetData 方法發送或提取數據。UDP和TCP協 議在使用中各有特點,如果靈活使用,可以得到很好的效果。令人欣慰的是,VB5.0 中Winsock給我們提供了一種簡便的數據傳送方法,使我們得以輕松地實現網路點對點通信。
Ⅳ 配置實現通過TFTP協議備份Cisco路由器的配置文件是什麼
1、首先在PC機上運行TFTP server,TFTP server的地址為本PC機的IP地址192.168.100.25;
2、一旦啟用了一個TFTP Server,那麼在路由器上用PING命令來確保該TFTP Server可以到達;
3、還應該在本地路由器上查看一下flash的容量大小及其中IOS操作系統的文件名,可以使用命令show flash:來查看;
4、在路由器中輸入以下命令:
Router# flash tftp
IP address or name of remote host[]?
此處詢問要求存放flash的伺服器的地址是什麼這里可以輸入192.168.100.25然後press ENTER;
(1 )filename to write on tftp host?
此處詢問保存該flash中的文件名是什麼?在此輸入與FLASH中相同的文件名就可以。
(2 )隨後會看到:
writing lab_b.ios !!!!!!!!!!!! ?? !!!!!!!!!!!!!!!!!!!
5926652 bytes copied in 82.712 secs(71654 bytes/sec)
以上的信息說明已經成功完成了, flash tftp已經成功完成了;
Ⅵ 使用https訪問http/https通信協議,需要哪些配置文件
項目里需要訪問其他介面,通過http/https協議。我們一般是用HttpClient類來實現具體的http/https協議介面的調用。
// Init a HttpClient
HttpClient client = new HttpClient();
String url=http://www.xxx.com/xxx;
// Init a HttpMethod
HttpMethod get = new GetMethod(url);
get.setDoAuthentication(true);
get.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(1, false));
// Call http interface
try {
client.executeMethod(get);
// Handle the response from http interface
InputStream in = get.getResponseBodyAsStream();
SAXReader reader = new SAXReader();
Document doc = reader.read(in);
} finally {
// Release the http connection
get.releaseConnection();
}
以上代碼在通過普通的http協議是沒有問題的,但如果是https協議的話,就會有證書文件的要求了。一般情況下,是這樣去做的。
// Init a HttpClient
HttpClient client = new HttpClient();
String url=https://www.xxx.com/xxx;
if (url.startsWith("https:")) {
System.setProperty("javax.net.ssl.trustStore", "/.sis.cer");
System.setProperty("javax.net.ssl.trustStorePassword", "public");
}
於是,這里就需要事先生成一個.sis.cer的文件,生成這個文件的方法一般是先通過瀏覽器訪問https://,導出證書文件,再用JAVA keytool command 生成證書
# $JAVA_HOME/bin/keytool -import -file sis.cer -keystore .sis.cer
但這樣做,一比較麻煩,二來證書也有有效期,過了有效期之後,又需要重新生成一次證書。如果能夠避開生成證書文件的方式來使用https的話,就比較好了。
還好,在最近的項目里,我們終於找到了方法。
// Init a HttpClient
HttpClient client = new HttpClient();
String url=https://www.xxx.com/xxx;
if (url.startsWith("https:")) {
this.supportSSL(url, client);
}
用到了supportSSL(url, client)這個方法,看看這個方法是如何實現的。
private void supportSSL(String url, HttpClient client) {
if(StringUtils.isBlank(url)) {
return;
}
String siteUrl = StringUtils.lowerCase(url);
if (!(siteUrl.startsWith("https"))) {
return;
}
try {
setSSLProtocol(siteUrl, client);
} catch (Exception e) {
logger.error("setProtocol error ", e);
}
Security.setProperty( "ssl.SocketFactory.provider",
"com.tool.util.DummySSLSocketFactory");
}
private static void setSSLProtocol(String strUrl, HttpClient client) throws Exception {
URL url = new URL(strUrl);
String host = url.getHost();
int port = url.getPort();
if (port <= 0) {
port = 443;
}
ProtocolSocketFactory factory = new SSLSocketFactory();
Protocol authhttps = new Protocol("https", factory, port);
Protocol.registerProtocol("https", authhttps);
// set https protocol
client.getHostConfiguration().setHost(host, port, authhttps);
}
在supportSSL方法里,調用了Security.setProperty( "ssl.SocketFactory.provider",
"com.tool.util.DummySSLSocketFactory");
那麼這個com.tool.util.DummySSLSocketFactory是這樣的:
訪問https 資源時,讓httpclient接受所有ssl證書,在weblogic等容器中很有用
代碼如下:
1. import java.io.IOException;
2. import java.net.InetAddress;
3. import java.net.InetSocketAddress;
4. import java.net.Socket;
5. import java.net.SocketAddress;
6. import java.net.UnknownHostException;
7. import java.security.KeyManagementException;
8. import java.security.NoSuchAlgorithmException;
9. import java.security.cert.CertificateException;
10. import java.security.cert.X509Certificate;
11.
12. import javax.net.SocketFactory;
13. import javax.net.ssl.SSLContext;
14. import javax.net.ssl.TrustManager;
15. import javax.net.ssl.X509TrustManager;
16.
17. import org.apache.commons.httpclient.ConnectTimeoutException;
18. import org.apache.commons.httpclient.params.HttpConnectionParams;
19. import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory;
20.
21. public class MySecureProtocolSocketFactory implements SecureProtocolSocketFactory {
22. static{
23. System.out.println(">>>>in MySecureProtocolSocketFactory>>");
24. }
25. private SSLContext sslcontext = null;
26.
27. private SSLContext createSSLContext() {
28. SSLContext sslcontext=null;
29. try {
30. sslcontext = SSLContext.getInstance("SSL");
31. sslcontext.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom());
32. } catch (NoSuchAlgorithmException e) {
33. e.printStackTrace();
34. } catch (KeyManagementException e) {
35. e.printStackTrace();
36. }
37. return sslcontext;
38. }
39.
40. private SSLContext getSSLContext() {
41. if (this.sslcontext == null) {
42. this.sslcontext = createSSLContext();
43. }
44. return this.sslcontext;
45. }
46.
47. public Socket createSocket(Socket socket, String host, int port, boolean autoClose)
48. throws IOException, UnknownHostException {
49. return getSSLContext().getSocketFactory().createSocket(
50. socket,
51. host,
52. port,
53. autoClose
54. );
55. }
56.
57. public Socket createSocket(String host, int port) throws IOException,
58. UnknownHostException {
59. return getSSLContext().getSocketFactory().createSocket(
60. host,
61. port
62. );
63. }
64.
65.
66. public Socket createSocket(String host, int port, InetAddress clientHost, int clientPort)
67. throws IOException, UnknownHostException {
68. return getSSLContext().getSocketFactory().createSocket(host, port, clientHost, clientPort);
69. }
70.
71. public Socket createSocket(String host, int port, InetAddress localAddress,
72. int localPort, HttpConnectionParams params) throws IOException,
73. UnknownHostException, ConnectTimeoutException {
74. if (params == null) {
75. throw new IllegalArgumentException("Parameters may not be null");
76. }
77. int timeout = params.getConnectionTimeout();
78. SocketFactory socketfactory = getSSLContext().getSocketFactory();
79. if (timeout == 0) {
80. return socketfactory.createSocket(host, port, localAddress, localPort);
81. } else {
82. Socket socket = socketfactory.createSocket();
83. SocketAddress localaddr = new InetSocketAddress(localAddress, localPort);
84. SocketAddress remoteaddr = new InetSocketAddress(host, port);
85. socket.bind(localaddr);
86. socket.connect(remoteaddr, timeout);
87. return socket;
88. }
89. }
90.
91. //自定義私有類
92. private static class TrustAnyTrustManager implements X509TrustManager {
93.
94. public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
95. }
96.
97. public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
98. }
99.
100. public X509Certificate[] getAcceptedIssuers() {
101. return new X509Certificate[]{};
102. }
103. }
104.
105. }
public class MySecureProtocolSocketFactory implements SecureProtocolSocketFactory {
static{
System.out.println(">>>>in MySecureProtocolSocketFactory>>");
}
private SSLContext sslcontext = null;
private SSLContext createSSLContext() {
SSLContext sslcontext=null;
try {
sslcontext = SSLContext.getInstance("SSL");
sslcontext.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
return sslcontext;
}
private SSLContext getSSLContext() {
if (this.sslcontext == null) {
this.sslcontext = createSSLContext();
}
return this.sslcontext;
}
public Socket createSocket(Socket socket, String host, int port, boolean autoClose)
throws IOException, UnknownHostException {
return getSSLContext().getSocketFactory().createSocket(
socket,
host,
port,
autoClose
);
}
public Socket createSocket(String host, int port) throws IOException,
UnknownHostException {
return getSSLContext().getSocketFactory().createSocket(
host,
port
然後按如下方式使用HttpClient
Protocol myhttps = new Protocol("https", new MySecureProtocolSocketFactory (), 443);
Protocol.registerProtocol("https", myhttps);
HttpClient httpclient=new HttpClient();
Ⅶ android 中怎樣實現實現smb/cifs的協議和wifi列印機通信
在NetBIOS出現之後,Microsoft就使用NetBIOS實現了一個網路文件/列印服務系統,這個系統基於NetBIOS設定了一套文件共享協議,Microsoft稱之為SMB(Server Message Block)協議。這個協議被Microsoft用於它們Lan Manager和Windows NT伺服器系統中,而Windows系統均包括這個協議的客戶軟體,因而這個協議在區域網系統中影響很大。 隨著Internet的流行,Microsoft希望將這個協議擴展到Internet上去,成為Internet上計算機之間相互共享數據的一種標准。因此它將原有的幾乎沒有多少技術文檔的SMB協議進行整理,重新命名為 CIFS(Common Internet File System),並打算將它與NetBIOS相脫離,試圖使它成為Internet上的一個標准協議。
因此,為了讓Windows和Unix計算機相集成,最好的辦法即是在Unix中安裝支持SMB/CIFS協議的軟體,這樣Windows客戶就不需要更改設置,就能如同使用Windows NT伺服器一樣,使用Unix計算機上的資源了。
與其他標準的TCP/IP協議不同,SMB協議是一種復雜的協議,因為隨著Windows計算機的開發,越來越多的功能被加入到協議中去了,很難區分哪些概念和功能應該屬於Windows操作系統本身,哪些概念應該屬於SMB 協議。其他網路協議由於是先有協議,實現相關的軟體,因此結構上就清晰簡潔一些,而SMB協議一直是與Microsoft 的操作系統混在一起進行開發的,因此協議中就包含了大量的Windows系統中的概念。 在SMB協議中,計算機為了訪問網路資源,就需要了解網路上存在的資源列表(例如在Windows下使用網路鄰居查看可以訪問的計算機),這個機制就被稱為瀏覽(Browsing)。雖然SMB協議中經常使用廣播的方式,但如果每次都使用廣播的方式了解當前的網路資源(包括提供服務的計算機和各個計算機上的服務資源),就需要消耗大量的網路資源和浪費較長的查找時間,因此最好在網路中維護一個網路資源的列表,以方便查找網路資源。只有必要的時候,才重新查找資源,例如使用Windows下的查找計算機功能。
但沒有必要每個計算機都維護整個資源列表,維護網路中當前資源列表的任務由網路上的幾個特殊計算機完成的,這些計算機被稱為Browser,這些Browser通過記錄廣播數據或查詢名字伺服器來記錄網路上的各種資源。
Browser並不是事先指定的計算機,而是在普通計算機之間通過自動進行的推舉產生的。不同的計算機可以按照其提供服務的能力,設置在推舉時具備的不同權重。為了保證一個Browser停機時網路瀏覽仍然正常,網路中常常存在多個Browser,一個為主Browser(Master Browser),其他的為備份Browser。 工作組和域這兩個概念在進行瀏覽時具備同樣的用處,都是用於區分並維護同一組瀏覽數據的多個計算機。事實上他們的不同在於認證方式上,工作組中每台計算機都基本上是獨立的,獨立對客戶訪問進行認證,而域中將存在一個(或幾個)域控制器,保存對整個域中都有效的認證信息,包括用戶的認證信息以及域內成員計算機的認證信息。瀏覽數據的時候,並不需要認證信息,Microsoft將工作組擴展為域,只是為了形成一種分級的目錄結構,將原有的瀏覽和目錄服務相結合,以擴大Mircrosoft網路服務范圍的一種策略。 工作組和域都可以跨越多個子網,因此網路中就存在兩種Browser,一種為Domain Master Browser ,用於維護整個工作組或域內的瀏覽數據,另一種為Local Master Browser,用於維護本子網內的瀏覽數據,它和Domain Master Browser通信以獲得所有的可瀏覽數據。劃分這兩種Browser 主要是由於瀏覽數據依賴於本地網廣播來獲得資源列表,不同子網之間只能通過瀏覽器之間的交流能力,才能互相交換資源列表。
但是,為了瀏覽多個子網的資源,必須使用NBNS名字伺服器的解析方式,沒有NBNS的幫助,計算機將不能獲得子網外計算機的NetBIOS名字。Local Master Browser也需要查詢NetBIOS名字伺服器以獲得Domain Master Browser的名字,以相互交換網路資源信息。
由於域控制器在域內的特殊性,因此域控制器傾向於被用做Browser,主域控制器應該被用作Domain Master Browser,他們在推舉時設置的權重較大。 在Windows 9x系統中,習慣上使用共享級認證的方式互相共享資源,主要原因是在這些Windows系統上不能提供真正的多用戶能力。一個共享級認證的資源只有一個口令與其相聯系,而沒有用戶數據。這個想法是適合於一小組人員相互共享很少的文件資源的情況下,一旦需要共享的資源變多,需要進行的限制復雜化,那麼針對每個共享資源都設置一個口令的做法就不再合適了。
因此對於大型網路來講,更適合的方式是用戶級的認證方式,區分並認證每個訪問的用戶,並通過對不同用戶分配許可權的方式共享資源。對於工作組方式的計算機,認證用戶是通過本機完成的,而域中的計算機能通過域控制器進行認證。當 Windows計算機通過域控制器的認證時,它可以根據設置執行域控制器上的相應用戶的登錄腳本並桌面環境描述文件。 共享資源 每個SMB伺服器能對外提供文件或列印服務,每個共享資源需要被給予一個共享名,這個名字將顯示在這個伺服器的資源列表中。然而,如果一個資源的名字的最後一個字母為$,則這個名字就為隱藏名字,不能直接表現在瀏覽列表中,而只能通過直接訪問這個名字來進行訪問。 在SMB協議中,為了獲得伺服器提供的資源列表,必須使用一個隱藏的資源名字IPC$來訪問伺服器,否則客戶無法獲得系統資源的列表。 l SMB是過去Windows網路中用來存取遠程文件的通訊協議
n 無法整合新的NTFS功能
n 並不是設計用來傳輸大型的遠程文件
l SMB2內建在Windows Vista與Windows Server 2008
n 支援 NTFS客戶端符號鏈接
n 所有操作可以批處理,減少 client/server之間的來回
n 支持更大的暫存大小,比以前增加 30到40倍的傳輸量 SMB透明故障轉移:讓管理員可執行群集文件伺服器中節點的硬體或軟體維護,且不會中斷將數據存儲在這些文件共享上的伺服器應用程序。此外,如果群集節點出現硬體或軟體故障,SMB 客戶端將以透明方式重新連接到其他群集節點,且不會中斷將數據存儲在這些文件共享上的伺服器應用程序。即客戶端能夠持續、穩定的對遠程文件伺服器進行通訊,用戶不會感受到單點伺服器故障所帶來的性能影響(不兼容SMB1.0或SMB2.x)。 SMB橫向擴展:可構建橫向擴展文件伺服器(Scale-Out File Server),在使用群集共享卷(CSV)版本2時,管理員可以通過文件伺服器群集中所有節點,創建可供同時訪問含直接I/O的數據文件的文件共享。這可更好地利用文件伺服器客戶端的網路帶寬和負載平衡,以及優化伺服器應用程序的性能。 SMB多通道:如果在SMB3.0客戶端及伺服器之間提供多條路徑,則支持網路帶寬和網路容錯的聚合,提升了網路可用性及文件伺服器的穩定性,並讓伺服器應用程序可以充分利用可用網路帶寬,以及在發生網路故障時快速恢復。 SMB直接訪問(SMB over Remote Direct Memory Access[RDMA]):支持使用具有RDMA功能且可全速運行的網路適配器,其中延遲非常低且CPU利用率極少。對於Hyper-V或Microsoft SQL Server等實現工作負載,這讓遠程伺服器如同本地存儲一般。 用於伺服器應用程序的性能計數器:全新 SMB 性能計數器提供有關吞吐量、延遲和 I/O/秒 (IOPS) 的按共享列出的詳細信息,從而讓管理員可以分析用於存儲數據的 SMB 3.0 文件共享的性能。這些計數器專為將文件存儲在遠程文件共享上的伺服器應用程序而設計,如 Hyper-V 和 SQL Server。 性能優化:SMB 3.0 客戶端和 SMB 3.0 伺服器均已針對小型隨機讀/寫 I/O 優化,這種 I/O 在 SQL Server OLTP 等伺服器應用程序中很常見。此外,默認情況下打開大型最大傳輸單元 (MTU),這將大幅提高大型連續傳輸性能,如 SQL Server 數據倉庫、資料庫備份或還原、部署或復制虛擬硬碟。 SMB加密:提供SMB數據的端對端加密並防止數據在未受信任網路中遭受竊聽。無需新部署成本,且無需Internet協議安全性(IPsec)、專用硬體或WAN加速器。它可按共享配置,也可針對整個文件伺服器配置,並且可針對數據遍歷未受信任網路的各種方案啟動。 為SMB文件共享所提供的VSS: SMB目錄租用:縮短分支機構的應用程序響應時間。使用目錄租用後,縮短了從客戶端到伺服器的往返時間,因為是從保留時間較長的目錄緩存中檢索元數據。緩存一致性得到保持,因為在伺服器上的目錄信息更改時將通知客戶端。適用於 主文件夾(讀/寫,無共享)和 發布(只讀,帶共享)。 SMB PowerShell:藉助於全新的SMB Windows PowerShell cmdlet,管理員可以從命令行以端對端方式管理文件伺服器上的文件共享。