Multicast UDP ไม่ทำงาน


11

Multicast UDP บนราสเบอร์รี่ปี่

ฉันไม่ได้ จำกัด สิ่งต่าง ๆ ลงให้มากพอที่จะรู้ว่าปัญหาของฉันเป็นเพราะเดเบียน, ราสเบียนโดยเฉพาะหรือถ้าฉันเพิ่งทำอะไรบางอย่างหายไป

ฉันมีแอพพลิเคชั่นหลามที่ใช้มัลติคาสต์ UDP เพื่อให้อุปกรณ์อื่น ๆ บนเครือข่ายทราบว่าแอปพลิเคชันของฉันเปิดใช้งานและพร้อมใช้งานในที่อยู่ IP ที่เฉพาะเจาะจง

กลุ่มมัลติคาสต์ UDP คือ 239.255.250.250 และพอร์ตคือ 9131 ถ้าฉันเรียกใช้ tcpdump ฉันจะเห็นว่าแพ็คเก็ตที่ฉันพยายามจะส่งคือการส่งข้อมูลจริง แต่ฉันไม่เคยเห็นอะไรที่ผ่านมาบนเครื่องอื่น ๆ บนเครือข่าย

มีอุปกรณ์อื่น ๆ ที่ใช้ "สัญญาณ" ชนิดเดียวกันนี้กับกลุ่มหลายผู้รับและพอร์ตเดียวกันและฉันสามารถเห็นแพ็คเก็ตเหล่านั้นมาในเครื่องอื่น ๆ เราเตอร์ไม่มีไฟร์วอลล์และตอนนี้ฉันก็เป็นตัวเลือกที่ไม่ดีเลย

ด้านล่างคือการวินิจฉัยขั้นพื้นฐานที่ฉันรู้วิธีเรียกใช้ udp chksum ที่ไม่ดีดูเหมือนว่ามันอาจจะไม่เป็นประโยชน์ แต่ฉันไม่รู้อะไรเลยเกี่ยวกับสิ่งนั้น

เอาต์พุตของ ifconfig

eth0      Link encap:Ethernet  HWaddr b8:27:eb:b2:79:12  
          inet addr:192.168.2.7  Bcast:192.168.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1682 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1686 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:119105 (116.3 KiB)  TX bytes:169570 (165.5 KiB)

เอาต์พุตของ tcpdump ขณะที่แอพทำงาน

    tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
03:29:15.722653 IP (tos 0x0, ttl 1, id 0, offset 0, flags [DF], proto UDP (17), length 221)
    192.168.2.7.33335 > 239.255.250.250.9131: [bad udp cksum 0xae84 -> 0xaabe!] UDP, length 193
    0x0000:  4500 00dd 0000 4000 0111 cb66 c0a8 0207  E.....@....f....
    0x0010:  efff fafa 8237 23ab 00c9 ae84 414d 5842  .....7#.....AMXB
    0x0020:  3c4d 4143 2d41 4444 523d 6238 3a32 373a  <MAC-ADDR=b8:27:
    0x0030:  6562 3a62 323a 3739 3a31 323e 3c2d 5555  eb:b2:79:12><-UU
    0x0040:  4944 3d32 3032 3438 3135 3937 3537 3734  ID=2024815975774
    0x0050:  3930 3e3c 2d53 444b 436c 6173 733d 5574  90><-SDKClass=Ut
    0x0060:  696c 6974 793e 3c2d 4d61 6b65 3d69 5275  ility><-Make=iRu
    0x0070:  6c65 426f 783e 3c2d 4d6f 6465 6c3d 5265  leBox><-Model=Re
    0x0080:  6d6f 7465 426f 783e 3c2d 5265 7669 7369  moteBox><-Revisi
    0x0090:  6f6e 3d30 2e31 3e3c 2d50 6b67 5f4c 6576  on=0.1><-Pkg_Lev
    0x00a0:  656c 3d47 4350 4b30 3032 3e3c 2d43 6f6e  el=GCPK002><-Con
    0x00b0:  6669 672d 5552 4c3d 6874 7470 3a2f 2f31  fig-URL=http://1
    0x00c0:  3932 2e31 3638 2e32 2e37 3a38 303e 3c2d  92.168.2.7:80><-
    0x00d0:  5374 6174 7573 3d52 6561 6479 3e         Status=Ready>
^C
1 packet captured
1 packet received by filter
0 packets dropped by kernel

เอาต์พุตของ netstat ขณะที่โปรแกรมกำลังทำงาน

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
udp        0      0 0.0.0.0:31144           0.0.0.0:*                           1510/dhclient   
udp        0      0 0.0.0.0:33335           0.0.0.0:*                           2089/python     
udp        0      0 0.0.0.0:68              0.0.0.0:*                           1510/dhclient   
udp        0      0 192.168.2.7:123         0.0.0.0:*                           1911/ntpd       
udp        0      0 0.0.0.0:123             0.0.0.0:*                           1911/ntpd  

คุณสามารถให้เอาต์พุตของ netstat -gn บน 2 โฮสต์ได้หรือไม่?
UnX

อาจมีประโยชน์: superuser.com/questions/324824/…
cpugeniusmv

คำตอบ:


13

ฉันเข้าใจว่าโฮสต์ของคุณ 192.168.2.7 กำลังส่ง multicast packet ไปยังกลุ่ม 239.255.250.250 ที่พอร์ต 9131

หมายเหตุ: ฉันคิดว่าอย่างไรก็ตามเซิร์ฟเวอร์กำลังฟังพอร์ต 9131 คุณไม่ได้ให้ข้อมูลใด ๆ

จากเอาต์พุต ifconfig ฉันเห็นว่า MULTICAST ถูกเปิดใช้งานและ tcpdump ยืนยันสิ่งนี้

ก่อนอื่นตรวจสอบให้แน่ใจว่าโฮสต์ที่ใช้งานเซิร์ฟเวอร์ (เซิร์ฟเวอร์ที่รับแพ็คเก็ตมัลติคาสต์) ได้เข้าร่วมกลุ่มมัลติคาสต์

ในแต่ละประเภทโฮสต์เซิร์ฟเวอร์:

netstat -gn

หากคุณเห็นที่อยู่แบบหลายผู้รับมันได้เข้าร่วมกลุ่มแล้ว หากไม่แสดงว่ามีบางอย่างผิดปกติกับโปรแกรมเซิร์ฟเวอร์ของคุณหรืออาจเป็นการตั้งค่าเคอร์เนล

หากเซิร์ฟเวอร์เข้าร่วมกลุ่ม แต่คุณไม่เห็นแพ็กเก็ตใด ๆ ที่เข้ามาจากไคลเอนต์ให้ตรวจสอบเราเตอร์ของคุณว่าคุณได้เปิดใช้งานigmp (เราเตอร์ของคุณต้องมีความสามารถ igmp)

ตัวอย่างเช่นในเราเตอร์ของซิสโก้

enable
conf t
ip multicast-routing
For each interface involved.
int <NIC>
ip pim sparse-dense-mode

หากเปิดใช้งาน igmp บนเราเตอร์ให้มองหาคุณสมบัติการดีบักเพื่อติดตามแพ็กเก็ต

ฝั่งเซิร์ฟเวอร์ให้เริ่มการดักจับแพ็กเก็ต:

tcpdump -i <NIC> host 239.255.250.250

หากคุณไม่เห็นแพ็คเก็ตใด ๆ เข้ามาแพ็กเก็ตมัลติคาสต์จะไม่ถูกส่งต่อ (สมมติว่าเป็น

จากนั้นในไคลเอนต์ส่งแพ็คเก็ตแบบหลายผู้รับ (ใช้สคริปต์ในลิงค์ด้านล่างเพื่อแก้ไขปัญหา)

หมายเหตุ: แพ็คเก็ต UDP ดูเหมือนผิดปกติดังนั้นไม่แน่ใจว่าเซิร์ฟเวอร์จะสามารถอ่านได้หรือไม่ คุณสามารถใช้สคริปต์ในลิงค์ด้านล่างเพื่อยืนยันว่าข้อความใน tcpdump แสดงว่ามีรูปแบบไม่ถูกต้องหรือไม่ (ไม่ใช่ในกรณีของฉัน)

ตัวอย่างของรหัสไพ ธ อนที่ใช้มัลติคาสต์:

/programming/603852/multicast-in-python

หมายเหตุ: ฉันใช้สคริปต์นี้บนเดเบียน raspi (ไม่ใช่ raspbian และเซิร์ฟเวอร์ได้รับแพ็กเก็ตผ่านเราเตอร์ - ตามการตั้งค่าด้านบน - ปรับ)

คู่มือ Linux: http://stlinux.com/howto/network/short-guide

ซิสโก้: http://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst3750/software/release/12-2_52_se/configuration/guide/3750scg/swmcast.html#wp1024278


คำตอบที่ยาวมากและส่วนที่เล็กที่สุดคือสิ่งที่ดูเหมือนจะเป็นปัญหา ปัญหาการแก้ไขปัญหาที่คุณพูดถึงฉันทำไปแล้วแต่นั่นเป็นหลังจากที่ฉันโพสต์ข้อความนี้ ทุกอย่างดูดีบนเซิร์ฟเวอร์และลูกค้า IGMP บนเราเตอร์เป็นปัญหา แต่การตั้งค่านั้นถูกซ่อนไว้
Alex

2
คำอธิบายของคุณไม่ชัดเจนพอที่จะให้คำตอบแบบตรงดังนั้นฉันคิดว่าฉันสามารถเขียนคู่มือการแก้ไขปัญหาขนาดเล็ก
UnX

1

ฉันสังเกตเห็นว่านี่อาจเป็นปัญหาฮาร์ดแวร์และ / หรือไดรเวอร์ ฉันใช้มัลติคาสต์ UDP (ส่งและรับ) กับ raspberryPI โดยไม่มีปัญหา - ด้วยโปรแกรม C, Java และ / หรือ Python

อย่างไรก็ตามฉันเพิ่งรู้ว่า UDP มัลติคาสต์รับไม่ทำงานกับอแดปเตอร์ USB nano wifi ตัวเล็ก ๆ ที่ดีจาก EDIMAX - ส่งงาน UDP (มัลติคาสต์) รวมทั้งรับข้อความของตัวเอง

รายละเอียดของ USB sticks จาก lsusb:

ไม่ได้รับมัลติคาสต์ UDP: ID 7392: 7811 Edimax Technology Co. , Ltd EW-7811Un 802.11n อะแดปเตอร์ไร้สาย [Realtek RTL8188CUS]

มัลติคาสต์รับ UDP ทำงานได้ดี: ID 148f: 3070 Ralink Technology, Corp. อะแดปเตอร์ไร้สาย RT2870 / RT3070


ยังใช้งานได้: แท่งนี้จาก ASUS ที่มี ID 0b05: 1791 ASUSTek Computer, Inc. อะแดปเตอร์ WL-167G v3 802.11n [Realtek RTL8188SU]
Michael

0

ฉันพบปัญหาที่คล้ายกันซึ่งแพ็คเก็ตเข้ามาและฉันเห็นพวกเขาด้วยtcpdumpแต่ไม่มีโปรแกรมใดสามารถรับข้อมูลได้

ปัญหาในกรณีนี้คือฉันเคยiptablesอนุญาตเฉพาะการรับส่งข้อมูลจากเครือข่ายย่อยในพื้นที่ของฉัน192.168.0.0/24แต่แน่นอนว่ามัลติคาสต์มาจาก224.0.0.0/4แทน แทนที่จะเปิดเครือข่ายย่อยนั้นทั้งหมด (อาจไม่มีไฟร์วอลล์) ฉันเพิ่งอนุญาตทราฟฟิกจากโฮสต์ทั้งหมดบนพอร์ต UDP เฉพาะที่ฉันใช้สำหรับมัลติคาสต์และสิ่งนี้แก้ไขปัญหาได้


0

สำหรับเราเรามีปัญหาที่คล้ายกันซึ่งกลุ่มมัลติคาสต์เข้าร่วมได้ดี แต่ไม่ได้รับข้อความ

เราตรวจสอบการตั้งค่า igmp บนเราเตอร์ซึ่งดูเหมือนว่าจะอยู่ในลำดับ

ในที่สุดเราเปลี่ยนจากการใช้ที่อยู่มัลติคาสต์ IPv6 เป็น IPv4 และแก้ไขได้สำหรับระบบนั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.