日韩欧美国产精品免费一二-日韩欧美国产精品亚洲二区-日韩欧美国产精品专区-日韩欧美国产另-日韩欧美国产免费看-日韩欧美国产免费看清风阁

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

使用TCP協(xié)議的NAT穿透技術(shù) (轉(zhuǎn))

admin
2014年2月7日 12:31 本文熱度 6005

其實很早我就已經(jīng)實現(xiàn)了使用TCP協(xié)議穿透NAT了,但是苦于一直沒有時間,所以沒有寫出來,現(xiàn)在終于放假有一點空閑,于是寫出來共享之。



一直以來,說起NAT穿透,很多人都會被告知使用UDP打孔這個技術(shù),基本上沒有人會告訴你如何使用TCP協(xié)議去穿透(甚至有的人會直接告訴你TCP協(xié)議是無法實現(xiàn)穿透的)。但是,眾所周知的是,UDP是一個無連接的數(shù)據(jù)報協(xié)議,使用它就必須自己維護收發(fā)數(shù)據(jù)包的完整性,這常常會大大增加程序的復(fù)雜度,而且一些程序由于某些原因,必須使用TCP協(xié)議,這樣就常常令一些開發(fā)TCP網(wǎng)絡(luò)程序的人員“談穿透色變”。那么,使用TCP協(xié)議是不是就不能實現(xiàn)穿透呢?答案當(dāng)然是否定的:TCP協(xié)議不僅能實現(xiàn)NAT穿透,而且實現(xiàn)起來比UDP穿透甚至還簡單一些。



要了解如何使用TCP穿透NAT,就要首先看看如何使用UDP穿透NAT。
我們假設(shè)在兩個不同的局域網(wǎng)后面分別有2臺客戶機A和 B,AB所在的局域網(wǎng)都分別通過一個路由器接入互聯(lián)網(wǎng)。互聯(lián)網(wǎng)上有一臺服務(wù)器S。
現(xiàn)在AB是無法直接和對方發(fā)送信息的,AB都不知道對方在互聯(lián)網(wǎng)上真正的IP和端口, AB所在的局域網(wǎng)的路由器只允許內(nèi)部向外主動發(fā)送的信息通過。對于B直接發(fā)送給A的路由器的消息,路由會認為其“不被信任”而直接丟棄。
要實現(xiàn) AB直接的通訊,就必須進行以下3步:A首先連接互聯(lián)網(wǎng)上的服務(wù)器S并發(fā)送一條消息(對于UDP這種無連接的協(xié)議其實直接初始會話發(fā)送消息即可),這樣S就獲取了A在互聯(lián)網(wǎng)上的實際終端(發(fā)送消息的IP和端口號)。接著 B也進行同樣的步驟,S就知道了AB在互聯(lián)網(wǎng)上的終端(這就是“打洞”)。接著S分別告訴A和B對方客戶端在互聯(lián)網(wǎng)上的實際終端,也即S告訴A客戶B的會話終端,S告訴B客戶A的會話終端。這樣,在AB都知道了對方的實際終端之后,就可以直接通過實際終端發(fā)送消息了(因為先前雙方都向外發(fā)送過消息,路由上已經(jīng)有允許數(shù)據(jù)進出的消息通道)。



用UDP來實現(xiàn)以上3步不存在什么理論上的問題,因為UDP是無連接的協(xié)議,它允許socket進行“多對一”的通訊(即幾個具有不同IP和端口號的socket向一個接收socket發(fā)送消息)。但是使用TCP就出現(xiàn)了問題:在一般情況下,TCP socket不允許在已經(jīng)建立連接的端口上再進行監(jiān)聽和使用該本地端口。換句話說,當(dāng)AB連接上服務(wù)器S后,S將AB的實際終端告訴對方,下一步本該是AB利用對方的實際終端進行直連,但這時你會發(fā)現(xiàn)對方的實際終端已經(jīng)被占用了(就是各自連接到服務(wù)器S的會話占用了終端),無法同時listen和 connect。于是很多人得出結(jié)論:TCP無法實現(xiàn)NAT穿透。
于是問題的關(guān)鍵變成了如何復(fù)用一個TCP連接的本地終端,這其實不是協(xié)議的問題,而是一個API的問題。幸運的是,所有主流操作系統(tǒng)都支持一個特定的TCP套接字選項——SO_REUSEADDR。這個選項允許將多個socket綁定到同一個本地終端。我們建立socket的時候只要加上這么一行:



setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, &flag, len) ; //C++就這么做



_Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, True) '這是vb.net 更加簡單


知道上面的知識就很好辦了,下面我來說說TCP協(xié)議的穿透流程:
機器布局還是和上面使用UDP的一樣。現(xiàn)在假設(shè)客戶A想和客戶B建立TCP連接。
首先還是 AB分別和服務(wù)器S分別建立連接,S記錄AB的互聯(lián)網(wǎng)實際終端。然后S分別向AB發(fā)送對方的實際終端。接著,從A和B向S連接時使用的端口,AB都異步調(diào)用connect函數(shù)連接對方的實際終端(就是S告訴的終端),同時,AB雙方都在同一個本地端口監(jiān)聽到來的連接(也可以先監(jiān)聽,再connect更好)。由于雙方都向?qū)Ψ桨l(fā)送了connect請求(假設(shè)各自的SYN封包已經(jīng)穿過了自己的NAT),因此在對方connect請求到達本地的監(jiān)聽端口時,路由器會認為這個請求是剛剛那個connect會話的一部分,是已經(jīng)被許可的,本地監(jiān)聽端口就會用SYN-ACK響應(yīng),同意連接。這樣,TCP穿透NAT的點對點連接就成功了。


下面是示例代碼下載,VB.NET代碼,演示如何用TCP協(xié)議穿透NAT實現(xiàn)文件傳送,請用vs2005打開解決方案


http://dl2.csdn.net/down4/20070724/24133943521.rar


代碼中有一個我自己封裝的模仿vb6 winsock的控件ZXMSocket,這個socket可以讓你設(shè)置是否使用SO_REUSEADDR參數(shù),socket是事件驅(qū)動的。


如果你要測試代碼,需要使用一個bat來啟動發(fā)送和接收程序(文件格式請參照bin/Debug文件夾下的run.bat文件),這個bat的功能是以命令行的方式告訴程序登錄服務(wù)器縮使用的用戶名,對于服務(wù)器來說,這個用戶名必須是唯一的,當(dāng)然,這可能有點不科學(xué),但是這畢竟只是一個demo。


該文章在 2014/2/7 12:31:51 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務(wù)費用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務(wù)都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 日韩精品视 | 国产在线精品一区二区三区不卡 | 日韩美女视频一区 | 青青河边草高清免费版新闻 | 亚洲人成色777777精品 | 日韩精品免费一区二区三区高清 | 在线涩涩免费观看国产精品 | 亚洲动漫精品在线 | 亚洲一区二区三区中文字幕在线 | 日本欧美中文幕 | 成年人24小时在线免费观看视频 | 三级视频婷婷麻 | 300部国产真实乱 | 皮皮在线精品亚洲 | 欧美特黄一免在线观看 | 日本韩国偷拍视频对白不卡高清精 | 国产精品三级国语在线看 | 五月婷婷丁香色 | 日本一区二区 | 亚洲成熟女人毛毛耸耸多 | 国产精品v| 亚洲偷偷自拍高清 | 综合一区二区三区激情在线 | 日本免费一区二区三区在线视频 | 国产精品欧美在线观看 | 精品成人大胸美女视频在线播放 | 新开a3| 在线a视频网站 | 日本三级韩国三 | 午夜亚洲理 | 精品欧美 | 亚洲日本一区二区一本一道 | bt天堂国产狂喷潮在线观看 | 亚洲五月花在线观看 | 入口在线观看国产欧美 | 99re6在线视频精品免费下载 | 成人自拍视频在 | 欧美另类视频在线观看 | 国产精品自产拍高 | 国产+高 | 国产精品综合色 |