Cách kiến ​​trúc một ứng dụng P2P


8

[Đã chuyển đến đây theo đề xuất của người dùng SO (10k SO +) ]

Tôi muốn phát triển một ứng dụng ngang hàng. Mặc dù tôi có nhiều kinh nghiệm trong các ứng dụng LOB, nhưng tôi mới tham gia vào lĩnh vực P2P.

Tôi đã có một ý tưởng sơ bộ về cách mọi thứ nên hoạt động nhưng cần thêm một số chi tiết để điền vào sự hiểu biết của tôi.

Những gì tôi biết (tin) tôi cần phải làm:

  • Một tỷ lệ đáng kể khách hàng cần kích hoạt các kết nối gửi đến (quy tắc ala uPnP / NAT)
  • Các nút nên chia sẻ các nút đã biết khác để cung cấp khả năng phục hồi nếu bất kỳ nút cụ thể nào bị hỏng
  • Một số hình thức đồng bộ hóa / tìm đường là cần thiết để gửi dữ liệu giữa các máy khách tùy ý
  • Có thể một số tài nguyên đánh hơi để phân biệt giữa các máy khách "câm" và "siêu nút" mạnh hơn để xử lý đồng bộ / chia sẻ danh sách nút và có thể chuyển tiếp tin nhắn
  • Các khách hàng không có hỗ trợ trong nước nên giữ một kết nối ra ngoài thông qua đó họ có thể nhận thông tin về các nút để kết nối với

Nói tóm lại, tôi hy vọng sẽ cung cấp (lúc đầu) một dịch vụ trò chuyện / nhắn tin không phụ thuộc vào kết nối với bất kỳ máy chủ trung tâm cụ thể nào. Trong khi tôi tưởng tượng mình sẽ cần cung cấp một số "siêu dữ liệu" tập trung để bắt đầu mọi thứ (hoặc sau khi nâng cấp đáng kể), thì chúng nên là tùy chọn sau khi mạng P2P chức năng được thiết lập.

Tôi có thể thấy hàng loạt vấn đề và không biết cách giải quyết chúng. Chủ yếu là làm thế nào để ...

  • Xác thực người dùng đến các nút khác mà không có cơ quan trung ương để xác minh
  • Phối hợp các nút nào biết về các nút khác (số cực tiểu / theo độ trễ / ???)
  • Cho phép một người dùng nhất định xác định xem người dùng (hoặc nút) khác có trực tuyến không
  • Xử lý tình huống trong đó 2 nhóm nút bị ngắt kết nối vật lý (bị chặn không khí) và cách đồng bộ lại khi kết nối lại các nhóm
  • Vân vân

Tôi biết đây là một câu hỏi khá mở, vì vậy trong khi các mẫu thiết kế cấp cao sẽ được đánh giá cao, điều tôi thực sự tìm kiếm là một hướng dẫn đúng đắn về cách người khác xử lý các vấn đề này (và những vấn đề tôi chưa xem xét ).


Là thẻ ứng dụng web có chủ ý? Nếu vậy, những gì, trong tâm trí của bạn, tạo thành một ứng dụng web p2p ?
Svidgen

@svidgen: Không phải là không có lý, rằng bầy có thể là một máy chủ web cụm.
Steven Evers

@svidgen Bắt tốt, tôi định làm cho câu hỏi lớn hơn một chút nhưng đã thay đổi ý định vì vậy tôi nên xóa thẻ đó. Cảm ơn
Cơ bản

1
Hãy xem BitTorrent và DHT cũng như các nguyên tắc và công nghệ họ sử dụng. Với hàng chục năm kinh nghiệm, cả hai đã giải quyết hầu hết các vấn đề bạn muốn giải quyết. Điều này thực sự là quá rộng.
CodeCaster

@CodeCaster Tôi bắt đầu nghĩ rằng bạn đang theo dõi tôi;)
Cơ bản

Câu trả lời:


5
  1. Thiết kế một giao thức và xây dựng một ứng dụng trên đó là một dự án lớn. Lấy càng nhiều càng tốt từ các giao thức hiện có.
  2. Hầu hết các giao thức có liên quan (ngoài skype, tin nhắn ngang hàng, nhưng giao thức là bí mật) là những giao thức cung cấp tài nguyên qua mạng ngang hàng, có nghĩa là một phần của TOR cung cấp miền .onion và freenet .
  3. Hầu hết những điều bạn liệt kê trong "cần làm" được xử lý bởi freenet và nhiều trong số chúng trong TOR cũng vậy.
  4. Danh tính của người dùng phải được mã hóa. Liên kết danh tính từ thực với các khóa mật mã đòi hỏi một số hình thức tin cậy web như trong PGP / GPG .
  5. Lý do quan trọng để sử dụng tin nhắn ngang hàng là quyền riêng tư. Tin nhắn ngoài luồng về cơ bản là bắt buộc (chỉ định cách xác thực phải hoạt động).
  6. Sự hiện diện cũng phải được ghi lại, về cơ bản là một loại tin nhắn đặc biệt.
  7. Ngắt kết nối không có vấn đề đặc biệt ngoài khả năng chịu lỗi chung. Đối với mỗi bên, có vẻ như các nút khác không thành công và tham gia lại.
  8. Bạn có thể muốn sử dụng giao thức làm tín hiệu cho một số giao thức truyền phát, có thể là sRTP . Giao thức đó xử lý NAT traversal, do đó bạn có thể sao chép cơ chế cho chính giao thức p2p.
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.