您好,歡迎來(lái)電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>數(shù)值算法/人工智能>

從SimpleChat分析VPN技術(shù)

大?。?/span>0.6 MB 人氣: 2017-09-28 需要積分:2

  SimpleVPN寫好了以后,感覺(jué)比較簡(jiǎn)單,我覺(jué)得只有簡(jiǎn)單的東西才經(jīng)得起折騰,才能全民折騰,所以說(shuō)SimpleVPN還不夠簡(jiǎn)單,本文來(lái)一個(gè)更加簡(jiǎn)單的——展示一個(gè)超級(jí)簡(jiǎn)單的點(diǎn)對(duì)點(diǎn)聊天程序,而且還帶簡(jiǎn)單加密。順便,我們?cè)賮?lái)看下,到底什么是VPN以及怎樣實(shí)現(xiàn)它。

  QQ如今才剛剛行過(guò)成年之禮,典型的90后00前,卻早已到了后浪把前浪拍到岸邊的砍兒,果不其然,被10后的微信給逆襲了。好在都是騰訊的,這就把競(jìng)爭(zhēng)收斂到了公司內(nèi)部,不然這將意味著一個(gè)巨人的倒下,太可怕了。多年前,很多人逆向過(guò)QQ的協(xié)議,然后做了各種各樣的第三方客戶端,這在騰訊看來(lái)是在搞根據(jù)地?fù)岋埻?,這是無(wú)法接受的,所以加強(qiáng)了各種安全措施,讓你第三方無(wú)法接入這個(gè)私有化的QQ系統(tǒng)。此后,第三方的QQ軟件漸漸消失了,只剩下了“騰訊QQ”。不過(guò),在我看來(lái),騰訊封閉QQ協(xié)議不見(jiàn)得是件好事,你能指望一個(gè)QQ終端能做出什么大動(dòng)作呢?充其量騰訊QQ是一個(gè)非常棒的產(chǎn)品,但是微信出來(lái)之后呢?如果微信不是T家的呢。。.所以說(shuō)啊,讓所有人都接受T家的通訊協(xié)議才是真正的霸道,從業(yè)務(wù)側(cè)不一定是這般,至少?gòu)?a target='_blank' class='arckwlink_none'>網(wǎng)絡(luò)側(cè)看是這樣的。這樣一來(lái),即便哪天阿里做出了新的社交產(chǎn)品,還是“基于騰訊的XXX協(xié)議,兼容QQv.。版本,兼容微信v.。。版本”,你看那些偉大的公司,很多都貢獻(xiàn)了一個(gè)協(xié)議或者規(guī)范,比如HTTP、HHTPS、SSL/TLS、Android……

  除了QQ之外,還有一類軟件是我們熟悉的,那就是迅雷和電驢。不管是QQ,還是迅雷、電驢,它們的共同點(diǎn)都是在TCP/IP網(wǎng)絡(luò)之上重新構(gòu)建了一個(gè)新的點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò),即P2P網(wǎng)絡(luò)。所謂的P2P網(wǎng)絡(luò)指的是網(wǎng)絡(luò)中的節(jié)點(diǎn)都是對(duì)等關(guān)系,任意兩個(gè)節(jié)點(diǎn)之間,一個(gè)節(jié)點(diǎn)和多個(gè)節(jié)點(diǎn)之間均可以對(duì)等通信。事實(shí)上,P2P根本就沒(méi)有什么神奇的,我們最底層的IP網(wǎng)絡(luò)就是一個(gè)P2P網(wǎng)絡(luò),任意兩個(gè)節(jié)點(diǎn)之間都可以實(shí)現(xiàn)沒(méi)有主從關(guān)系的單播通信,而一個(gè)節(jié)點(diǎn)和多個(gè)節(jié)點(diǎn)之間則可以用組播進(jìn)行通信,只是IP名稱早已有之,因此P2P就特指應(yīng)用層的組網(wǎng)模式了。簡(jiǎn)單點(diǎn)說(shuō),如果說(shuō)IP網(wǎng)絡(luò)是在各種互通的鏈路層之上構(gòu)建的一個(gè)點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)的話,那么P2P網(wǎng)絡(luò)就是構(gòu)建于TCP/IP之上的對(duì)點(diǎn)對(duì)網(wǎng)絡(luò)。至于說(shuō)這個(gè)點(diǎn)對(duì)點(diǎn)上跑什么,那就取決于網(wǎng)絡(luò)構(gòu)建者的意愿了。

  如果在點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)上跑人與人之間互發(fā)的消息,那它就是個(gè)聊天軟件,比如QQ,微信這種,如果在點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)上跑文件數(shù)據(jù),那就是P2P下載,那它就是個(gè)P2P下載軟件,比如迅雷,電驢這種,類似的,如果在點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)上跑IP數(shù)據(jù)報(bào)文或者以太幀,那它就是個(gè)Overlay技術(shù),比如VXLAN、GRE這種,如果將以上這些Overlay數(shù)據(jù)進(jìn)行加密,那它就是VPN。不管怎樣,名稱并不重要。

  以上這些都不是本文的核心——本文的核心在于展示一下從VPN到聊天程序的過(guò)渡是多么簡(jiǎn)單。

  在我之前的文章《假期跟我一起寫一個(gè)點(diǎn)對(duì)點(diǎn)VPN-SimpleVPN詳解》(http://blog.csdn.net/dog250/article/details/70945840)中,我展示了一個(gè)非常簡(jiǎn)單的點(diǎn)對(duì)點(diǎn)VPN框架,本文中,我來(lái)將它改成一個(gè)非常簡(jiǎn)單的聊天程序。功能如下:

  用戶登錄可以獲取在線用戶列表;

  用戶登錄后可以通知其它在線用戶該用戶登錄;

  登錄用戶可以隨時(shí)獲取在線用戶列表;

  登錄用戶可以給指定在線用戶發(fā)送消息;

  支持在線用戶間的群聊。

  基本上,除了不支持留言,基本該有的都有了。我們來(lái)看下怎么改。

  其實(shí),TCP/IP任何層的對(duì)等通訊都是在“聊天”,只是類似社交軟件中的聊天是在人與人之間進(jìn)行的,而TCP/IP對(duì)等層“聊天”是協(xié)議與協(xié)議之間進(jìn)行的。協(xié)議與協(xié)議之間的聊天需要一個(gè)尋址的過(guò)程,不管是DNS,IP路由,ARP解析,MAC/端口查找。。.都是為了確認(rèn)并找到要把消息發(fā)給誰(shuí)。而人與人之間的聊天在發(fā)消息之前也要在頭腦中經(jīng)過(guò)一個(gè)類似的過(guò)程,也就是說(shuō),當(dāng)你按下回車鍵的那一刻,你已經(jīng)很明確這條消息是發(fā)給誰(shuí)的了,這與網(wǎng)絡(luò)協(xié)議之間的對(duì)等通信完全不同,后者需要協(xié)議來(lái)完成尋址,而人則在自己的大腦中完成尋址過(guò)程,所以說(shuō),改法很簡(jiǎn)單:

  1. 添加消息的發(fā)送和接收

  chat程序直接接收用戶的輸入,而不是從TAP中讀取以太幀,所以不需要tap_fd,改為con_fd了,其實(shí)就是console,因此需要將read_from_tap和write_to_tap改為

  read_from_console和write_to_console:

  從SimpleChat分析VPN技術(shù)

  2. 刪除尋址和學(xué)習(xí)機(jī)制

  由于尋址已經(jīng)在人的大腦中完成,故不再需要尋址,因此去掉了以下的handler:

  從SimpleChat分析VPN技術(shù)

  3. 增加在線用戶列表顯示功能

  詳見(jiàn)1的用戶輸入解析。當(dāng)輸入list的時(shí)候,會(huì)顯示在線用戶。

  現(xiàn)假設(shè)有ID為1,2,3的3個(gè)用戶登錄系統(tǒng),用戶3輸入list時(shí),以下是輸出:

  ID:1 online

  ID:2 online

  然后同樣在用戶3的終端前輸入2:aaaaaaaaaaaaaaaa,那么用戶2的終端將顯示:

  From 3:aaaaaaaaaaaaaaaa

  也許你會(huì)覺(jué)得這不像個(gè)聊天程序,那是因?yàn)樗僖粋€(gè)漂亮的GUI,而我并不擅長(zhǎng)這個(gè)。

  ------------------------

  此時(shí)應(yīng)該知道frame中sid,did這兩個(gè)ID的作用了,它可以用來(lái)支持群聊,就跟它在VPN中支持組播一樣。。.

  關(guān)于這個(gè)的代碼,我已經(jīng)放進(jìn)了github的SimpleVPN那個(gè)目錄:https://github.com/marywangran/SimpleVPN/blob/master/SimpleChat.c

  通過(guò)以上,我們可以看出,這類技術(shù)可以改頭換面叫做任何不同的名稱,關(guān)鍵還是看你怎么用它了。不管它叫VPN,管它叫chat,管它叫overlay吧,或者直接overlaychat。

  其實(shí),要什么VPN,如果你和你的QQ好友能把自己的QQ輸入輸出和本地的一個(gè)TAP網(wǎng)卡字符設(shè)備的輸入輸出對(duì)接起來(lái),那大QQ就可以當(dāng)成是一個(gè)VPN客戶端,同樣的,如果你用迅雷,電驢什么的來(lái)對(duì)接一個(gè)虛擬網(wǎng)卡傳輸以太幀或者IP報(bào)文而不是傳輸文件,那么迅雷,電驢構(gòu)建出來(lái)的P2P網(wǎng)絡(luò)就是一個(gè)VPN網(wǎng)絡(luò)。

  讓我們來(lái)暢想一下如何來(lái)應(yīng)景。在裝了QQ的Windows機(jī)器上,有一個(gè)文件,它是“C:/Tap.frame”,針對(duì)它的讀寫實(shí)際上就是在讀寫TAP虛擬網(wǎng)卡設(shè)備,這個(gè)用Windows驅(qū)動(dòng)非常容易辦到。此時(shí),我們把這個(gè)文件用QQ傳送給好友,并且好友那邊也有一個(gè)這樣的文件,會(huì)怎樣?我們豈不是通過(guò)QQ搭建了一條隧道嗎?Overlay?嗯,是的,這叫做IP over QQ吧,或者Everything over APP?管它呢,名詞不重要!

  這是分層模型給我們帶來(lái)的好處!只要你的IP報(bào)文或者以太幀在本地形成了,除了直接發(fā)送到網(wǎng)線上之外,還有別的運(yùn)輸方式,比如你可以用UDP將其送出,可以用一個(gè)新的IP,當(dāng)然這些都是常規(guī)的。本文中,我們看到,你還可以用QQ、迅雷、電驢之類的軟件將其送出,甚至,你可以用集裝箱將其送出,這就是IP over集裝箱技術(shù)。

非常好我支持^.^

(0) 0%

不好我反對(duì)

(0) 0%

      發(fā)表評(píng)論

      用戶評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?