PDA

View Full Version : Cách kết nối trực tiếp p2p qua internet?



hoanglinh9466
28-05-2007, 09:49 PM
Ko có box dự án nên post vào đây vậy

Chúng ta thường dùng các ct chat, chuyển file qua internet đều phải qua 1 máy chủ trung gian. Ví dụ như chat = yahoo, ta ko kết nối đến thẳng máy của người đang chat với mình mà kết nối đến máy chủ của yahoo, gửi nội dung chat đến server của yahoo, rồi server này mới gửi đến máy người đang chat với mình. Cách này làm thông tin gửi đi sẽ rất chậm, 1 host ở việt nam mà lại phải gửi gói tin ra tận châu âu hay châu mĩ gì đó rồi mới về 1 host khác ở việt nam !
Bình thường không thể thực hiện kết nối trực tiếp giữa 2 máy là vì hầu hết các máy trong mạng LAN đều được đặt ở trong NAT. NAT là 1 phương thức ánh xạ địa chỉ nội bộ và port để nối ra internet mà chỉ cần dùng 1 địa chỉ ip internet (để tiết kiệm dải địa chỉ internet đang cạn dần). Vì thế mà khi mọi người vào các trang web cho xem địa chỉ ip của mình đều thấy các máy trong mạng LAN có 1 địa chỉ ip duy nhất. Nhưng phương thức này làm chúng ta ko thể tạo lập kết nối theo cách bình thường đc.
Muốn kết nối trực tiếp được qua NAT cần có cách đặc biệt, giống như CT hamachi vậy, nhưng ct mình làm ra mà lại phải đi cài đặt 1 ct của người khác thì xem ra ko hay lắm, muốn làm virus hay trojan thì càng ko thể làm vậy. Vì vậy em muốn làm 1 thư viện chuyên dùng để kết nối kiểu này (hình như chưa có ai làm thì phải), nhưng em cần 1 máy khác cũng nối internet để thử nghiệm. Nếu có ai hứng thú thì tham gia nhé.

Đây là tài liệu chính(tiếng Anh): Peer-to-Peer_Communication_Across_Network_Address_Translat ors.doc

hailoc12
31-05-2007, 10:23 AM
Đề tài này hay đấy, trước anh thử dùng Winsock để kết nối tới máy khác, tuy nhiên cũng gặp vấn đề về IP. Nếu em cần một máy khác để thử nghiệm thì sẵn sàng, có điều không được gửi virus đâu nhé

nguyentuan2
31-05-2007, 01:43 PM
cảnh báo là không cấu hình NAT không làm được
hamachi cũng vậy thôi, bạn không thể làm được nếu không cấu hình lại bảng NAT
Hoặc lại phải dùng server trung gian

Hãy xem bittorent hoặc emule đi, bạn có để ý là mỗi khi cài đặt nó đều có mục là test port, nếu không đụng đến bảng NAT, thì thực chất bạn không tham gia vào p2p

hoanglinh9466
31-05-2007, 06:59 PM
Cấu hình lại NAT đc. gọi là PortForwarding, nhưng dùng cách này ko hay, muốn cấu hình lại cũng cần 1 chút kĩ năng, ko phải người dùng nào cũng làm đc. Với lại muốn viết 1 con trojan mà lại bắt nạn nhân cấu hình NAT lại cho mình thì dở quá.
Có 1 cách khác gọi là "punching hole". Để em trình bày vắn tắt nhé, chi tiết thì ở trong tài liệu:

Với UDP: Đầu tiên cả 2 máy sẽ cùng trao đổi UDP với 1 server, server này sẽ lấy thông tin về ip address và port của 2 máy (ko phải là ip và port trong mạng nội bộ mà là ip đc. cung cấp bởi ISP và port của NAT device, để hiểu cần đọc các tài liệu về cách làm việc của NAT), sau đó gửi thông tin về port và ip của máy này cho máy kia. Cả 2 máy client sẽ liên tục gửi các gói UDP cho nhau với port và ip do server cung cấp. Điều này rất quan trọng. Bình thường nếu 1 máy gửi các gói UDP này đến máy kia thì sẽ bị NAT device lọc bỏ ngay lập tức, vì NAT device sẽ ko biết phải gửi tiếp các gói này đến máy nào trong mạng LAN. Nhưng nếu dùng số cổng và ip được dùng để trao đổi với server thì khác. Trong bảng NAT đã có sẵn thông tin về địa chỉ trong mạng LAN của máy client, nên nếu 2 máy client gửi các gói UDP cho nhau trong trường hợp này thì các gói này sẽ đến đúng đích mong muốn. Với TCP thì cũng làm gần giống như vậy.

Mọi người đã hiểu chưa nhỉ, em trình bày hơi rối 1 tí. Mọi người cố gắng đọc cái tài liệu trên nhá.

Vấn đề khó khăn nhất bây giờ là ko tìm thấy 1 server nào cho mình xem cổng ngoài của mình cả :( . Nhà em chỉ có 1 máy nối mạng internet, định tắt chức năng NAT của router đi (hơi mạo hiểm 1 tí) mà ko tìm thấy chỗ nào để tắt cả, tài liệu về router trên mạng có hướng dẫn mà sao kkhác quá.

@nguyentuan2: Hồi trước em dùng hamachi, có cần cấu hình NAT gì đâu nhỉ? Thế mà bây giờ dùng thì chả bao giờ connect đc, nó báo là ko thể kết nối đến server của nó. Thế anh làm thế nào ???

hoanglinh9466
31-05-2007, 11:02 PM
Bổ sung thông tin nha: đây là 1 dự án đã được thực hiện cách đây vài năm, trang web là midcom-p2p.sourceforge.net (http://midcom-p2p.sourceforge.net), nó đã làm 1 chương trình NAT check cho mình thử nghiệm, nhưng do đã chuyển qu dự án khác nên server này hiện ko còn hoạt động nên ko thể kiểm tra được nữa. Muốn thử thì có 1 CT server khác, mình lấy mã nguồn và dịch lại, kiếm 1 máy nối trực tiếp internet (ko có NAT) làm server và chạy CT server này.

nguyentuan2
01-06-2007, 11:39 AM
bạn thân mến,
mình đã xem lướt qua cái tài liệu của bạn, và thấy rằng dường như bạn chưa hiểu rõ về bảng NAT lắm
Thực chất các máy tính trực tiếp tham gia trong quá trình p2p là những máy có địa chỉ IP thực, không thể là những máy trong mạng LAN

Những máy trong mạng LAN chỉ có thể tham gia vào p2p gián tiếp thông qua 1 router (chính là rourter ADSL ở nhà bạn) nhờ việc cấu hình bảng NAT trên router

Dễ nhất để bạn kiểm chứng điều này là bạn xóa toàn bộ bảng NAT trong router, viết ct mở 1 port (bind port) trên máy tính trong mạng LAN, bạn có thể dùng mọi phương pháp/ kỹ thuật để viết ct đó. Sau đó ra 1 máy tính ngoài dịch vụ chạy thử ct connect đến máy mà bạn đặt ct trong mạng LAN

Nếu bạn làm được điều đó thì project của bạn mới có thể tiếp tục được

Chúc bạn thành công

hoanglinh9466
01-06-2007, 06:52 PM
Ơ, cái tài liệu có phải do em viết đâu, với lại dự án này người ta đã thực hiện và thành công rồi mà. Thế theo anh thì tài liệu này hướng dẫn sai chứ gì ?? Em nghĩ anh chưa hiểu rõ cách thức "punching hole" là gì, chỉ đọc lướt qua thì ko hiểu đâu, anh đọc kĩ lại đi

nguyentuan2
01-06-2007, 11:10 PM
đọc kỹ lại đi, trong tài liệu đó họ không nói như bạn nghĩ đâu

vinhie47
02-06-2007, 12:07 AM
Nói chung là forward-port với NAT chả liên quan gì đến nhau cả. Các máy tham gia vào một kết nối P2P nào đó qua internet cũng không cần đến forward-port. Forward port để dành cho việc khác :)

hoanglinh9466
02-06-2007, 08:52 AM
Thôi được, nếu em hiểu sai thì anh nguyentuan2 có thể nói cho em biết xem tài liệu đó hướng dẫn cái gì ko.