kết nối mạng mà không cần chuyển tiếp cổng


8

Tôi đang cố gắng thêm chức năng mạng vào trò chơi của mình. Tôi muốn bất kỳ người dùng nào có thể lưu trữ trò chơi và bất kỳ ai cũng có thể kết nối với tư cách là khách hàng. Máy khách gửi thông tin cho máy chủ về vị trí người chơi của họ, v.v. Khi máy chủ nhận được một tin nhắn, nó sẽ xác nhận nó và sau đó phát nó cho các khách hàng khác. Tôi chủ yếu sẽ giao dịch với UDP, nhưng cũng sẽ cần TCP cho công cụ trò chuyện & vận động hành lang.

Vấn đề là dường như tôi không thể nhận được một gói được gửi từ máy khách đến máy chủ hoặc ngược lại mà không cho phép chuyển tiếp cổng trên bộ định tuyến của tôi. Nhưng tôi không nghĩ rằng điều này là cần thiết. Tôi tin rằng lý do tôi cần chuyển tiếp cổng là vì tôi muốn gửi một gói từ 1 máy tính trên mạng LAN đến một máy tính khác trên một mạng LAN khác, nhưng cả hai đều không có địa chỉ IP toàn cầu vì chúng nằm trong mạng LAN. Vì vậy, thực sự, tôi chỉ có thể gửi các gói nhắm mục tiêu vào bộ định tuyến của mạng khác, mà phải chuyển tiếp nó tới máy tôi muốn tiếp cận. Vì vậy, làm thế nào tôi có thể làm điều này mà không cần chuyển tiếp cổng? Bằng cách nào đó, một máy chủ web có thể giao tiếp với máy tính của tôi, không có ip toàn cầu, mà không cần chuyển tiếp cổng. Và tôi đã chơi nhiều game nhiều người chơi không yêu cầu tôi kích hoạt chuyển tiếp cổng. Vì vậy, nó phải có thể.

Btw, tôi đang sử dụng SDL_Net. Tôi không nghĩ rằng điều này sẽ thay đổi bất cứ điều gì mặc dù.


Máy chủ web có IP toàn cầu (hoặc bất kỳ thiết bị nào ở phía trước).
Oskar Duveborn

Câu trả lời:


13

Nhiều đến một NAT (nhiều máy tính có địa chỉ riêng phía sau một địa chỉ công cộng) hoạt động như thế này: Bộ định tuyến theo dõi các gói tin gửi đi và khi nhận được câu trả lời, nó có thể gửi nó đến máy tính nội bộ đã gửi yêu cầu ban đầu. Vì vậy, điều này hoạt động tốt, nếu bạn truy cập một trang web với một địa chỉ IP công cộng.

Tuy nhiên, không thể gửi gói ban đầu từ bên ngoài đến một máy tính cụ thể ở bên trong, trừ khi quy tắc chuyển tiếp được xác định trên bộ định tuyến: Không có cách nào để giải quyết một máy tính cụ thể và bộ định tuyến không có thông tin trong bảng kết nối của mình vì nó không phải là một câu trả lời.

Skype đã thực hiện một kỹ thuật phổ biến được gọi là đục lỗ tường lửa : Một máy chủ có địa chỉ công khai được khách hàng liên hệ. Sau đó, nó sẽ gửi câu trả lời lại cho khách hàng A bảo nó gửi các gói udp đến bộ định tuyến của khách hàng B trên một cổng mà nó mong muốn bộ định tuyến của khách hàng B sẽ sử dụng làm cổng nguồn cho gói gửi đi tiếp theo. Và nó báo cho khách hàng B gửi một gói đến bộ định tuyến đến máy khách A trên một cổng, nó hy vọng bộ định tuyến của A sẽ sử dụng làm cổng nguồn cho gói gửi đi tiếp theo của nó. Nếu dự đoán là chính xác, giờ đây A và B có thể nói chuyện trực tiếp với nhau.

Đấm lỗ tường lửa yêu cầu một máy chủ có địa chỉ IP công cộng để hoạt động như một người điều hành. Và nó đòi hỏi rất nhiều kiến ​​thức về việc triển khai bộ định tuyến NAT thông thường để dự đoán chính xác các cổng nguồn ra bên ngoài. Mặc dù có sẵn các triển khai nguồn mở , bạn nên cố gắng tránh kỹ thuật này vì nó không đáng tin cậy và gây ra nhiều đau đầu. Skye quay lại sử dụng máy chủ có địa chỉ IP công cộng để chuyển tiếp tất cả các gói nếu dự đoán thất bại.


4

Bằng cách nào đó, một máy chủ web có thể giao tiếp với máy tính của tôi, không có ip toàn cầu, mà không cần chuyển tiếp cổng

Điều quan trọng, bản thân máy chủ web có cặp IP / cổng toàn cầu, xác định duy nhất nó. Máy tính của bạn kết nối với máy chủ web sẽ gửi thông tin trở lại cùng một kênh.

Kỹ thuật này rõ ràng là không có sẵn nếu cả hai bên đứng sau một số loại NAT, như trường hợp phổ biến đối với các trò chơi ngang hàng. Vì vậy, thay vào đó, bạn cần phải lừa NAT.

Kỹ thuật bạn đang tìm kiếm được gọi là đục lỗ hoặc đục lỗ , đặc biệt là đục lỗ UDP hoặc đục lỗ TCP . Trong trường hợp này, cả hai máy khách kết nối với một máy chủ toàn cầu, từ đó cho chúng biết cách kết nối với nhau, thông qua "lỗ đục" trong tường lửa bằng kết nối hiện có.

Đấm lỗ không yêu cầu một máy chủ công cộng có IP / cổng toàn cầu để xử lý kết nối ban đầu và tắt, nhưng các yêu cầu về băng thông / xử lý là rất nhỏ. Nếu bạn có một máy chủ sảnh toàn cầu, nó sẽ có thể xử lý dễ dàng.


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.