2008-08-28 58 views
20

Tôi đang làm việc trên một giải pháp .net được chạy hoàn toàn bên trong một mạng đơn lẻ. Khi người dùng thực hiện thay đổi đối với hệ thống, tôi muốn khởi chạy thông báo và yêu cầu mọi người khác nghe thấy và hành động tương ứng. Có cách nào để chúng tôi có thể phát các tin nhắn như thế này (như UDP sẽ cho phép bạn làm) trong khi vẫn đảm bảo việc phân phối (như TCP) không?Phát sóng như UDP với độ tin cậy của TCP

Đây là một mạng nhỏ (30 khách hàng), nếu điều đó có thể tạo sự khác biệt.

Trả lời

15

Hầu như tất cả các trò chơi đều cần có các thuộc tính phản ứng nhanh (và ở mức độ thấp hơn, các thuộc tính không kết nối) của UDP và độ tin cậy của TCP. Những gì họ làm là họ xây dựng giao thức đáng tin cậy của riêng mình trên đầu trang của UDP. Điều này mang lại cho họ khả năng chỉ cần gói các gói tin đến bất cứ nơi nào và tùy chọn làm cho chúng đáng tin cậy, là tốt.

Hệ thống gói tin đáng tin cậy thường là hệ thống thử lại đơn giản cho đến khi được thừa nhận đơn giản hơn TCP nhưng có các giao thức đi xa hơn những gì TCP có thể cung cấp.

Tình huống của bạn nghe rất đơn giản. Có thể bạn sẽ có thể tự tạo ra giải pháp sạch nhất - chỉ cần làm cho mọi khách hàng gửi lại phản hồi "Tôi nghe bạn" và máy chủ tiếp tục cố gắng cho đến khi nó nhận được (hoặc từ bỏ).

Nếu bạn muốn một cái gì đó nữa, hầu hết các thư viện giao thức tùy chỉnh đều có trong C++, vì vậy tôi không chắc chắn họ sẽ sử dụng bao nhiêu. Tuy nhiên, kiến ​​thức của tôi ở đây là một vài năm tuổi - có lẽ một số giao thức đã được chuyển qua bây giờ. Hmm ... RakNet và enet là hai thư viện C/C++ xuất hiện trong tâm trí bạn.

+0

Về * "mà đi xa hơn những gì TCP có thể cung cấp" *, làm thế nào là có thể kể từ khi TCP được thực hiện cụ thể để giải quyết giao hàng đáng tin cậy? Có điều gì đó mà TCP thiếu trong một hệ thống gói tin đáng tin cậy không? – Pacerier

+0

@Pacerier TCP sẽ bán lại dữ liệu mà nó đã nhận được nếu thậm chí còn thiếu một phần từ luồng. Có lẽ trong một số trường hợp, yêu cầu là khác nhau - nhận dữ liệu ngay sau khi nó đến, ngay cả khi nó không đúng thứ tự. –

-3

thực hiện phát đa hướng RDP.

+0

Không có TCP multicast, tôi sẽ bỏ phiếu này xuống, nhưng tôi không có đủ danh tiếng. – tialaramex

0

Điều bạn có thể làm là sau khi chương trình phát sóng có các khách hàng bắt đầu kết nối tcp. Nếu không, bạn chỉ cần giữ một danh sách tất cả các máy khách và tự khởi tạo các kết nối tới từng máy khách.

0

Tôi nghĩ có ba lựa chọn, nói một cách rộng rãi:

  1. Thay vì UDP phát sóng, bạn có thể tạo ra một thực thể (một chủ đề, quá trình, máy chủ, dịch vụ, hoặc bất cứ điều là tồn tại trong giải pháp của bạn) giữ danh sách người đăng ký và gửi tin nhắn UDP unicast cho họ.
  2. Sử dụng đa phương tiện UDP, nhưng bạn sẽ phải viết một số loại cơ chế sẽ đảm nhiệm việc phân phối đáng tin cậy cho bạn (ví dụ: thử lại, hết giờ, v.v.). Điều này cũng có nghĩa là bạn phải nhận được trả lời từ khách hàng của mình.
  3. Nếu bạn không sợ các giao thức vận chuyển thực nghiệm, bạn có thể trông here cho các đề xuất.,
7

Bạn có thể sử dụng Spread để làm truyền thông nhóm.

+0

Tôi sẽ làm điều này. Sử dụng thư viện của người khác là đặt cược tốt nhất của bạn để có được điều này đúng. –

+1

@JayKominek, Phụ thuộc vào ai là "người khác". – Pacerier

1

Bạn có thể triển khai hành vi giống như TCP của mình tại lớp ứng dụng.

Ví dụ: bạn sẽ gửi truyền phát UDP, nhưng sau đó mong đợi phản hồi trả lời từ mỗi máy chủ. Nếu bạn không nhận được phản hồi trong vòng X giây, hãy gửi một câu trả lời khác và tiếp tục cho đến khi đạt đến một ngưỡng nào đó. Nếu đạt đến ngưỡng (nghĩa là máy chủ không phản hồi), thì báo cáo lỗi.

Để thực hiện việc này, bạn cần danh sách máy chủ được xác định trước để mong đợi phản hồi từ đó.

11

Hãy xem sctp có sự kết hợp các tính năng tcp và udp. Có một cửa sổ implementation có sẵn.

+1

+1 để đề xuất sctp. Tuy nhiên sctp thực sự không có thời gian để trưởng thành nhiều như TCP hay UDP. Rất nhiều trình điều khiển, nics và thiết bị chuyển mạch havent được siêu tối ưu hóa cho nó giống như họ có cho TCP. Có một so sánh hiệu suất thú vị ở đây - http://datatag.web.cern.ch/datatag/WP3/sctp/tests.htm – quixver

0

Yoy nên xem xét đặc điểm kỹ thuật Norm (NACK-Oriented Multicast). Bạn có thể tìm thấy information about Norm here.

Giao thức NORM được thiết kế để cung cấp end-to-end đáng tin cậy vận chuyển của các đối tượng dữ liệu số lượng lớn hoặc suối trên generic định tuyến multicast IP và dịch vụ chuyển tiếp. NORM sử dụng có chọn lọc, tiêu cực nhận (NACK) cơ chế để vận chuyển độ tin cậy và cung cấp thêm cơ chế giao thức để tiến hành phiên multicast đáng tin cậy với phối hợp "tiên nghiệm" hạn chế trong người gửi và người nhận

Nó hơi rất nổi tiếng trong thế giới quân sự.

Norm specs.

Norm Source

3

@epatel - Tôi đề nghị thứ hai SCTP (Tôi đã bỏ phiếu lên, nhưng không thể bình luận được nêu ra công cụ để thêm ở đây).

SCTP có nhiều tính năng và tính linh hoạt tuyệt vời. Bạn có thể chia nhỏ kết nối của mình thành nhiều luồng và chọn độ tin cậy của mỗi luồng và liệu nó có được đặt hàng hay không. Ngoài ra, với tiện ích mở rộng Partially Reliability, bạn có thể kiểm soát độ tin cậy trên cơ sở cho mỗi thư.

1

Phát sóng không phải là nội dung bạn muốn. Vì có thể và có thể sẽ là các thiết bị được gắn vào mạng này mà không quan tâm đến thông điệp của bạn, bạn nên sử dụng Multicast. Không giống như các tin nhắn quảng bá, các tin nhắn Multicast chỉ được gửi đến và xử lý cho các khách hàng quan tâm (tức là những người có ý định nhận được loại tin nhắn cụ thể này và hành động).

Nếu sau đó bạn mở rộng hệ thống này để có thể định tuyến qua mạng lớn, phát đa hướng có thể mở rộng, trong khi phát sóng sẽ không, do đó bạn có được lợi ích về khả năng mở rộng mà bạn có thể đánh giá cao sau này. Trong khi đó bạn loại bỏ các chi phí không cần thiết trong các thiết bị chuyển mạch và các thiết bị khác mà không cần phải nhìn thấy những thông báo "một cái gì đó thay đổi".

+0

Chắc chắn là một điểm cần lưu ý. – Pacerier

+0

Bạn không biết rằng từ câu hỏi, ví dụ trong một miền không dây, bạn sẽ bị chặn khỏi mạng trong khi tin nhắn đang được gửi qua không trung bất kể để phát sóng, đọc và bỏ qua nó là chi phí nhỏ . Một số trường hợp sử dụng chạy các mạng chuyên dụng như mỏ, lưới cảm biến, hệ thống điều khiển, v.v. – user1496062

+0

Nó không phải là "hiệu quả hơn để phát sóng", nó hoàn toàn ngược lại. Đó là quan điểm của tôi. – tialaramex

2

Bạn có thể muốn xem xét RFC 3208 "Đặc điểm giao thức truyền tải đáng tin cậy PGM".

Dưới đây là tóm tắt:

Pragmatic chung Multicast (PGM) là một phương tiện giao thông multicast tin cậy
giao thức cho các ứng dụng đòi hỏi ra lệnh hoặc có thứ tự,
trùng lặp miễn phí, dữ liệu multicast giao hàng từ nhiều nguồn đến
nhiều người nhận. PGM đảm bảo rằng người nhận trong nhóm hoặc nhận tất cả các gói dữ liệu từ truyền và sửa chữa hoặc là có thể phát hiện dữ liệu không thể khôi phục mất gói.PGM cụ thể là được dùng làm giải pháp khả thi cho các ứng dụng đa phương tiện với yêu cầu độ tin cậy cơ bản . Mục tiêu thiết kế trung tâm của nó là sự đơn giản của hoạt động có liên quan đến mối quan hệ đối với khả năng mở rộng và hiệu quả mạng.

0

Tại sao tạo thứ gì đó từ đầu nếu bạn có thể sử dụng thư viện? Đặc biệt cho dự án nhỏ như vậy?

Hãy thử sử dụng Emcaster tự sử dụng tin nhắn đa phương tiện đáng tin cậy - PGM, được viết bằng .NET và có nguồn đầy đủ. Bạn sẽ nhận được pub/sub engine đẹp với tính năng lọc chủ đề có sẵn. Hoặc bạn có thể học hỏi từ mã như thế nào để làm điều đó và cơ sở phần mở rộng của riêng bạn trên đó.

0

Tôi nghĩ rằng tính năng khó chịu nhất của TCP trong các tình huống này là khả năng/cách sắp xếp các gói dữ liệu đến thứ tự ban đầu của chúng - khái niệm luồng. Bạn không thể đọc một byte cho đến khi byte trước khi nó đến.

Nếu bạn có thể sống mà không có nó, bạn có cơ hội để có giao thức của bạn, nhanh chóng và đáng tin cậy, nhưng không phải để đặt hàng các gói! Nó chỉ đơn giản là không thể quản lý cả hai, bởi vì bạn không thể đặt hàng các byte của bạn cho đến khi bạn nhận được một bản sao khác của một gói tin bị mất, đó là sự cân bằng chính.

1

Tạo máy chủ TCP. Yêu cầu mỗi khách hàng kết nối. Trong giao thức TCP của bạn với các máy khách, tạo mỗi gói với một tiền tố 2 byte với tổng kích cỡ của thông báo sau.

Khách hàng sau đó gọi read(max_size=2) trên ổ cắm để xác định kích thước của thông báo tiếp theo và sau đó read(max_size=s) để thu thập thông báo.

Bạn nhận được tin nhắn được đặt hàng đáng tin cậy, đơn giản. Bạn không cần một khung nhắn tin cho cái này.

+0

Có 30 khách hàng thứ cấp, lên đến vài trăm trong tương lai. Bạn sẽ hỗ trợ như thế nào? – Pacerier

2

Bạn có thể sử dụng Nhà môi giới thư, chẳng hạn như ActiveMQ.
Xuất bản thư của bạn thành một chủ đề và yêu cầu khách hàng đăng ký các đăng ký bền với chủ đề, để họ không bỏ lỡ bất kỳ tin nhắn nào ngay cả khi họ không trực tuyến.

Apache ActiveMQ là một nhà môi giới thông điệp viết bằng Java kèm theo đầy đủ JMS khách hàng. Tuy nhiên Apache ActiveMQ là được thiết kế để giao tiếp qua một số các giao thức như Stomp và OpenWire cùng với hỗ trợ số ngôn ngữ khác nhau cụ thể của từng khách hàng .

nền tảng khách hàng hỗ trợ bao gồm C# và .net

1

bạn muốn chắc chắn muốn xem xét Pragmatic General Multicast:

Trong khi TCP sử dụng ACK thừa nhận nhóm của gói tin gửi đi (một cái gì đó mà có thể là không kinh tế qua đa hướng), PGM sử dụng khái niệm Nhận thức tiêu cực (NAK).

Để biết thêm G-diving, thuật ngữ bạn đang muốn tìm reliable multicast. Ngoài ra hãy xem Multipath TCP.

Các vấn đề liên quan