ngắn trả lời: nó có thể' t được thực hiện một cách đáng tin cậy.
Câu trả lời dài:
"Hole Punching" đề cập đến kích hoạt quy tắc NAT tự động của bộ định tuyến để cho phép lưu lượng truy cập đến. Khi bạn gửi một gói UDP ra, router (thường) tạo ra một quy tắc tạm thời ánh xạ địa chỉ nguồn và cổng của bạn đến địa chỉ đích và cổng, và ngược lại. Các gói UDP trở về từ địa chỉ đích và cổng (và không có gói nào khác) được chuyển tới địa chỉ nguồn và cổng gốc (và không có cổng nào khác). Quy tắc này sẽ hết thời gian chờ sau một vài phút không hoạt động.
Làm điều này để làm việc khi cả hai điểm cuối phía sau NAT hoặc tường lửa sẽ yêu cầu cả hai điểm cuối gửi gói đến nhau cùng một lúc. Điều này có nghĩa là cả hai bên cần phải biết các địa chỉ IP và số cổng công khai của nhau và cần phải truyền đạt thông tin này cho nhau bằng một số phương tiện khác.
Không có cách nào để chương trình trực tiếp xác định địa chỉ IP công khai của chính nó nếu nó nằm sau NAT (nó sẽ chỉ thấy địa chỉ riêng của nó, chẳng hạn như 192.168.x.x
). Nhưng vì bạn giả sử rằng con người liên quan biết địa chỉ IP của nhau, những con người đó có thể chỉ cần gõ vào địa chỉ của người kia.
Nhưng điểm bắt thực sự là không có cách nào để chương trình trực tiếp xác định số cổng mà bộ định tuyến đang sử dụng ở phía công cộng. Chương trình của bạn có thể bị ràng buộc với 12345 trên máy cục bộ, nhưng bộ định tuyến có thể ánh xạ tới hầu hết mọi cổng ở phía công cộng. (Hãy tưởng tượng hai máy tính trên mạng cục bộ của bạn gửi cả hai từ cổng 12345, rõ ràng là router sẽ phải ánh xạ một trong số chúng tới một số khác.) Vì vậy, mặc dù bạn và con người có thể biết số cổng địa phương bạn đang bị ràng buộc, không có cách nào để biết số cổng mà router sẽ hiển thị cho thế giới.
Nguồn
2012-01-17 20:04:04
dupe có thể có của: http://stackoverflow.com/questions/8523330/programming-p2p-application/8524609#8524609 – selbie
Không có chức năng đơn giản mà bạn chỉ có thể gọi đó là ý chí giải quyết tất cả các vấn đề về NAT traversal của bạn. Xem liên kết ở trên để có một cuộc thảo luận dài hơn về NAT traversal và P2P. – selbie