เมื่อเร็ว ๆ นี้ฉันได้ติดตั้ง Ubuntu Server 10.04 ใหม่และพบว่าเซิร์ฟเวอร์ UDP ของฉันไม่สามารถดูข้อมูลแบบหลายผู้รับที่ส่งไปยังอินเทอร์เฟซได้อีกต่อไปแม้หลังจากเข้าร่วมกลุ่มแบบหลายผู้รับแล้ว ฉันได้รับการตั้งค่าเดียวกันบน Ubuntu 8.04.4 LTS สองเครื่องและไม่มีปัญหาในการรับข้อมูลหลังจากเข้าร่วมกลุ่มมัลติคาสต์เดียวกัน
การ์ดอีเธอร์เน็ตคือ Broadcom netXtreme II BCM5709 และไดรเวอร์ที่ใช้คือ:
b $ ethtool -i eth1
driver: bnx2
version: 2.0.2
firmware-version: 5.0.11 NCSI 2.0.5
bus-info: 0000:01:00.1
ฉันใช้ smcroute เพื่อจัดการการลงทะเบียนแบบหลายผู้รับของฉัน
b$ smcroute -d
b$ smcroute -j eth1 233.37.54.71
หลังจากเข้าร่วมกลุ่ม maddr ip แสดงการลงทะเบียนที่เพิ่มเข้ามาใหม่
b$ ip maddr
1: lo
inet 224.0.0.1
inet6 ff02::1
2: eth0
link 33:33:ff:40:c6:ad
link 01:00:5e:00:00:01
link 33:33:00:00:00:01
inet 224.0.0.1
inet6 ff02::1:ff40:c6ad
inet6 ff02::1
3: eth1
link 01:00:5e:25:36:47
link 01:00:5e:25:36:3e
link 01:00:5e:25:36:3d
link 33:33:ff:40:c6:af
link 01:00:5e:00:00:01
link 33:33:00:00:00:01
inet 233.37.54.71 <------- McastGroup.
inet 224.0.0.1
inet6 ff02::1:ff40:c6af
inet6 ff02::1
ดีมากฉันเห็นว่าฉันได้รับข้อมูลสำหรับกลุ่มหลายผู้รับนี้
b$ sudo tcpdump -i eth1 -s 65534 host 233.37.54.71
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65534 bytes
09:30:09.924337 IP 192.164.1.120.58848 > 233.37.54.71.15572: UDP, length 212
09:30:09.947547 IP 192.164.1.120.58848 > 233.37.54.71.15572: UDP, length 212
09:30:10.108378 IP 192.164.1.120.58866 > 233.37.54.71.15574: UDP, length 268
09:30:10.196841 IP 192.164.1.120.58848 > 233.37.54.71.15572: UDP, length 212
...
ฉันยังสามารถยืนยันได้ว่าอินเทอร์เฟซที่ได้รับแพ็คเก็ต mcast
b $ ethtool -S eth1 | grep mcast_pack
rx_mcast_packets: 103998
tx_mcast_packets: 33
ตอนนี้นี่คือปัญหา เมื่อฉันพยายามจับภาพทราฟฟิกโดยใช้เซิร์ฟเวอร์ UDP ที่เป็นรูบี้แบบง่ายฉันจะได้รับข้อมูลเป็นศูนย์! นี่คือเซิร์ฟเวอร์ธรรมดาที่อ่านข้อมูลที่ส่งบนพอร์ต 15572 และพิมพ์อักขระสองตัวแรก สิ่งนี้ใช้ได้กับเซิร์ฟเวอร์ Ubuntu สองตัว 8.04.4 แต่ไม่ใช่เซิร์ฟเวอร์ 10.04
require 'socket'
s = UDPSocket.new
s.bind("", 15572)
5.times do
text, sender = s.recvfrom(2)
puts text
end
ถ้าฉันส่งแพ็กเก็ต UDP ที่สร้างขึ้นในทับทิมไปยังโลคอลโฮสต์เซิร์ฟเวอร์จะรับและพิมพ์อักขระสองตัวแรก ดังนั้นฉันรู้ว่าเซิร์ฟเวอร์ด้านบนทำงานได้อย่างถูกต้อง
irb(main):001:0> require 'socket'
=> true
irb(main):002:0> s = UDPSocket.new
=> #<UDPSocket:0x7f3ccd6615f0>
irb(main):003:0> s.send("I2 XXX", 0, 'localhost', 15572)
เมื่อฉันตรวจสอบสถิติโปรโตคอลฉันเห็นว่า InMcastPkts ไม่เพิ่มขึ้น ขณะที่อยู่บนเซิร์ฟเวอร์อื่น ๆ 8.04 บนเครือข่ายเดียวกันได้รับหลายพันแพ็กเก็ตใน 10 วินาที
b $ netstat -sgu ; sleep 10 ; netstat -sgu
IcmpMsg:
InType3: 11
OutType3: 11
Udp:
446 packets received
4 packets to unknown port received.
0 packet receive errors
461 packets sent
UdpLite:
IpExt:
InMcastPkts: 4654 <--------- Same as below
OutMcastPkts: 3426
InBcastPkts: 9854
InOctets: -1691733021
OutOctets: 51187936
InMcastOctets: 145207
OutMcastOctets: 109680
InBcastOctets: 1246341
IcmpMsg:
InType3: 11
OutType3: 11
Udp:
446 packets received
4 packets to unknown port received.
0 packet receive errors
461 packets sent
UdpLite:
IpExt:
InMcastPkts: 4656 <-------------- Same as above
OutMcastPkts: 3427
InBcastPkts: 9854
InOctets: -1690886265
OutOctets: 51188788
InMcastOctets: 145267
OutMcastOctets: 109712
InBcastOctets: 1246341
ถ้าฉันพยายามบังคับให้อินเตอร์เฟสเข้าสู่โหมด promisc ไม่มีอะไรเปลี่ยนแปลง
ณ จุดนี้ฉันติดอยู่ ฉันยืนยันว่าการกำหนดค่าเคอร์เนลเปิดใช้งานมัลติคาสต์แล้ว อาจมีตัวเลือกการกำหนดค่าอื่น ๆ ที่ฉันควรตรวจสอบหรือไม่
b $ grep CONFIG_IP_MULTICAST /boot/config-2.6.32-23-server
CONFIG_IP_MULTICAST=y
ความคิดใดที่จะไปจากที่นี่?
rp_filter
และ/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
แล้วก็เริ่มทำงาน