1. 程式人生 > >linux udp組播接收問題及原理分析

linux udp組播接收問題及原理分析

現象:

在某個網路環境下,同一個udp組播源(igmpv2),同樣的收流程式碼,在windows上能收到,linux上收不到。排除網路拓撲結構、程式語言、硬體驅動等問題,我們就此問題來分析原理及解決方案。

環境:

交換機出,組播地址224.X.X.X,機器多網絡卡,eth0收流

配置靜態IP地址,已關閉NetworkManager服務,iptables規則配置沒有問題

實驗:

1、在不同的LINUX發行版(opensuse、centos、ubuntu)上進行測試:均收不到。

2、直接tcpdump:收不到

3、配置一條路由 route add -net 224.0.0.1 netmask 255.0.0.0 dev eth0,重啟網絡卡:能收到流,約1分鐘以後斷掉,重啟收流程式沒有反應

4、重複3測試,發現規律:每次重啟網絡卡後,配置路由,大概能收流1分鐘,就再也收不到流了

5、將路由配置成 route add -net 0.0.0.0 netmask 0.0.0.0 dev eth0,重啟網絡卡:能穩定收流了

分析:

1、與LINUX發行版無關,而是LINUX核心統一的問題。

2、IGMP V2客戶端不請求的時候,交換機不會將組播分配到網絡卡。

3、4、5: 這裡需要結合一下IGMP V2協議的原理:

①交換機將詢問所有的網內機器,誰需要加入組播組

②若一臺主機需要加入組播組,需要傳送入組報文

③交換機收到入組報文,給主機分發IP資料報文

④退組機制有兩種:1、主機主動退出(發出退出報文) 2、交換機輪詢存活主機沒有響應(超時)

可以看到,問題大概就出在這裡。

具體的我查閱了IGMP原理手冊,IGMP各種信令報文走的無外乎224.0.0.1 或224.1.1.1(不知是否可配),懷疑255.0.0.0將主機對於IGMPV2的存活查詢反饋報文給過濾了,而這種反饋報文每次未必走的一樣的地址,包括入組報文,後續也發不出去了。

解決方法:

1、暴力流:直接將路由的全域性出口均走收流網絡卡( route add -net 0.0.0.0 netmask 0.0.0.0 dev eth0),其他網絡卡若需要通訊,單獨配路由。

2、待研究:需要仔細研究IGMPV2的信令傳送(不知是否和交換機配置相關),來配置合適的路由規則。

這裡要說一下windows為什麼不用關心這些,我理解windows自身有一個編寫的比較好的NetworkManager服務,能夠根據應用程式的請求靈活配置路由規則,這裡不詳細研究了。總之,若同樣的網路環境,LINUX收組播流有各種奇葩問題,基本都是路由配置的問題。

相關推薦

linux udp接收問題原理分析

現象: 在某個網路環境下,同一個udp組播源(igmpv2),同樣的收流程式碼,在windows上能收到,linux上收不到。排除網路拓撲結構、程式語言、硬體驅動等問題,我們就此問題來分析原理及解決方案。 環境: 交換機出,組播地址224.X.X.X,機器多網絡卡,eth

UDP接收端解析

網路中的一臺主機如果希望能夠接收到來自網路中其它主機發往某一個組播組的資料報,那麼這麼主機必須先加入該組播組,然後就可以從組地址接收資料包。在廣域網中,還涉及到路由器支援組播路由等,但本文希望以一個最為簡單的例子解釋清楚協議棧關於組播的一個最為簡單明瞭的工作過程,甚至,我們不希望涉及到 IGMP包。

從ffmpeg中抽取出來的UDP接收程式

前言 程式碼抽取方法: 1. 跟蹤並複製    跟蹤要抽取程式碼的主要流程, 將主流程相關的,函式層次不是很深的程式碼原樣複製到新的工程中;    函式呼叫層次很複雜的函式可以先只留下函式介面,將函式體的內容全部註釋掉。 2. 編譯    編譯新的工程,一個一

linux下怎麼使用C語言編寫接收和傳送udp資料?

一,傳送端 程式碼如下: 先呼叫initUdpMultiCastSender初始化, int initUdpMultiCastSender(uint32_t localip,uint16_t localport) { int sockfd = socket(AF_

與廣播原理分析區別

 1.0 廣播 廣播的用途 假定伺服器主機在本地區域網上,但不知道它的單播IP地址時對它進行定位,即進行資源發現。 當有多個客戶和單個伺服器通訊時,減少區域網上的資料流量。 使用廣播的因特網應用的例子: ARP協議通過鏈路層廣播定位具有指定IP地址

IP基礎工作原理——3

PIM基礎及工作原理 PIM(協議無關組播)中的“協議無關”指的是與單播路由協議無關,即PIM不需要維護專門的單播路由資訊,而是直接利用單播路由表的路由資訊(注意:還有自己的組播路由表),對組播報文執行RPF(Reverse Path Forwarding,逆向路徑轉發)檢

linux udp 廣播實現

前面介紹的TCP/IP知識都是基於單播,即一對一的方式,本節介紹一對多的廣播方式。廣播是由一個主機發向一個網路上所有主機的操作方式。例如在一個區域網內進行廣播,同一子網內的所有主機都可以收到此廣播發送的資料。 11.2.1 廣播的IP地址 要使用廣播,需要了解IPv4特定的廣播

linux 接收注意事項

伺服器直播源會採用組播方式,伺服器在接收組播的時候要注意一下兩點: 1、必須為接收組播的網絡卡配置組播路由,例如要在eth0網絡卡上接收239.10.10.100:5123的組播,則要新增組播路由239.10.10.0    route -add net 239.10.10

嵌入式linux接收發送失敗解決

除錯linux系統嵌入式開發板時有時會發現組播不通,但是單播可以通。 當發現不使用INADDR_ANY 來繫結ip  並使用本地某個網絡卡的IP 例如 192.168.0.2就可以通了 原因是我們板

JS對象創建常用方式原理分析

原型模式 這樣的 前言 values 一句話 開始 creat 動態原型 1-1 ====此文章是稍早前寫的,[email protected]/* */==== 前言 俗話說“在js語言中,一切都對象”,而且創建對象的方式也有很多種,所以今天我們做一下梳理 最

Java遠程通訊技術原理分析

ibm pre 要求 推薦 讀取 被調用 也有 模式 contex 在分布式服務框架中,一個最基礎的問題就是遠程服務是怎麽通訊的,在Java領域中有很多可實現遠程通訊的技術,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,這些名詞之

80211 速率轉單

表示 網絡接口 通過 sage tca 提高 解決方案 所有 ast 轉:http://jingyan.baidu.com/article/ff411625963a7912e4823789.html WLAN無線網絡理論上就是實現一個二層的接入網絡,而這個二層網絡通常直

支付寶app支付java後臺流程原理分析

system 分析 req eterm 格式 prop 通過 false 由於 java版支付寶app支付流程及原理分析   本實例是基於springmvc框架編寫 一、流程步驟 1.執行流程 當手機端app(就是你公司開發的a

第十一節:Bundles壓縮合並js和css原理分析

string數組 tab 速度 操作 spn sof 參考 reader 調試 一. 簡介 1.背景:瀏覽器默認一次性請求的網絡數是有上限的,如果你得js和css文件太多,就會導致瀏覽器需要多次加載,影響頁面的加載速度, MVC中提供Bundles的方式壓縮合並js和cs

Linux內核同步 - RCU synchronize原理分析

ron core rom con 更新 如何 || scn 常常 RCU(Read-Copy Update)是Linux內核比較成熟的新型讀寫鎖,具有較高的讀寫並發性能,常常用在需要互斥的性能關鍵路徑。在kernel中,rcu有tiny rcu和tree rcu兩種

鋰電池鼓氣成分原理分析

image data add box web ring resource cbe ddt 轉自:http://www.juda.cn/news/28113.html 鋰電池鼓氣成分及原理分析 鋰電池鼓

kubernetes排程實踐原理分析

kubernetes排程策略分析 Kubernetes排程器根據特定的演算法與策略將pod排程到工作節點上。在預設情況下,Kubernetes排程器可以滿足絕大多數需求,例如排程pod到資源充足的節點上執行,或排程pod分散到不同節點使叢集節點資源均衡等。但一些特殊的場景,預設排程演

Java 遠端通訊技術原理分析

//轉自:http://www.codeceo.com/article/java-remoted-communication.html //轉自:https://zhuanlan.zhihu.com/p/21380797 在分散式服務框架中,一個最基礎的問題就是遠端服務是怎麼通

Android Camera2架構原理分析

請點選轉載地址 前面幾篇主要分析的是android Camera API1.0的架構以及初始化流程,而google在android5.0(Lollipop)開始對Camera的架構進行了調整,為了適應HAL3,新新增實現了CameraDeviceClient,而Came

基於獨立按鍵消抖原理分析

獨立按鍵模型如下: 分析:在按鍵按下時,圖中電路形成通路,在實際電路設計中將按鍵的一側接到系統電源的GND上,另一側接到FPGA晶片的管腳上,這樣便可以通過FPGA IO口的狀態判斷按鍵是否按下,為了保證FPGA的管腳在按鍵沒有被按下時是一個確定的電平,所以在電路設計時加上一個上拉電阻,這樣當獨立按鍵沒