UNPv1第二十一章 帶外資料

2021-07-11 10:55:29 字數 1654 閱讀 3748

帶外資料被認為具有比普遍資料更高的優先順序。帶外資料並不要求在客戶和伺服器之間在使用乙個連線,而是被對映到已有的連線中

tcp沒有真正的帶外資料,而是提供了乙個我們要討論的緊急模式(urgent mode)。假設乙個程序已向乙個tcp套介面寫入了n位元組資料,並且這些資料被tcp放入套介面傳送緩衝區等待傳送給對方。下圖展示了這種狀態,並且標記了從1到n的資料位元組。

程序現在使用send函式和msg_oob標誌傳送乙個包含ascii字元a的帶外資料位元組:

send(fd, "a", 1, msg_oob);
tcp將資料放置在套機口傳送緩衝區的下乙個可用位置,並設定這個連線的tcp緊急指標(urgent pointer)為下乙個可用位置。下圖中展示了這種狀態,並且標記帶外位元組為「oob」

給定如圖所示的tcp套介面傳送緩衝區狀態,由tcp傳送的下乙個分節將會在tcp頭部中設定urg標誌,並且頭部中的緊急偏移(urgent offset)欄位也將指向帶外位元組後的位元組。但是這個分節可以含有也可以不含有我們標記的oob位元組。是否傳送oob位元組取決於在套介面傳送緩衝區它前面的位元組數、tcp傳送給對方的分節長度以及對方通告的當前視窗

每當接收到帶外資料時,就有乙個相關聯的帶外標記。這是傳送程序傳送帶外位元組時在傳送方普通資料流中的位置。接收程序讀套介面時通過呼叫sockatmark函式確定是否在帶外標記上。

#include 

int sockatmark(int sockfd) ;

//返回值:如果在帶外標記上為1, 不在標記上為0, 出錯為-1

下面給出了使用的siocatmark ioctl完成本函式的乙個實現

#include    "unp.h"

int sockatmark(int fd)

讀操作總是會停在帶外標記上,也就是,如果在套介面接收緩衝區中有100個位元組,但帶外標記前只有5個位元組,程序執行read請求100位元組,則只有標記前的5個位元組返回。這種在標記處的強制停止允許程序呼叫sockatmark確定是否緩衝區指標在標記處。

當我們考慮可能出現的定時問題時,帶外資料會變得繁雜。要考慮的第一點是帶外資料的概念實際上傳遞給接收者三條不同的資訊。

傳送者進入緊急模式的事實,接收程序可以用sigurg訊號或者select得到通知。這種通知在傳送者傳送帶外資料後立即傳輸,因為在圖21.11中我們看到即使傳送資料給接收者因tcp的流控而停止了,tcp仍傳送這種通知。這種通知可能導致接收者進入某種特殊處理模式,以處理收到的後繼資料。

帶外位元組的位置,也就是說相對於傳送者的其餘資料,它是在哪兒發出的帶外標記。

帶外位元組的實際值。由於tcp是乙個位元組流協議,它不解釋應用程序傳送的資料,因此這可以是任何8位值

對於tcp的緊急模式,我們可以認為urg標誌是通知,緊急指標是標記,資料位元組是其本身。

和這種帶外資料相關的問題是

(a)每個連線只有乙個tcp緊急指標

(b)每個連線只有乙個帶外標記

(c)每個連線只有乙個位元組的帶外緩衝區

第二十一章 資料結構

知識點 1 棧 stack 資料先進後出。方法 is empty 查詢資料是否為空 push 新增資料 pop 移除資料 peek 返回頂部元素 size 查詢資料量 2 佇列 queue 資料先進先出。方法 enqueue 新增元素 dequeue 移除元素 is empty 查詢是否為空 siz...

JAVA第二十一章(小結)

1 遞迴 理解 1 方法定義中呼叫方法本身的現象 舉例 老和尚給小和尚講故事,我們學程式設計 2 遞迴的注意事項 a 要有出口,否則就是死遞迴 b 次數不能過多,否則記憶體溢位 c 構造方法不能遞迴使用 3 遞迴的案例 a 遞迴求階乘 b 兔子問題 c 遞迴輸出指定目錄下所有指定字尾名的檔案絕對路徑...

第二十一章 變換(七)

錨定規模 以下是一些螢幕截圖,顯示 從左到右 相對於左下角相對於右下角和相對於中心底部的縮放 如果您熟悉ios程式設計,則可以了解類似的anchorpoint屬性。在ios中,此屬性會影響定位和轉換中心。在xamarin.forms中,anchorx和anchory屬性僅指定轉換中心。這意味著xam...