文檔描述了使用NDDS抽象可插拔傳輸接口實作傳輸插件的方法。本文檔假定對DDS标準的術語有一定的熟悉程度。
開發插件需要四個方面:
- 方法:每個Transport-Plugin實作必須提供的方法
- 資源:通過Transport Plugin處理發送或接收消息所需的資訊
- 資訊:支援從傳輸插件接收的消息
- 監聽者:傳輸插件用于通知傳輸插件中動态更改的NDDS核心的API
詳細說明:
該方法抽象出NDDS用來發送和接收消息的實際機制。 它是NDDS核心和“傳輸”層之間的API
概觀
該子產品的目标是提供一個通用的API,可以映射到任何所需的“實體傳輸”,如IP套接字,反射記憶體,串行,無線或其他傳輸。
該API旨在實作高性能,并允許NDDS利用特定傳輸提供的分散收集,零拷貝和其他高性能設施。
傳輸被模組化為一種設施,提供描述消息接收者位址,發送消息和接收消息的方法。 傳輸将消息本身視為給定長度的不透明位元組資料包。 對于NDDS,傳遞給傳輸層的消息實際上是RTPS消息,每條消息都是按照實時釋出訂閱線上協定格式化的。
傳輸插件是通過提供一組函數來建立的,這些函數定義了如何建立,銷毀和使用資源來發送和接收消息(概念上說, SendResources和RecvResources )。 這些“資源”究竟取決于Transport Plugin本身的實作。 例如,對于IP套接字通信,其中一個資源将是用于發送或接收資料的套接字的句柄,通常是套接字描述符。
這些功能一起分組到方法中 。 這裡實作這些方法的代碼将被稱為“傳輸插件”。
由于NDDS是DDS标準的實作,是以對Transport-Plugin設計有一些解釋,這些設計将與DDS引入的概念聯系起來。
設計
以下段落解釋了方法的設計,以及設計背後的一些基本原理。 首先請注意,傳輸插件的API涉及多個實體。
第一個是Transport Plugin的實作者。 該人員負責建立符合API規範的代碼,并正确地與任何用于通信的傳輸硬體/軟體進行互動。
另一個是NDDS本身。 NDDS核心代碼将通過API使用傳輸插件與其他NDDS應用程式建立聯系和交換資料。
最後,使用NDDS的應用程式的建立者也希望使用特定的傳輸插件。 這個人,也被稱為“最終使用者”,需要調用傳輸插件提供的API來執行個體化和配置插件,供NDDS在其應用程式中使用。
Transport-Plugin API的某些部分隻能由NDDS核心使用,其他部分隻能由最終使用者使用。
基本要素
傳輸屬性
Transport-Plugin實作需要為定義良好的一組通用傳輸獨立屬性提供值,以便NDDS核心代碼了解插件的一些限制,例如最大消息大小。 這些屬性由NDDS_Transport_Property_t結構定義。
這些屬性是不可變的。 一旦傳輸插件已注冊到NDDS核心,這些屬性的值不能在插件存在時更改。
發送端的屬性與使用同一個Transport-Plugin類的不同執行個體進行通信的接收端相容很重要 。 例如,如果一方被配置為發送大于另一方可以接收的消息,則通信可能會通過該插件失敗。
當然,這并不妨礙Transport-Plugin實作者建立插件,以確定在建立連接配接時它們具有相容屬性。 但是,NDDS核心本身隻會使用插件執行個體初始注冊時設定的屬性值。
在傳輸插件中尋址
消息的目的地由位址和端口号表示。 位址用IPv6表示法中的一個16位元組數表示,請參閱位址 。 運輸工具将使用此位址來确定如何将消息發送到遠端計算機。 另外,一些傳輸可以使用端口号來進一步辨別消息被傳送到遠端機器上的哪個程序或線程。
位址将是Transport Plugin接口的位址,請參閱接口 。 具有多個接口的Transport Plugin的執行個體可以接收具有不同目标位址的消息。
特定的傳輸插件實作可能不需要也不能解決16位元組位址空間中所有2 ^ 128個可能的值。 這将取決于傳輸插件的每個實作,以确定它需要從16位元組位址空間獲得多少位址,以及如何将這些位址映射到傳輸本身的任何尋址方案。
例子
基于IPv4的傳輸插件永遠不會超過4個位元組的目标位址。 此外,對于IPv4,将IPv4位址的4個位元組映射到NDDS傳輸 - 插件API所需的16位元組尋址方案是很簡單的。
傳輸基于專用點對點連結(例如串行端口)的插件可能根本不需要任何位址(回想一下,它們僅用于允許傳輸确定它發送消息的目标接口)。 給定要發送的消息時,基于序列槽的插件隻能将其發送到一個目的地,即串行端口的另一端。 再一次,映射到一個16位元組的位址是微不足道的。
一些傳輸可能不會在其原生位址方案中使用數字,例如Stargen Star Star。 現在将由NDDS插件的實作者決定,以便傳輸建立從本地尋址到16位元組數值的唯一映射,反之亦然。
是以,所有傳輸必須将其自己的“目标位址”内部表示映射為數字16位元組表示。 傳輸插件應該隻使用傳輸所需的16位元組位址空間的許多位。 NDDS将使用其餘位作為唯一辨別具有重疊位址空間的不同傳輸的方式。 請參閱NDDS_Transport_Property_t :: address_bit_count 。
例如,一個IPv4-UDP傳輸插件有一個4位元組的位址空間(0:0:0:0:0:0:xxxx:xxxx),是以它的address_bit_count是96.一個傳輸插件可以使用多達256個串行端口同時隻需要一個1位元組位址空間(0:0:0:0:0:0:0:00xx, address_bit_count為120)。 但是,如果應用程式使用兩種插件,則位址0:0:0:0:0:0:0001不明确,因為它是兩個插件中的有效目标位址。
是以,最終使用者必須能夠配置NDDS以同時使用兩個傳輸插件,以便NDDS使用的位址在所有傳輸中都是唯一且不重疊的。 是以引入了網絡 位址的概念。
網絡位址是Transport Plugin未使用的16位元組位址的一部分。 這可以從0位到128位不等。 結構NDDS_Transport_Property_t的address_bit_count用于通知NDDS核心位址的多少位對于傳輸是重要的。 不管剩下的是什麼,128- address_bit_count都可以用作網絡位址。
隻要網絡位址至少有1位可用,NDDS就可以使用該位來區分該傳輸的單個執行個體與其他傳輸。
例如,對于前面描述的UDP和串行傳輸插件,網絡位址的UDP傳輸長度為12個位元組,串行傳輸的長度為15個位元組。
yyyy:yyyy:yyyy:yyyy:yyyy:yyyy:xxxx:xxxx ,對于IPv4-UDP
yyyy:yyyy:yyyy:yyyy:yyyy:yyyy:yyyy:yyxx ,for Serial
位址的yy部分是網絡位址, xx部分由傳輸器本身使用。
現在,最終使用者可以配置傳輸插件,以便NDDS可以根據其完整的16位元組位址唯一确定使用哪個傳輸來發送消息。 請參閱此配置API。
例如,可以将IPv4-UDP傳輸的網絡位址設定為1000:0:0:0:0:0:xxxx:xxxx,并将串行傳輸的網絡位址設定為2000:0:0:0:0: 0:0:00XX。 然後,目标位址以1開頭的消息将通過IPv4-UDP傳輸發送,而以2開頭的消息将通過串行傳輸發送。
1000 :0:0:0:0:0:xxxx:xxxx,一個IPv4目标
2000 :0:0:0:0:0:0:00xx是一個串行目标。
如果應用程式中安裝了這兩個傳輸插件執行個體,那麼未使用的網絡位址部分将用于為所有插件建立唯一的,不重疊的位址範圍。
注意:
在通過相同實體傳輸連接配接的所有不同應用程式中的相同傳輸插件的所有執行個體,即通過相同“網絡”上的傳輸進行通信,都必須配置相同的網絡位址。
有關使用網絡位址注冊傳輸插件的更多資訊,請參閱配置API。
在運輸層面不需要可靠性
Transport Plugin使用的實際傳輸不需要可靠。 通過傳輸器發送的消息可能會丢失或丢失。 NDDS在方法之上實施可靠的協定,以支援DDS API所需的可靠消息傳遞功能。
但是,傳輸插件需要確定傳遞到NDDS核心的消息内容沒有任何改變。 是以消息必須在沒有訛誤的情況下完整傳遞。 如果傳輸檢測到但無法更正損壞或截斷的消息,則應删除這些消息,并依賴NDDS核心根據需要重新發送消息。
多種運輸
正如前面的讨論所暗示的,應用程式可能會将NDDS配置為同時使用多個傳輸。 預設情況下,NDDS将自動執行個體化,配置和注冊内置傳輸。 這些傳輸使用系統共享記憶體(請參閱NDDS_Transport_Shmem_Plugin)以及使用IPv4-UDP套接字(請參閱NDDS_Transport_UDPv4_Plugin)跨IP網絡的單點傳播和多點傳播通信啟用程序間通信。 内置的Transport Plugins與NDDS使用者建立的任何插件符合相同的API。
NDDS使用者可以執行個體化,配置和注冊自定義傳輸插件,并根據需要将它們與内置傳輸結合使用或替代内置傳輸。 使用者可能希望實施他們自己版本的NDDS内置傳輸插件,以内置插件不支援的方式定制這些傳輸的行為。 有關更多資訊,請參閱NDDSTransportUserModule。
無連接配接或面向連接配接
Transport-Plugin API不承擔面向連接配接或無連接配接的傳輸。 一個應該能夠使用面向連接配接的,例如TCP或無連接配接的(例如,UDP)傳輸來實作API。
網絡接口
傳輸插件可以在插件的單個執行個體中“管理”多于一個網絡接口。 什麼是網絡接口? 雖然它可以轉換為用于特定類型傳輸的不同實體裝置,但是網絡接口可以被定義為同一網絡上的其他接口可以用來發送消息的唯一位址(參見接口 )。
例如,對于基于IP的傳輸,計算機上可能安裝了許多不同的接口,包括實體(實際NIC卡)和虛拟(如VPN通道)。 使用基于IP的傳輸的傳輸插件的實作者可以選擇設計插件,以便單個執行個體可以同時在計算機上的所有IP接口上使用(發送和接收)。 或者一個不太複雜的設計可能會限制一個執行個體隻附加到一個單一的接口。 或者更複雜的設計可能允許使用者選擇允許執行個體使用哪個網絡接口(如NDDS_Transport_UDPv4_Plugin的情況)。
NDDS将調用插件get_receive_interfaces_cEA()提供的函數來擷取插件表示(使用)的接口清單。 在以下關于使用傳輸插件發送和接收的讨論中,當動作預期會影響插件管理的所有接口或僅影響子集時( 發送多個接口并使用多個接口接收 ),将很重要。