複製鏈接
請複製以下鏈接發送給好友

帶外數據

鎖定
使用與普通數據不同的通道獨立傳送給用户,是相連的每一對流套接口間一個邏輯上獨立的傳輸通道。
中文名
帶外數據
別    名
TCP緊急數據

帶外數據效果用途

傳輸層協議使用帶外數據(out-of-band,OOB)來發送一些重要的數據,如果通信一方有重要的數據需要通知對方時,協議能夠將這些數據快速地發送到對方。為了發送這些數據,協議一般不使用與普通數據相同的通道,而是使用另外的通道。linux系統的套接字機制支持低層協議發送和接受帶外數據。但是TCP協議沒有真正意義上的帶外數據。為了發送重要協議,TCP提供了一種稱為緊急模式(urgent mode)的機制。TCP協議在數據段中設置URG位,表示進入緊急模式。接收方可以對緊急模式採取特殊的處理。很容易看出來,這種方式數據不容易被阻塞,並且可以通過在我們的服務器端程序裏面捕捉SIGURG信號來及時接受數據。這正是我們所要求的效果。
由於TCP協議每次只能發送和接受帶外數據一個字節,所以,我們可以通過設置一個數組,利用發送數組下標的辦法讓服務器程序能夠知道自己要監聽的端口以及要連接的服務器IP/port。由於限定在1個字節,所以我們最多隻能控制255個port的連接,255個內網機器(不過同一子網的機器不會超過255J),同樣也只能控制255個監聽端口,不過這些已經足夠了。

帶外數據技術應用

以下對於帶外數據(也稱為TCP緊急數據)的討論,都是基於BSD模型而言的。用户和實現者必須注意,有兩種互相矛盾的關於RFC 793的解釋,也就是在這基礎上,帶外數據這一概念才被引入的。而且BSD對於帶外數據的實現並沒有符合RFC 1122定下的主機的要求,為了避免互操作時的問題,應用程序開發者最好不要使用帶外數據,除非是與某一既成事實的服務互操作時所必須的。Windows Sockets提供者也必須提供他們的產品對於帶外數據實現的語義的文檔(採用BSD方式或者是RFC 1122方式)。規定一個特殊的帶外數據語義集已經超出了Windows Sockets規範的討論範圍。
流套接口的抽象中包括了帶外數據這一概念,帶外數據是相連的每一對流套接口間一個邏輯上獨立的傳輸通道。帶外數據是獨立於普通數據傳送給用户的,這一抽象要求帶外數據設備必須支持每一時刻至少一個帶外數據消息被可靠地傳送。這一消息可能包含至少一個字節;並且在任何時刻僅有一個帶外數據信息等候發送。對於僅支持帶內數據的通訊協議來説(例如緊急數據是與普通數據在同一序列中發送的),系統通常把緊急數據從普通數據中分離出來單獨存放。這就允許用户可以在順序接收緊急數據和非順序接收緊急數據之間作出選擇(非順序接收時可以省去緩存重疊數據的麻煩)。在這種情況下,用户也可以“偷看一眼”緊急數據。
某一個應用程序也可能喜歡線內處理緊急數據,即把其作為普通數據流的一部分。這可以靠設置套接口選項中的SO_OOBINLINE來實現。在這種情況下,應用程序可能希望確定未讀數據中的哪一些是“緊急”的(“緊急”這一術語通常應用於線內帶外數據)。為了達到這個目的,在Windows Sockets的實現中就要在數據流保留一個邏輯記號來指出帶外數據從哪一點開始發送,一個應用程序可以使用SIOCATMARK ioctlsocket()命令來確定在記號之前是否還有未讀入的數據。應用程序可以使用這一記號與其對方進行重新同步
(WSAAsyncSelect)函數可以用於處理對帶外數據到來的通知。