Làm cách nào để thay đổi hành vi địa chỉ quảng bá toàn cầu (255.255.255.255) trên Windows?


10

Hành vi mong muốn

Khi một ứng dụng gửi một gói đến địa chỉ IP quảng bá toàn cầu 255.255.255.255, tôi muốn gói đó được gửi đến địa chỉ quảng bá toàn cầu Ethernet ( ff:ff:ff:ff:ff:ff), trên tất cả các giao diện.

Trên Linux và có lẽ các hệ điều hành khác cũng có vẻ như hoạt động. Windows XP và Windows 7 thể hiện các hành vi khác nhau về điều này và không có hành vi nào là mong muốn đối với tình huống của tôi.

Hành vi Windows XP

Gói tin sẽ được gửi chính xác đến giao diện mạng đầu tiên (thứ tự giao diện được chỉ định trong "Kết nối mạng / Cài đặt nâng cao / Nâng cao"). Nó cũng sẽ được gửi đến các giao diện khác.

Mọi thứ đều đúng cho đến nay. Vấn đề là, khi gửi đến các giao diện khác, địa chỉ nguồn của gói tin quảng bá là địa chỉ IP của giao diện đầu tiên. Ví dụ: hãy tưởng tượng cấu hình mạng này (thứ tự là quan trọng):

  • Bộ điều hợp 1: Địa chỉ IP 192.168.0.1
  • Bộ chuyển đổi 2: Địa chỉ IP 10.0.0.1
  • Bộ chuyển đổi 3: Địa chỉ IP 172.17.0.1

Bây giờ nếu tôi gửi một gói phát sóng, các gói sau sẽ được gửi (với địa chỉ IP nguồn và đích):

  • Trên bộ chuyển đổi 1: 192.168.0.1=>255.255.255.255
  • Trên bộ chuyển đổi 2: 192.168.0.1=>255.255.255.255
  • Trên bộ chuyển đổi 3: 192.168.0.1=>255.255.255.255

    Trong thực tế, các ứng dụng sử dụng gói quảng bá sẽ không hoạt động trên bất kỳ giao diện nào ngoài bộ điều hợp 1. Theo tôi, đây là một lỗi trắng trợn trong ngăn xếp TCP / IP của Windows XP.

Hành vi của Windows 7

Sửa đổi thứ tự giao diện mạng dường như không có bất kỳ ảnh hưởng nào đến Windows 7. Thay vào đó, việc phát sóng dường như được kiểm soát bởi bảng định tuyến 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
===========================================================================

Xem các 255.255.255.255tuyến đường? Đúng, họ kiểm soát các gói phát sóng. Trong tình huống này, các gói tin quảng bá sẽ được gửi qua 192.168.0.3vì nó có số liệu thấp hơn ... nhưng không đến các giao diện khác.

Bạn có thể thay đổi giao diện thông qua đó các gói phát sóng toàn cầu sẽ được gửi rất dễ dàng (chỉ cần thêm một 255.255.255.255tuyến liên tục với số liệu thấp). Nhưng cho dù bạn có cố gắng thế nào, các gói phát sóng sẽ chỉ được gửi trên một giao diện duy nhất , không phải tất cả chúng đều giống như tôi muốn làm.

Phần kết luận

  • Windows 7 chỉ gửi các gói tin quảng bá đến một giao diện. Bạn có thể chọn cái nào, nhưng đó không phải là điểm chính ở đây.
  • Windows XP gửi các gói tin quảng bá đến tất cả các giao diện, nhưng nó chỉ gửi chúng như mong đợi cho một giao diện, trong thực tế là tương đương với hành vi của Windows 7.

Mục đích

Tôi muốn thay đổi hỗ trợ phát IP toàn cầu này trong Windows (tốt nhất là Windows 7) một lần và mãi mãi. Tất nhiên cách tốt hơn là có một số loại thay đổi cấu hình được hỗ trợ (hack registry hoặc tương tự), nhưng tôi mở tất cả các đề xuất.

Có ý kiến ​​gì không?


Bạn đang sử dụng những gì để tạo ra các chương trình phát sóng. Tôi không thể có được ngăn xếp XP của mình để làm bất cứ điều gì ngoài các chương trình phát sóng có hướng. tức là 10.202.255.255 trong trường hợp của bạn.
Scott Lundberg

Bạn có thể tham khảo RFC hoặc tài liệu khác chỉ ra Hành vi đúng mà bạn mô tả không? Mặc dù tôi đồng ý hành vi mong muốn của nó, để gọi nó là hành vi đúng nên tham chiếu một thông số xác định điều gì là đúng. Có thể là việc thực hiện định tuyến cụ thể được để lại cho nhà cung cấp (Microsoft trong trường hợp này)?
Jason R. Coombs

Scott Lundberg: nhiều ứng dụng (đặc biệt là các trò chơi) sẽ gửi phát sóng toàn cầu. Bạn có thể tạo một số bằng netcat: "nc -v -u 255.255.255.255 5000" chẳng hạn.
Etienne Dechamp

Jason R. Coombs: thực sự, có lẽ tôi đã có một sự lựa chọn từ ngữ kém. Tôi nên sử dụng "hành vi mong muốn". Tôi không nghĩ có RFC cho việc này, nhưng tôi có thể sai.
Etienne Dechamp

Bạn đang gửi một gói TCP hoặc UDP? Theo đó, vấn đề xã hội.msdn.microsoft.com/Forums/en/peertopeer/thread/ mẹo .
Quạt Nissan

Câu trả lời:


6

Không phải tôi đang bảo vệ Microsoft, nhưng sau khi đọc qua các RFC sau đây cố gắng xác định cách thức phát sóng hoạt động, tôi không nghĩ rằng Microsoft nhất thiết phải vi phạm bất kỳ RFC nào. IMO vấn đề phải được khắc phục ở cấp ứng dụng (tức là phát sóng có hướng, không phải toàn cầu) sẽ đánh vào các tuyến thích hợp trong bảng định tuyến và chỉ được gửi từ giao diện chính xác cho mạng IP đó.

Cả hai đều tuyên bố rằng không có tiêu chuẩn được xác định cho các chương trình phát sóng. Nó cũng đề cập đến năm 919 rằng một giao diện vật lý cụ thể nên được chọn để phát sóng. Trong trường hợp máy nhiều lớp, nhiều máy chủ tạo ra chương trình phát sóng, tôi không nghĩ rằng nó đã nêu rõ điều gì sẽ xảy ra. Truyền phát không bao giờ được truyền qua các bộ định tuyến từ giao diện này sang giao diện khác, vậy máy Windows có phải là bộ định tuyến hay không trong trường hợp này?
Nếu nó hoạt động như một bộ định tuyến, thì bất kỳ máy chủ nào phản hồi việc phát sóng với địa chỉ IP không chính xác cho mạng đó (Bộ điều hợp 2 và 3 trong ví dụ của bạn) sẽ gửi lại gói đến địa chỉ ethernet của Bộ điều hợp 2 và 3 để đáp ứng với Bộ điều hợp Địa chỉ IP của 1 và máy chủ Windows sẽ định tuyến nó đến giao diện thích hợp.
Nghe có vẻ khó hiểu ... nhưng không thể nghĩ ra cách nào tốt hơn để diễn đạt điều này

Và cuối cùng, RFC 919 đặc biệt nói từ RFC 919

Vì chúng tôi giả định rằng vấn đề đã được giải quyết ở lớp liên kết dữ liệu, nên máy chủ IP muốn
gửi truyền phát cục bộ hoặc phát sóng theo hướng chỉ cần chỉ
định địa chỉ đích thích hợp và gửi datagram như
bình thường. Bất kỳ thuật toán tinh vi chỉ cần cư trú trong các cổng.

Đọc điều đó sẽ gợi ý rằng địa chỉ IP nguồn không liên quan để phát sóng.


Vì mỗi ứng dụng dường như xử lý các chương trình phát sóng khác nhau, tôi nghĩ đó là nơi chịu trách nhiệm. Ví dụ. nbtstatgửi các chương trình phát sóng trực tiếp trên các máy đa NIC, trong khi các trò chơi có thể sử dụng các chương trình phát sóng toàn cầu.
Nói tóm lại, ứng dụng nên được sửa, không phải HĐH trong trường hợp này ...

EDIT: Đây là một liên kết cho các trường hợp tương tự, nhưng trên Linux. Hạt nhân linux xử lý nó bằng cách chỉ gửi một gói ra giao diện mặc định (NIC A trong ví dụ này). Họ đề nghị ứng dụng liệt kê các NIC và gửi một chương trình phát trực tiếp ra từng NIC. Liên kết


2
Không hiểu mối quan hệ giữa đoạn bạn trích dẫn từ RFC 919 và địa chỉ nguồn. Có vẻ như rõ ràng với tôi rằng nó là luôn luôn sai để gửi một gói tin IP trên một giao diện với địa chỉ nguồn của giao diện khác, không phụ thuộc vào tính chất phát sóng / unicast của gói. Ý tôi là, bạn không thể nói một cách hợp lý "địa chỉ IP nguồn không liên quan đến phát sóng", tất nhiên là vậy! Làm thế nào khác là các ứng dụng phải biết ai đã gửi phát sóng?
Etienne Dechamp

1
"Nó cũng đề cập đến năm 919 rằng một giao diện vật lý cụ thể nên được chọn để phát sóng." Ở đâu? "Địa chỉ 255.255.255.255 biểu thị phát sóng trên mạng phần cứng cục bộ" (RFC919 7.)? Trong trường hợp đó tôi tôn trọng không đồng ý. Chúng tôi đang thảo luận phải làm gì với các chương trình phát sóng ở cấp máy chủ, không phải ở cấp độ mạng. Bên cạnh đó, người ta nói ngay bên dưới rằng một máy chủ có thể "phát cho tất cả những người hàng xóm trực tiếp của mình bằng cách sử dụng 255.255.255.255". Tất cả hàng xóm ngay lập tức của nó. Không phải "tất cả hàng xóm trên một giao diện mạng cụ thể".
Etienne Dechamp

1
"Các ứng dụng không quan tâm giao diện nào đã gửi phát sóng. Họ chỉ cần phản hồi với nó." Hả ... họ cũng cần gửi chương trình phát sóng, không chỉ trả lời họ. Hãy xem xét trường hợp của một trình duyệt máy chủ LAN. Nó gửi các gói phát sóng để khám phá các máy chủ trò chơi trên mạng. Nếu các gói phát sóng không được gửi đến tất cả các giao diện, trình duyệt máy chủ trò chơi sẽ không hiển thị các máy chủ trò chơi có thể truy cập thông qua các giao diện này. Nói cách khác, sử thi thất bại.
Etienne Dechamp

1
"Tôi không chắc chắn, nhưng tôi nghĩ rằng HĐH đang thấy yêu cầu 255.255.255.255 và nói rằng nó cần gửi nó ra trên tất cả các giao diện (để tìm tất cả các hàng xóm ngay lập tức), nhưng nó đã được yêu cầu từ một ứng dụng cụ thể, ràng buộc với một IP cụ thể (có thể được mặc định dựa trên số liệu). " Tôi đồng ý. Điều đó không có nghĩa đó là điều phải làm. Theo tôi, nó hoàn toàn vi phạm nguyên tắc ít bất ngờ nhất theo quan điểm của nhà phát triển ứng dụng, người chỉ mong muốn có gói tin được gửi đến mọi người trên tất cả các giao diện.
Etienne Dechamp

4
Không chắc chắn những gì bạn có nghĩa là trùng lặp. Các RFC đặc biệt cấm chuyển tiếp các gói phát sóng. Chỉ nên có một gói được gửi, mà tôi nghĩ là toàn bộ mấu chốt của cuộc thảo luận của chúng tôi. Nếu HĐH thực hiện như bạn nói, nó thực sự sẽ phải tạo ra 9 gói tổng (3 cho mỗi giao diện) vì lớp IP sẽ phải tạo ba gói với các IP nguồn riêng biệt (một cho mỗi NIC ở Lớp 3) và sau đó mỗi NIC sẽ phải gửi chúng ra trên Ethernet (Lớp 2). Nếu có các tuyến giữa các mạng, thì bạn sẽ nhận được 3 phản hồi! Cái nào là đúng?
Scott Lundberg

4

Cuối cùng, tôi đã giải quyết nó một cách lập trình. Tôi đã viết một phần mềm rất nhỏ có tên WinIPBroadcast , đảm nhiệm việc chuyển tiếp các khung phát sóng tới tất cả các giao diện.

Nó hoạt động bằng một thực tế thú vị: có thể nhận các gói phát sóng toàn cầu được tạo cục bộ khi nghe trên địa chỉ loopback (127.0.0.1). WinIPBroadcast lắng nghe địa chỉ cục bộ cho tất cả các chương trình phát bằng cách sử dụng các ổ cắm RAW, sau đó với mỗi gói phát sóng, nó chuyển tiếp nó tới tất cả các giao diện ngoại trừ giao diện ưa thích.


Vì ngăn xếp cửa sổ là một nhánh của ngăn xếp BSD, tôi tò mò muốn biết liệu BSD có biểu hiện hành vi tương tự không.
x0n

Phần mềm của bạn không hoạt động. The program can't start becuase api-ms-win-core-rtlsupport-l1-2-0.dll is missing from your computer.. Chúc may mắn tìm thấy điều đó .dlltrên Google.
Alex G

@AlexG: thật kỳ lạ, tôi nghĩ rằng tôi đã khắc phục vấn đề đó thông qua github.com/dechamp/WinIPBroadcast/commit/ ,. Bạn có chắc là bạn đang chạy phiên bản cuối cùng (1.6)? Vui lòng gửi một lỗi tại github.com/dechamp/WinIPBroadcast/issues và tôi sẽ xem xét.
Etienne Dechamp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.