Son zamanlarda, yeni bir Ubuntu Sunucusu 10.04 kurdum ve UDP sunucumun artık çok noktaya yayın grubuna katıldıktan sonra bile arayüze gönderilen çok noktaya yayın verilerini göremediğini fark ettim. Diğer iki Ubuntu 8.04.4 LTS makinesinde de aynı ayarları yaptım ve aynı çok noktaya yayın grubuna katıldıktan sonra veri alma konusunda hiçbir sorun yok.
Ethernet kartı bir Broadcom netXtreme II BCM5709 ve kullanılan sürücü:
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
Çok noktaya yayın kayıtlarımı yönetmek için smcroute kullanıyorum.
b$ smcroute -d
b$ smcroute -j eth1 233.37.54.71
Gruba katıldıktan sonra ip maddr yeni eklenen kaydı gösterir.
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
Şimdiye kadar çok iyi, bu çok noktaya yayın grubu için veri aldığımı görebiliyorum.
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
...
Arabirimin mcast paketleri aldığını da doğrulayabilirim.
b $ ethtool -S eth1 | grep mcast_pack
rx_mcast_packets: 103998
tx_mcast_packets: 33
Şimdi sorun burada. Basit bir yakut UDP sunucusu kullanarak trafiği yakalamaya çalıştığımda sıfır veri alıyorum! 15572 numaralı bağlantı noktasına gönderilen verileri okuyan ve ilk iki karakteri yazdıran basit bir sunucu. Bu, iki 8.04.4 Ubuntu Sunucusunda çalışır, ancak 10.04 sunucusunda çalışmaz.
require 'socket'
s = UDPSocket.new
s.bind("", 15572)
5.times do
text, sender = s.recvfrom(2)
puts text
end
Localhost'a yakutta hazırlanmış bir UDP paketi gönderirsem, sunucu bunu alır ve ilk iki karakteri yazdırır. Bu yüzden yukarıdaki sunucunun doğru çalıştığını biliyorum.
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)
Protokol istatistiklerini kontrol ettiğimde InMcastPkts'in artmadığını görüyorum. Diğer 8.04 sunucularda, aynı ağda, 10 saniyede birkaç bin paket aldı.
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
Arabirimi promisc moda zorlamaya çalışırsam hiçbir şey değişmez.
Bu noktada sıkışıp kaldım. Çekirdek yapılandırmasının çoklu yayın etkin olduğunu onayladım. Belki de kontrol etmem gereken başka yapılandırma seçenekleri var?
b $ grep CONFIG_IP_MULTICAST /boot/config-2.6.32-23-server
CONFIG_IP_MULTICAST=y
Buradan nereye gideceğine dair bir fikrin var mı?
rp_filter
ve /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
daha sonra da çalışmaya başladı.