簡介
傳輸層協定使用帶外數據(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規範的討論範圍。
流套接口的抽象中包括了帶外數據這一概念,帶外數據是相連的每一對流套接口間一個邏輯上獨立的傳輸通道。帶外數據是獨立於普通數據傳送給用戶的,這一抽象要求帶外數據設備必須支持每一時刻至少一個帶外數據訊息被可靠地傳送。這一訊息可能包含至少一個位元組;並且在任何時刻僅有一個帶外數據信息等候傳送。對於僅支持帶內數據的通訊協定來說(例如緊急數據是與普通數據在同一序列中傳送的),系統通常把緊急數據從普通數據中分離出來單獨存放。這就允許用戶可以在順序接收緊急數據和非順序接收緊急數據之間作出選擇(非順序接收時可以省去快取重疊數據的麻煩)。在這種情況下,用戶也可以“偷看一眼”緊急數據。
(WSAAsyncSelect)函式可以用於處理對帶外數據到來的通知。