Bagaimana cara mengubah perilaku siaran global (255.255.255.255) di Windows?

10

Perilaku yang diinginkan

Ketika suatu aplikasi mengirim paket ke alamat IP broadcast global 255.255.255.255, saya ingin agar paket dikirim ke alamat broadcast global Ethernet ( ff:ff:ff:ff:ff:ff), di semua antarmuka.

Di Linux dan mungkin juga OS lain, sepertinya ini berfungsi. Windows XP dan Windows 7 menunjukkan perilaku yang berbeda tentang ini, dan tidak ada perilaku yang diinginkan untuk situasi saya.

Perilaku Windows XP

Paket akan dikirim dengan benar ke antarmuka jaringan pertama (urutan antarmuka ditentukan dalam "Koneksi Jaringan / Pengaturan Lanjutan / Lanjutan"). Itu juga akan dikirim ke antarmuka lain.

Semuanya benar sejauh ini. Masalahnya adalah, saat mengirim ke antarmuka lain, alamat sumber paket siaran adalah alamat IP dari antarmuka pertama. Misalnya, bayangkan konfigurasi jaringan ini (urutan penting):

  • Adaptor 1: alamat IP 192.168.0.1
  • Adaptor 2: alamat IP 10.0.0.1
  • Adaptor 3: alamat IP 172.17.0.1

Sekarang jika saya mengirim paket siaran, paket-paket berikut akan dikirim (dengan alamat IP sumber dan tujuan):

  • Pada adaptor 1: 192.168.0.1=>255.255.255.255
  • Pada adaptor 2: 192.168.0.1=>255.255.255.255
  • Pada adaptor 3: 192.168.0.1=>255.255.255.255

    Dalam praktiknya, aplikasi yang menggunakan paket siaran tidak akan berfungsi pada antarmuka apa pun selain adaptor 1. Menurut pendapat saya, ini adalah bug mencolok dalam tumpukan TCP / IP Windows XP.

Perilaku Windows 7

Mengubah urutan antarmuka jaringan tampaknya tidak berpengaruh pada Windows 7. Sebaliknya, siaran tampaknya dikendalikan oleh tabel rute IP.

IPv4 Route Table
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0   10.202.254.254       10.202.1.2    286
          0.0.0.0          0.0.0.0      192.168.0.1      192.168.0.3     10
       10.202.0.0      255.255.0.0         On-link        10.202.1.2    286
       10.202.1.2  255.255.255.255         On-link        10.202.1.2    286
   10.202.255.255  255.255.255.255         On-link        10.202.1.2    286
        127.0.0.0        255.0.0.0         On-link         127.0.0.1    306
        127.0.0.1  255.255.255.255         On-link         127.0.0.1    306
  127.255.255.255  255.255.255.255         On-link         127.0.0.1    306
      192.168.0.0    255.255.255.0         On-link       192.168.0.3    266
      192.168.0.3  255.255.255.255         On-link       192.168.0.3    266
    192.168.0.255  255.255.255.255         On-link       192.168.0.3    266
        224.0.0.0        240.0.0.0         On-link         127.0.0.1    306
        224.0.0.0        240.0.0.0         On-link       192.168.0.3    266
        224.0.0.0        240.0.0.0         On-link        10.202.1.2    286
  255.255.255.255  255.255.255.255         On-link         127.0.0.1    306
  255.255.255.255  255.255.255.255         On-link       192.168.0.3    266
  255.255.255.255  255.255.255.255         On-link        10.202.1.2    286
===========================================================================

Lihat 255.255.255.255rutenya? Ya, mereka mengontrol paket siaran. Dalam situasi ini, paket siaran akan dikirim melalui 192.168.0.3karena memiliki metrik yang lebih rendah ... tetapi tidak ke antarmuka lainnya.

Anda dapat mengubah antarmuka melalui mana paket siaran global akan dikirim dengan sangat mudah (cukup tambahkan 255.255.255.255rute persisten dengan metrik rendah). Tetapi tidak peduli seberapa keras Anda mencoba, paket siaran hanya akan dikirim pada satu antarmuka saja, tidak semuanya ingin saya lakukan.

Kesimpulan

  • Windows 7 hanya mengirim paket siaran ke satu antarmuka. Anda dapat memilih yang mana, tetapi bukan itu intinya di sini.
  • Windows XP mengirim paket broadcast ke semua antarmuka, tetapi hanya mengirimkannya seperti yang diharapkan ke satu antarmuka, yang dalam praktiknya setara dengan perilaku Windows 7.

Target

Saya ingin mengubah dukungan siaran IP global ini di Windows (sebaiknya Windows 7) sekali dan untuk semua. Tentu saja cara yang lebih baik adalah memiliki semacam perubahan konfigurasi yang didukung (peretasan registri atau serupa), tapi saya terbuka untuk semua saran.

Ada ide?

Etienne Dechamps
sumber
Apa yang Anda gunakan untuk menghasilkan siaran ini. Saya tidak bisa mendapatkan tumpukan XP untuk melakukan apa pun selain siaran langsung. yaitu 10.202.255.255 dalam kasus Anda.
Scott Lundberg
Bisakah Anda mereferensikan RFC atau dokumen lain yang menunjukkan Perilaku Benar yang Anda jelaskan? Sementara saya setuju itu perilaku yang diinginkan, untuk menyebutnya perilaku yang benar harus merujuk pada spesifikasi yang mendefinisikan apa yang benar. Mungkinkah implementasi routing khusus diserahkan kepada penyedia (Microsoft dalam kasus ini)?
Jason R. Coombs
Scott Lundberg: banyak aplikasi (terutama game) akan mengirimkan siaran global. Anda dapat menghasilkan beberapa menggunakan netcat: "nc -v -u 255.255.255.255 5000" misalnya.
Etienne Dechamps
Jason R. Coombs: memang, mungkin saya memiliki pilihan kata yang buruk. Saya seharusnya menggunakan "perilaku yang diinginkan". Saya tidak berpikir ada RFC untuk ini, tetapi saya mungkin salah.
Etienne Dechamps
Apakah Anda mengirim paket TCP atau UDP? Menurut ini yang penting social.msdn.microsoft.com/Forums/en/peertopeer/thread/… .
Nissan Fan

Jawaban:

6

Bukannya saya dalam bisnis membela Microsoft, tetapi setelah membaca RFC berikut yang berupaya menentukan cara kerja siaran, saya tidak berpikir bahwa Microsoft selalu melanggar RFC apa pun. IMO masalahnya harus diperbaiki pada tingkat aplikasi (yaitu siaran langsung, bukan global) yang akan mengenai rute yang sesuai dalam tabel routing dan hanya dikirim dari antarmuka yang benar untuk jaringan IP tersebut.

Mereka berdua menyatakan bahwa tidak ada standar yang ditentukan untuk siaran. Juga disebutkan dalam 919 bahwa antarmuka fisik tertentu harus dipilih untuk siaran. Dalam kasus mesin multi-homed, multi-NIC yang menghasilkan siaran, saya tidak berpikir bahwa itu dengan jelas menyatakan apa yang harus terjadi. Siaran tidak seharusnya dilewatkan oleh router dari satu antarmuka ke antarmuka lainnya, jadi apakah mesin Windows adalah router atau tidak dalam hal ini?
Jika bertindak sebagai router, maka setiap host yang merespons siaran dengan alamat IP yang salah untuk jaringan tersebut (Adaptor 2 dan 3 dalam contoh Anda) harus mengirim paket kembali ke alamat ethernet dari Adapters 2 dan 3 sebagai respons terhadap Adapter Alamat IP 1 dan host Windows harus merutekannya ke antarmuka yang tepat.
Kedengarannya membingungkan ... tetapi tidak bisa memikirkan cara yang lebih baik untuk ungkapan ini

Dan akhirnya, RFC 919 secara khusus mengatakan Dari RFC 919

Karena kami berasumsi bahwa masalahnya telah diselesaikan pada lapisan data link, host IP yang ingin
mengirim siaran lokal atau siaran langsung hanya perlu
menentukan alamat tujuan yang sesuai dan mengirim datagram seperti
biasa. Algoritma canggih apa pun hanya perlu berada di gateway.

Membaca yang menunjukkan bahwa alamat IP sumber tidak relevan untuk siaran.


Karena setiap aplikasi tampaknya menangani siaran secara berbeda, saya pikir di situlah tanggung jawab berada. Sebagai contoh. nbtstatmengirimkan siaran langsung pada mesin multi-NIC, sedangkan game mungkin menggunakan siaran global.
Singkatnya, aplikasi harus diperbaiki, bukan OS dalam hal ini ...

EDIT: Berikut ini tautan untuk keadaan yang sama, tetapi di Linux. Kernel linux menanganinya dengan hanya mengirim satu paket keluar dari antarmuka default (NIC A dalam contoh ini). Mereka merekomendasikan bahwa aplikasi menghitung NIC dan mengirim diarahkan broadcast keluar setiap NIC. Tautan

Scott Lundberg
sumber
2
Di tidak mengerti hubungan antara paragraf yang Anda kutip dari RFC 919 dan alamat sumber. Tampak jelas bagi saya bahwa selalu salah untuk mengirim paket IP pada antarmuka dengan alamat sumber antarmuka lain, terlepas dari sifat siaran / unicast paket. Maksud saya, Anda tidak bisa mengatakan "alamat IP sumber tidak relevan untuk siaran", tentu saja! Bagaimana lagi aplikasi yang seharusnya tahu siapa yang mengirim siaran?
Etienne Dechamps
1
"Itu juga menyebutkan di 919 bahwa antarmuka fisik tertentu harus dipilih untuk siaran." Dimana? "Alamat 255.255.255.255 menunjukkan siaran pada jaringan perangkat keras lokal" (RFC919 7.)? Dalam hal ini saya dengan hormat tidak setuju. Kami sedang mendiskusikan apa yang harus dilakukan dengan siaran di tingkat tuan rumah, bukan di tingkat jaringan. Selain itu, dikatakan tepat di bawah bahwa host dapat "menyiarkan ke semua tetangga terdekatnya dengan menggunakan 255.255.255.255". Semua tetangga terdekatnya. Tidak "semua tetangga di antarmuka jaringan tertentu".
Etienne Dechamps
1
"Aplikasi tidak peduli antarmuka mana yang mengirim siaran. Mereka hanya perlu meresponsnya." Hah ... mereka perlu mengirim siaran juga, tidak hanya menanggapi mereka. Pertimbangkan kasus browser penyedia permainan LAN. Ini mengirimkan paket siaran untuk menemukan server permainan di jaringan. Jika paket siaran tidak dikirim ke semua antarmuka, browser server game tidak akan menampilkan server game yang dapat dijangkau melalui antarmuka ini. Dengan kata lain, epik gagal.
Etienne Dechamps
1
"Saya tidak yakin, tetapi saya berpikir bahwa OS melihat permintaan 255.255.255.255 dan mengatakan bahwa ia perlu mengirimkan itu pada semua antarmuka (untuk menemukan semua tetangga langsung), tetapi diminta dari aplikasi tertentu, terikat pada IP spesifik (mungkin default berdasarkan metrik). " Saya setuju. Itu tidak berarti itu adalah Hal yang Benar untuk Dilakukan. Menurut pendapat saya itu benar-benar melanggar prinsip kejutan paling tidak dari sudut pandang pengembang aplikasi, yang hanya mengharapkan agar paket dikirim ke semua orang di semua antarmuka.
Etienne Dechamps
4
Tidak yakin apa yang Anda maksud dengan digandakan. RFC secara khusus melarang penerusan paket siaran. Seharusnya hanya ada satu paket yang dikirim, yang menurut saya adalah inti dari diskusi kami. Jika OS melakukan seperti yang Anda katakan, itu sebenarnya harus menghasilkan 9 paket total (3 untuk setiap antarmuka) karena lapisan IP harus menghasilkan tiga paket dengan sumber IP terpisah (satu untuk setiap NIC di Layer 3) dan kemudian setiap NIC harus mengirim yang keluar pada Ethernet (Layer 2). Jika ada rute antar jaringan, maka Anda mendapatkan 3 tanggapan kembali! Yang mana yang benar?
Scott Lundberg
4

Akhirnya, saya menyelesaikannya secara terprogram. Saya menulis sebuah perangkat lunak yang sangat kecil yang disebut WinIPBroadcast yang bertugas menyampaikan frame siaran ke semua antarmuka.

Ini bekerja menggunakan fakta yang menarik: adalah mungkin untuk menerima paket siaran global yang dihasilkan secara lokal ketika mendengarkan pada alamat loopback (127.0.0.1). WinIPBroadcast mendengarkan alamat lokal untuk semua siaran menggunakan soket RAW, kemudian untuk setiap paket siaran, ia menyampaikannya ke semua antarmuka kecuali yang dipilih.

Etienne Dechamps
sumber
Karena windows stack adalah garpu dari tumpukan BSD, saya ingin tahu apakah BSD menunjukkan perilaku yang sama.
x0n
Perangkat lunak Anda tidak berfungsi. The program can't start becuase api-ms-win-core-rtlsupport-l1-2-0.dll is missing from your computer.. Semoga berhasil menemukannya .dlldi Google.
Alex G
@AlexG: aneh, saya pikir saya telah memperbaiki masalah itu melalui github.com/dechamps/WinIPBroadcast/commit/… . Apakah Anda yakin menjalankan versi terakhir (1.6)? Jangan ragu untuk mengajukan bug di github.com/dechamps/WinIPBroadcast/issues dan saya akan memeriksanya.
Etienne Dechamps