帶外資料OOB與緊急模式URG

2021-07-24 00:17:06 字數 3601 閱讀 3570

a,tcp支援帶外資料oob嗎?與緊急模式urg有什麼關係?

tcp支援帶外資料,但是只有乙個oob位元組,tcp的帶外資料是通過緊急模式urg實現的.

b,我們知道send(sendfd,"abc",3,msg_oob),將傳送3個位元組的帶外資料oob資料.但是這裡tcp又只支援乙個位元組的oob,難道丟掉2個位元組?

tcp將把緊急模式urg 置位,緊急指標定位第三個位元組("c")(這裡不管它的具體位置,緊急指標的作用就是提供定位那個oob位元組的資訊),前兩個位元組("ab")當作普通位元組傳送.其實tcp總是把最後乙個位元組當作oob資料,其他的當作普通位元組.不管你通過帶msg_oob標誌的send***函式傳送多少位元組帶外資料oob資料,傳送端只把最後乙個位元組當作oob資料,接收端也只能收到乙個位元組的oob資料.

c,如果一定要傳送多位元組的帶外資料,讓接收端能一次收到多個位元組的帶外資料.能不能做到?

對於tcp協議,不能!

d,對於tcp,收到的帶外資料怎麼儲存?

兩種模式:

1,非oobinline模式,這是套接字的預設模式,把oob位元組與普通位元組分開存放.存放在乙個oob緩衝區中,當然tcp只有乙個位元組,可以用乙個位元組儲存oob資料.

2,oobinline模式,oob位元組和普通位元組一起存放,它和普通位元組本來就是一起傳送,當然可以一起存放.

e,recv(recvfd,buff,256,msg_oob).會有哪些結果?

recv***x函式,在msg_oob模式下,將在oob緩衝區中尋找資料

如果傳送端沒傳送oob位元組,它返回錯誤.

如果傳送端傳送了oob位元組:

1,對於非oobinline模式,它返回1位元組的oob資料.

2,對於oobinline模式,它返回錯誤.因為oob位元組沒有放到oob緩衝區中.

f,如果傳送端使用msg_oob模式,send(sendfd,sndbuff,64,msg_oob),傳送了包含"oob位元組"的64位元組資料,然後用非msg_oob模式,send(sendfd,sndbuff,64,0)傳送64位元組,當接收端收到64+64位元組的資料後,用recv(recvfd,revbuff,256,0).會有哪些結果?

1,對於非oobinline模式,第一次recv(recvfd,revbuff,256,0)只返回前63位元組的普通資料,接收緩衝區剩下64位元組.要獲得1位元組的oob資料,必須使用msg_oob模式的rev***函式.再次recv(recvfd,revbuff,256,0),返回第二次傳送的64位元組.一次recv***不跨越urg-mark標記.

2,對於oobinline模式,第一次recv(recvfd,revbuff,256,0)只返回前63位元組的普通資料,接收緩衝區剩下65位元組(oob+64位元組),第二次recv(recvfd,revbuff,256,0),對於windows,只返回一位元組的oob位元組,需要第三次rev才能返回最後的64位元組,對於linux/unix,第二次rev 就返回65位元組(oob+64位元組).總之與協議棧的實現有關.

g,如果oob位元組沒被應用程式讀取,協議棧又收到了新的oob位元組,會出現什麼情況?

tcp協議對每個socket保持乙個urg指標,此時直接重新整理urg指標,指向新的oob位元組.

對於非oobinline,舊的oob位元組直接被丟棄,被新的oob位元組覆蓋.

對於oobinline,舊的oob位元組仍然在接收緩衝區中,但被當著普通資料看待,每個socket只有乙個urg指標,只能定位乙個oob位元組.

tcp 上沒有真正意義上的「帶外資料」。tcp 是由一種叫做「緊急模式」的方法來傳

輸帶外資料的。假設乙個程序向乙個tcp 套接字寫入了n 個位元組的資料資料被tcp 套

接字的傳送緩衝區快取,等待被傳送到網路上面.我們在圖6-10 可以看見資料的排列。

第6 章berkeley 套接字- 191 -

圖6-10 tcp資料的排列

現在程序使用以msg_oob 為引數的send()函式寫入乙個單位元組的"帶外資料",包

含乙個ascii 字元"a":

send(fd, 「a」, 1, msg_oob);

tcp 將資料放在下乙個可用的傳送緩衝區中,並設定這個連線的"緊急指標"(urgent

pointer)指向下乙個可用的緩衝區空間.圖6-11 表示了我們描述的這個狀態,並將帶外數

據(out-of-band)表示為"oob"。

圖6-11 odb資料

tcp 的緊急指標的指向的位置是在程式傳送的oob資料的後面。

由圖6-11 所表示的tcp 套接字的狀態,得知下乙個將要傳送的資料是tcp 的urg

(urgent pointer)標誌,傳送完urg 標誌,tcp 才會傳送下面的帶外資料的那個位元組。

但是tcp 所一次傳送的資料中,可能只包含了tcp 的urg 標誌,卻沒有包含我們所傳送

的oob資料.是否會發生這種情況而取決於tcp 將要傳送的資料佇列中,在oob資料

之前的資料的多少。如果在一次傳送中,oob 前的資料已經佔滿了名額,則tcp 只會發

送urg 標誌,不會傳送oob資料

tcp傳送帶外資料

伺服器端 testnet include using namespace std include include include include include include include include include include define buf size 1024 int main...

帶外資料的程式設計實現

驗證帶外資料的傳送與接收的各種方式。利用帶外資料原理設計並實現客戶 伺服器心搏函式。用於發現對端主機或到對端的通訊路徑的過早失效。假設每1 秒鐘輪詢一次,若持續5 秒鐘沒有聽到對端應答則認為對端已不再存活,這些值可以有應用程式改動。1.客戶 伺服器心搏機制 每隔1 秒鐘向伺服器傳送乙個帶外位元組,伺...

APUE 網路IPC 套接字之帶外資料

帶外資料 out of band data 是一些通訊協議所支援的可選特徵,允許更高優先順序的資料比普通資料優先傳輸。即使傳輸佇列已經有資料,帶外資料先行傳輸。tcp支援帶外資料,但是udp不支援。套接字介面對帶外資料的支援,很大程度受tcp帶外資料具體實現的影響。tcp將帶外資料稱為 緊急 資料 ...