sock5源碼
⑴ 什麼是http代理伺服器
我們可以將巨大的互聯網比作成一張網路蜘蛛網,而網路爬蟲便是在蜘蛛網上爬行的蜘蛛,把網的節點描述成為網頁,我們將每日任務需求藉助客戶端電腦發出命令,而ip便是被執行的角色,ip帶著每日任務藉助網際網路抵達終端伺服器尋找客戶端交代的每日任務,一個一個節點便是一個一個網頁,如此蜘蛛藉助一個節點之後,就可以沿著幾點連線繼續爬行抵達下個節點。也就說藉助一個網頁繼續抓取。
爬蟲首要便是要抓取終端伺服器的網頁,也就是抓取到網頁的源代碼,源代碼包中抓取到實用的信息,就將實用的源代碼獲取,提取每日任務中所需的信息。
ip將抓取到實用的信息回到到客戶端存儲,隨後再返回去,不斷頻繁的訪問獲得信息直到完成任務。因此ip便是負責帶著每日任務尋找有價值的信息,隨後將抓取到的有價值的信息數據負責帶回(傳輸)到客戶端,直到完成任務。
⑵ eMule有什麼優點
eMule是一個開放的P2P檔案分享軟體,基於eDonkey的網路協議。eMule這個名稱來源於一個動物——騾,所以中文中也稱作電騾或騾子等。
eMule起源
在2002年05月13日一個叫做Merkur的人,他不滿意當時的eDonkey 2000客戶端並且堅信自己能做出更出色的P2P軟體,於是便著手開發。他凝聚了一批原本在其他領域有出色發揮的程序員在他的周圍,eMule工程就此誕生。他的目標是將eDonkey的優點及精華保留下來,並加入新的功能以及使圖形界面變得更好。現在eMule的最新版本是0.47a。
現在eMule已是世界上最大並且最可靠的點對點文檔共享的客戶端軟體。感謝開放源代碼的政策,使許多開發人員能夠對這個工程有所貢獻,從而使發布新版本顯得更有效率。
eMule特色
客戶端使用多個途徑搜索下載的資源,ED2K、來源交換、Kad共同組成一個可靠的網路結構。
eMule的排隊機制和上傳積分系統有助於激勵人們共享並上傳給他人資源,以使自己更容易、更快速地下載自己想要的資源。
eMule是完全免費的。也完全沒有任何的廣告軟體。他們這么做是為了樂趣及知識,而不是為了金錢。
每個下載的文件都會自動檢查是否損壞以確保文件的正確性。(FTP卻不能保證精確復制)
智能損壞控制有助於快速修復損壞的部分。
自動優先權及來源管理系統允許您一次下載許多個資源而無須監視它們。
預覽功能允許您在下載完成之前查看您的視頻文件。
eMule的Web服務特性和Web伺服器允許您快速得從網路存取資料。
能在下載時間里類別以組織和管理文件。
尋找您想要的資源,eMule提供了一個大范圍的搜索方式,包含了:伺服器搜索(本地和全球)、基於Web搜索(Jigle和Filedonkey)及Kad網路(仍在測試)。
eMule還允許您使用非常復雜的布林搜索使搜索更為靈活。
使用信息及好友系統,您能傳送訊息到其他的客戶端並可將他們加為您的好友。有好友上線的話,你就能在您的好友列表中看到他(她)。
使用內建的IRC客戶端, 您能和全世界其他的共享者聊天。
在官方版基礎上,有各種各樣的修改版本(Mod),提供了各種不同的附加功能。並且這些Mod也都是開放源代碼的,這使得eMule的發展突飛猛進。
eMule與其他P2P軟體相比的優點及特色
客戶端使用多個途徑搜索下載的資料源,ED2K、來源交換、Kad共同組成一個可靠的網路結構。
在eMule v0.42及後續版本中,可以使用Kad。
eMule的排隊機制和上傳積分系統有助於激勵人們共享並上傳給他人資源,以使自己更容易、更快速地下載自己想要的資源。
eMule是完全免費的。官方版eMule也完全沒有任何的廣告軟體。
每個下載的文件都會自動檢查是否損壞以確保文件的正確性。(FTP卻不能保證精確復制)
智慧損壞控制有助於快速修復損壞的部分。
自動優先權及來源管理系統允許一次下載許多個資源而無須監視它們。
預覽功能可在下載完成之前查看影片。
eMule的Web服務特性和Web伺服器允許使用者快速得從網路存取資料。
能在下載時間里類別以組織和管理文件。
尋找想要的資源,eMule提供了一個大范圍的搜索方式,包含了:伺服器搜索(本地和全球)、基於Web搜索(Jigle 和 Filedonkey)及Kad網路(仍在測試)。
允許使用非常復雜的布林搜索使搜索更為靈活。
使用信息及好友系統,能傳送訊息到其他的客戶端並可將他們加為好友。有好友上線的話,就能在好友列表中看到他(她)。
使用內建的IRC客戶端, 使用者能和全世界的共享者聊天。
1)P2P到底是什麼?
Peer-to-peer的縮寫,指的是點對點的意思,最早是在美國由 18歲的Shawn Fanning開發出一個叫Napster的軟體時,引入得概念 ,它不僅僅是一種軟體架構,也是一種社會模式的體現,網路上流行的P2P軟體的架構手段主要有兩種:集中式和分布式。
集中式:便是利用伺服器作為媒介使各個分散的節點(用戶)能互相聯系,生成各種服務響應。
分布式:每個節點即做伺服器又做客戶端,這種方式非常靈活,一個孤立的節點只要連上另一個節點便可以進行傳輸。
Napster可以說是第一代p2p軟體。後來由於Napster陷入訴訟危機(相關版權問題),便出現了Gnutella,它吸取了Napster的失敗教訓,將P2P的理念更推進一步:它不存在中樞目錄伺服器,用戶只要安裝了該軟體,立即變成一台能夠提供完整目錄和文件服務的伺服器,並會自動搜尋其它同類伺服器,從而聯成一台由無數PC組成的網路超級伺服器。傳統網路的Server和Client在它的面前被重新定義。Gnutella作為第二代p2p軟體,他們可以說是最早的p2p技術。然後FastTrack (即Kazaa 的底層技術)迅速掘起取代其地位。成為p2p老大。
2)emule到底是什麼?
隨著二代技術的普及,又一個的問題誕生了,自私的人們在利用P2P軟體的時候大多隻願"獲取」,而不願"共享」,P2P的發展遇到了意識的發展瓶頸。不過,一頭"騾」很快改變了游戲規則,它就是後來鼎鼎大名的 eDonkey。這標志著第三代p2p技術的興起,eDonkey採用了以"分散式雜湊表」(distributed hash tables )為訴求的Neonet技術,改變了P2P網路上的搜索方式,理論上可以更有效率的搜索更多的電腦,以及更容易找出少見的文件。這種技術已經使eDonkey基本快要追上了P2P服務龍頭業界的另一個老大Kazaa了. eDonkey由Jed McCaleb在2000年創立。他最重要的是可以同時從許多人那裡下載同一個文件,並且採用了"多源文件傳輸協議」(MFTP,the Multisource FileTransfer Protocol)。電騾的索引伺服器並不集中在一起的,而是各人私有的,遍布全世界,每一個人都可以運行電騾伺服器,同時共享的文件索引為被稱為"ed2k-quicklink」的連接,文件前綴"ED2K://」。同時,在協議中,定義了一系列傳輸、壓縮和打包的標准,甚至還定義了一套積分的標准,你上傳的數據量越大,積分越高,下載的速度也越快。而且每個文件都有有md5-hash的超級鏈接標示,這使得該文件獨一無二,並且在整個網路上都可以追蹤得到。EDonkey可以通過檢索分段從多個用戶那裡下載文件,最終將下載的文件片斷拼成整個文件。而且,只要你得到了一個文件片斷,系統就會把這個片斷共享給大家,盡管通過選項的設置你可以對上傳速度做一些控制,但你無法關閉它。
在eDonkey出現後,其改良品種eMule(電騾)也出現了。可以說emule是eDonkey的升級版,是eDonkey的一個Mod,就象osp就是quake3的mod一樣,它的獨到之處在於開源,它的基本原理和運作方式,也都是基於eDonkey, eMule基於eDonkey網路協議,因此能夠直接登錄eDonkey的各類伺服器。eMule同時也提供了很多eDonkey所沒有的功能,比如可以自動搜索網路中的伺服器、保留搜索結果、與連接用戶交換伺服器地址和文件、優先下載便於預覽的文件頭尾部分等等,這些都使得eMule使用起來更加便利,也讓它得到了電騾的美譽。
總之,他們繼承了第二代P2P無中心、純分布式系統的特點,但他們它不再是簡單的點到點通信,而是更高效、更復雜的網路通信;再加上eDonkey和eMule引入的強制共享機制,在一定程度上避免了前幾代P2P純個人伺服器管理帶來的隨意性和低效率。
3)emule的下載原理?
當你在搜索列表中選取了你要的文件並開始下載後,emule會記錄下這個文件的大小,文件名以及另一個叫做hash的特殊值。會向所有添加的伺服器發出請求,要求得到有相同hash值的文件。而伺服器則返回持有這個文件的用戶信息。這樣我們的客戶端就可以直接的和擁有那個文件的用戶溝通,看看是不是可以從他那裡下載所需的文件。它最棒的部分就在於:你不是只在一個用戶那裡下載文件,而是同時從許多個用戶那裡下載文件。如果另一個用戶僅僅只有你要的文件的一個小小片斷,他也會自動地把這個片斷分享個大家,而你就可以從這個用戶的機器上下載這個片斷。當然你也是一樣。只要你得到了一個文件片斷,系統就會把這個片斷共享給大家。在查找到下載源(其他客戶端)後,下載就是客戶端和客戶端通過點對點(P2P)進行直接對話了。期間沒有數據流通過伺服器。
4)emule是如何工作的?
emule建立於多點文件傳輸協議之上。一個emule網路由伺服器端和客戶端兩部分組成。伺服器端是客戶端連接的、為了搜索和查找可以下載用戶的橋梁。伺服器列表像電話本一樣排列,客戶通過瀏覽它而獲取他需要的文件所有者的客戶端信息。在download過程中,沒有下載文件通過伺服器端。
5)emule是如何搜索的?
每一個客戶端連接到一個伺服器作為他的主伺服器。在連接時,由客戶端告訴主伺服器他share了那些文件,以及IP地址等其他信息。所以每一個伺服器會記錄所有登陸到他伺服器上的以上信息。在本伺服器搜索時,它會通過匹配記錄的已知以上信息把查找結果反饋給搜索的客戶端列表。當你使用擴展搜索(extend search)時,你的搜索請求和應答結果通過發送限制帶寬的UDP包連接到客戶端本身的伺服器列表(server.met)對應的某一個ip地址的伺服器。
6)emule是如何下載的?
當客戶端選擇了一個文件下載時,它首先收集一個擁有該文檔的客戶端的列表。它會先行查詢主伺服器所有登陸用戶他們是否擁有該文件。然後再連接和查選其他伺服器的登陸用戶所擁有該文件的客戶端列表。一旦它找到擁有該文件的其他客戶端,它將請求每個客戶端發送這個文件的不同片。直至最後文件由這個不同的片組裝成一個完整的文件。 在進行pause/resume的時候,我們選擇的下載列表已經獲取,它pause的僅僅是客戶端和客戶端之間的TCP連接然後恢復TCP連接。這個過程只有再resume時通過客戶端向伺服器端發送22個位元組後即可。佔用的僅僅是22個位元組的網路流量。在pause是甚至不通過你登陸的伺服器進行,也無須你登陸的主伺服器進行任何干預和操作。所以說,它並未佔用主服務什麼資源,只是在你已經和主伺服器連接的通道上發送22個位元組而已。
7)emule有什麼優點?
不需要伺服器來存放共享文件,節省了伺服器架設、海量硬碟、網路帶寬。 每個用戶端節點都同時是文件下載者和提供者。實際上,在你正在下載但還沒當完整個文件時,你已經可以把你已下載的部分共享給別人了! 因為emule同時從很多文件提供者那裡下載所需的文件最後再拼成整個文件的。加入的人越多,下載速度越快,資源越豐富。 共享方便,每個人在自已的emule里指定一個share目錄就可以把自己的文件共享給網路中的其它人了。不必再辛苦地上傳到伺服器上了。
以上就是關於emule的一些基礎知識,希望大家看完之後,能對emule的原理,有一個本質的認識。
下面我再來說說一些很困擾,很迷惑人的問題。
1)id問題
朋友們最關心的就是這個問題,id是什麼?id其實沒有什麼用,id就是在emule傳輸裡面,作為地址作用的一個東西,起到定址和定址作用,它直接和我們ip掛鉤,是由emule根據我們的ip地址,通過演算法得到的一組數字。所以adsl用戶經常會說,為什麼我的id變了?當然要變,因為你每次上網撥號所取得的ip地址都不相同,所以id當然也要隨之變化,一句話;ip不變id就不變,ip變了id就變化。
關於高id和低id,目前好多朋友也存在一個誤區,認為同一個ip地址,只能而且最多隻能擁有一個高id,其實這是不對的。一個公網ip地址,可以同時取得2個以上的高id,這一點我要在這里強調一下,比如,adsl用戶,如果你本身是高id,那麼你可以同時打開第二個emule兩個同時運行,但是彼此的emule埠一定不要相同,這樣你會發現兩個都是高id,同一個ip地址。同樣對於埠映射,同一個ip地址,也可以同時取得兩個以上高id,同樣埠不要相同。
對於低id用戶,還存在一個誤區,那就是認為只要映射了,就能變成高id,這一點我要說明一下,什麼叫高id,它是一個9位以上的id數字,它代表了你的ip地址是公網獨立的ip,也就是說只有前提你能夠擁有公網獨立的ip地址,你才能獲得高id,埠映射的原理是把你的內網地址和埠,通過地址轉換投影到公網干線上,使你作為一個公網節點,從而變成高id。那麼這里就存在一個網路拓撲的問題,有些低id用戶,不是處在公網干線的一級子網內,而是子網的下一級子網,甚至下好幾級子網,拓撲的結構是層層拓撲,那麼這部分用戶,無論如何也無法獲得高id,因為你做了映射只不過是成了上一級子網的節點,但是仍然還是內網,只不過映射了一層,你上面還有好幾層,所以要正確看待映射的問題。目前,國內除了電信和網通,有好多二級運營商玩的就是這個路子,他們或者層層拓撲,或者只保留部分公網ip地址,作為機動分配,這樣你運氣好一撥號能得到一個公網ip,你運氣不好就是內網,沒有辦法。
3)kad問題
好多朋友對這個東西始終不太明白,我說一下,kad和我們目前的ed2k不一樣,我們目前的ed2k要通過伺服器進行中轉,我們都要連到服務上才能進行傳輸,而kad則是無伺服器工作模式,它的傳輸可以獨立進行,完全不需要伺服器參與,我們只需要打開kad就可以不再需要伺服器了,所以說kad是屬於試驗階段,應該說他的前景最為光明,應該是p2p的未來,所以建議朋友們多多打開,對於找源很有幫助,特別是對於低id而言,vkad就是vnn+kad的模式。
4)伺服器問題
這個問題論壇已經說了很多了,我主要說一些大家容易誤會的地方,好多朋友經常問到,怎麼我的伺服器少了,或者是消失了,或者開機提示列表文件丟失,這里大家要注意在emule>選項>伺服器設置裡面 啟用智能lowid檢測這一項最好不要選 啟動自動更新伺服器列表也不要選 把連接到其它伺服器時自動更新選上,這樣你可以在伺服器切換的時候,自動更新伺服器列表 而不用添加什麼列表的url網址之類的東西,另外對於常用的伺服器,最好把他的狀態選擇為靜態伺服器,這樣他就不會消失了,其實我們伺服器列表有300多個伺服器,能夠用上的就那麼幾個,大家可以把他們設置成高級,靜態,另外還要說一點,選擇伺服器的時候選擇ping值小的 人數多的 文件多的 這個文件數什麼意思,是連接到這個伺服器的所有用戶的共享文件總數,要注意伺服器上沒有任何文件,另外大家注意一下伺服器列表裡面,每個伺服器還有:軟性文件限制 硬性文件限制, 這個是什麼意思?他代表了伺服器接受你的共享文件 任務列表文件的大小限制,如果你要是超過了這個限制,就會被伺服器拒絕,舉個例子,如果這個值顯示的是1k,那麼你的共享文件數最好少於1000個,目前來看大部分都是1k。
其實對於伺服器端,有好多願意研究的朋友,很感興趣。其實他就是edonkey的伺服器,二者目前列表都一樣,所以大家想要自己架設em伺服器,可以上edonkey網站,下載伺服器端的程序,我看了一下這個程序不大,而且也很簡單,有興趣的朋友們可以自己分析一下。
5)web伺服器問題
大家都看了在emule>伺服器>我的信息 最下面總是有一個web伺服器的東西,這個是什麼?我說一下 通常情況下我們這個禁用是正常的,Web伺服器的作用是提供了遠程訪問eMule的功能,我們可以先在emule端配置一些相關參數,然後可以實現遠程利用ie來對emule進行控制,當然了需要我們emule端要有獨立的訪問地址,遠程式控制制emule可以實現emule的大部分功能,但是不是全部功能,還是有一些限制。另外對於emule端的web設置,懂行的朋友還可以自己進行編程,很有交互性,一般來講,我們什麼時候能夠用上它呢?比如我們在公司開了emule,但是還想下班後繼續在家裡操作公司的emule,那麼我們就可以使用這個功能,如此還有許多場合和環境特別利於web功能的使用,但是要注意隨之帶來的有關網路安全性問題也很重要。對於這個功能的使用,要是詳細寫出來的話,要很長需要專門的一個主題說明,由於篇幅限制,我在這里先簡單說一下,如果朋友們都比較感興趣,我考慮單獨寫一個主題詳細說明具體設置和用法。不再贅述。
6)emule日誌問題
其實這個問題沒什麼好說的,日誌就是記載了emule的運行記錄,我要強調的是好多朋友不懂得利用它,其實大部分emule遇到問題的時候,我們如果仔細注意日誌記錄,都會自己找到問題原因所在,如果你不懂你可以把它復制下來,發到網上,希望各位朋友以後多多注意emule的日誌記錄,遇到問題,多半能都自己解決。
7)任務下載問題
對於這個問題,我想說得是大家要學會使用給任務分優先順序來控制下載順序,經常有許多朋友抱怨,為什麼任務結束一個,開始下一個的時候是隨機開始,怎麼能實現自動控制?這里我們就可以手動設置任務列表裡面任務的優先順序,右鍵就可以看到,把不同任務的優先順序設置成高 中 低 這樣emule在完成一個的時候自然按照優先順序去選擇下一個該是誰,而不會隨機開始了,另外在選項裡面也可以設置一下,新建任務為停止模式,或者自動開始下一個停止文件。
8)搜索問題
其實要是大家都學會了利用該功能,就會找到好多意想不到的東西,好多朋友平時很少用這個功能,其實p2p引以為自豪的就是他的搜索功能,建議大家以後多多自己搜索,搜索的時候要注意,每頁都有200條的限制,所以要想看更多的可以點擊旁邊的"更多」,這樣可以顯示下一個200條,可不要以為就只有第一頁的200條記錄啊!對於搜索顏色問題我說明一下:
紅色:代表你的任務列表裡面已經有的文件 或者 你已經下載完成正在共享的文件
藍色:普及程度較高源比較多的文件
黑色:你從來都沒有下載過的文件
9)共享文件問題
這個我說明一個問題,emule 裡面規定共享的單個文件,注意是"單個」文件不可以超過4g,如果超過了,則不可以進行hash,所以大家注意一下。
10)emule消息問題
經常有朋友會受到You Was Banned!!! Banreason: You use a Leecher Mod
或者Defcon Old Leecherdetection之類的消息,這是什麼意思?
有些朋友以為是有人要聊天,發送過來的消息,其實誤會了,這是自動發送的信息,它的意思是你用的版本是吸血的版本。你已經被ban。對於這個消息,大家可以不用理會,用emule消息過濾,把它過濾掉就可以了,為什麼會如此呢?這個要是說起來也話長了,頗有點傳奇色彩。我簡單說說,部分mod版本呢,由於加分設置不同,逐漸分成不同的派別,這樣逐漸形成了一些小圈子,後來搞出來一個所謂吸血的東西,只下載不上傳,或是該版本群體上傳遠遠小於下載,等等這裡面有好多淵源,後來官方公開封禁了一些,再後來自然被封的不服,然後就是妖魔和反妖魔大家互相封禁,互相職責,後來斗爭擴大化,導致其他版本也跟著遭殃,我們就是屬於被誤傷的,現在這種爭斗仍然在繼續,而且波及越來越廣,這就是我對這個消息的原因的簡單解釋,好多內幕的東西,說起來挺多,不多說了。
11)代理問題
這里我要說明一點,好多朋友使用代理運行emule,比如一些公司內網的朋友,你們在尋找代理的時候,盡量使用sock5的代理,當然sock4和http也可以,但是要注意好多http代理本身不支持udp協議,所以導致了emule無法運行,大家要注意,選擇支持udp協議的代理。而且多找幾個,留作備用。
12)統計信息問題
這個問題,我要說兩點
(1)上傳:下載比例問題 之前好多朋友對這個有很多誤會,這里我要說明這個比例大於1說明你的貢獻大於索取,等於1,說明你的貢獻和索取一致。小於1,則說明了你是一個索取的人,對p2p的貢獻為負。大家一定要注意誰比誰,哪個是分母,哪個是分子,那麼這有什麼用呢?要注意p2p是一個講究奉獻,講究積分的東西,你的上傳多,你的下載快,這個比例也說明了使用者素質問題,另外對於這個比例,我們也有一些獎懲措施,比如 上傳:下載大於2,也就是說明了你的上傳量是下載量的2倍,這個時候你在排隊的時候,就可以享受優先排隊待遇,這個比值越大越好,不存在什麼限制,越大說明你的上傳量越多,說明你的積分越多,你的貢獻越多,當然你排隊的時間就越少。如果這個比值小於1,而且越來越小,那麼同樣你的速度也會越來越慢,這個你怨不了誰。
(2)速度大小的問題 好多朋友往往只關注了那個最大速度,但是實際上那個數值沒有什麼意義,他只是一個曲線峰值,往往一閃即逝,或者最多持續幾秒,我們要關注的是我們的平均速度,這個二元值包含了時間的因素,所以他才能說明我們emule的整體速度大小。
13)積分問題
積分不是你對所有人的積分,只是在你機器下載的人他們的EM對你的積分,比如你開放的帶寬大,小A在你那裡下的很舒服,你就在小A那裡的分數高。同樣,小A那裡也有一群人在下他的資料其中也有你,由於你開放的帶寬多小A在你那裡下的多,你在小A那裡的積分就高,你就比其他在小A那裡下載東西的人有優先下載小A資料的許可權(小A可以設置高、普通這些的,設置高的時候就只有積分高的人優先下了)。
自己是無法看自己的積分的,因為這個積分不是永恆的,只是暫時針對一個文件的。
14)好友通道問題
我說明一點,加為好友開通通道,起到的作用只是,可以縮短你的排隊時間,使你的信用積分突然變大,此外沒有任何作用,他和速度沒有本質的聯系。
15)tag問題
好多朋友到現在也不明白為什麼要有個[chn]有個[VeryCD],這個有什麼用,其實這個名稱是任意的,甚至重名都沒有問題,因為p2p世界裡面判斷你的標志是userhash,而不是用戶名,用戶名你隨便改,一天一個新名字也不會影響你的積分,tag的作用是為了讓一些伺服器判斷,從而可以連接該伺服器,有的伺服器就是規定了如果你不加[*****]就是不讓你連接,所以就加上他連接方便點,另外有的mod可以實現對有相關[****]進行加分,比如我們vc版本對有[chn]的朋友就有固定的加分設置,它可以使所有有這個[chn]的朋友積分比沒有這個的人多,從而達到中國人優先下載優先上傳的問題,當然了這個問題,現在在世界范圍內,仍是一個爭論的話題,到底是否應該加分,大家也是眾說紛紜。其實,懂行的朋友可以自己設置加分,可以隨心所欲給任何[*****]加分減分,也可以給任意userhash加分減分,以達到優先上傳優先下載的目的,甚至可以達到任意ban人的目的。當然了,這個問題不合適公開討論,有違背p2p的根本,這里點到為止。
16)對於如何隱藏emule頭像的問題
對於一些在公司工作的朋友,這一直是一個困擾很久的問題,如何還能下載,還不讓老闆發現。這里我說兩個解決方案
(1)使用第三方軟體解決 可以使用SysTrayX軟體,這個軟體,國內大型軟體站都有下載,它是一個管理系統托盤的軟體,非常簡單,具體使用方法,大家一看就明白了,他可以做到隱藏emule頭像的問題,
(2)使用系統服務解決 我們知道在2000以上系統中都有srvany服務,藉助這個服務,也可以實現隱藏頭像 不藉助第三方軟體 同樣server系統可以用終端服務來實現隱藏頭像,另外還可以藉助instsrv服務來實現隱藏頭像,原理和前面一樣,其實就是一個東西,這種方法原理,常見於一些黑客網站,其實有些木馬軟體,或者後台軟體,就是用的這個方案。大家有興趣可以上一些黑客網站研究研究。
17)關於emule和bt的相關問題
好多朋友都在使用bt的同時,也在使用emule,我這里說一點,對於bt文件,如果我們下到了一半,沒有種了,或者非常慢,我們可以把它導入emule下載,用dmTorrent2Par和Jcd2Met或者 Edonkeydoctor或者MetFileRegenerator,都可以實現該功能,很簡單,另外emule的文件同樣也可以導入bt進行下載,二者可以相互轉換。為什麼要說這一點呢,是要提醒大家,其實有好多emule的輔助工具,都可以幫我們更好的使用emule,它不是孤立的,只不過國內興起的比較晚,目前來看,只要edonkey能用的相關軟體,emule都能使用。比如,關於重建met的edonkeydoctor軟體,就可以使一些下載了很多的錯誤文件,直接進行修復而不是像以前那樣把辛苦下到的刪掉。是我們遇到問題需要關閉的時候,不用再擔心要刪除文件了
⑶ 如何設置代理IP 什麼是DNS伺服器地址
代理伺服器的設置方法
http://www.xdl8.home.sunbo.net/
--------------------------------------------------------------------------------
ADSL代理伺服器的設置方法
1、在桌面上用滑鼠右鍵單擊『Internet Explorer』圖標,並選擇『屬性』。
2、單擊『連接』標簽。
3、選中使用的連接,如:『我的連接』,單擊『設置』按鈕。
4、單擊『滑鼠左鍵』,選擇『使用代理伺服器』的選項,單擊『確定』按鈕。
5、單擊『確定』按鈕。
LAN區域網用戶代理伺服器設置方法
1、在桌面上用滑鼠右鍵單擊『Internet Explorer圖標』,並選擇『屬性』。
2、單擊『連接』標簽。
3、單擊『區域網設置』按鈕。
4、單擊『滑鼠左鍵』,去掉『使用代理伺服器』的選項,單擊『確定』按鈕。
5、單擊『確定』按鈕。
Modem撥號代理伺服器設置方法
Internet Exploer 4.01
IE4.01:菜單欄「查看」->下拉菜單「Internet選項」->選項卡「連接」->在「代理伺服器」一欄選中「通過代理伺服器訪問Internet」,輸入代理伺服器地址和埠號。->確定
Internet Exploer 5.0以上版本
IE 5.0:菜單欄「工具」->下拉菜單「Internet選項」->選項卡「連接」->在「撥號設置」中選中您目前使用的連接,然後點擊右側的「設置」->在中間的「代理伺服器」欄選中「使用代理伺服器」->在「地址」和「埠」欄輸入代理伺服器->確定->確定。
微軟IE設置代理
(一)菜單選擇「工具」,選「Internet選項(O)」。
(二)選「連接」,單擊「設置(S)...」
(三)在「代理伺服器」組,把「對此連接使用代理伺服器」打鉤,然後填上HTTP的地址和埠。
(四)如果有更齊全的代理數據,如SOCK及FTP等,可單擊「高級(C)...」,分別填入對應的代理數據。(這項一般不填)
(五)單擊「確定」就可以了。
騰訊TT設置代理
(一)主菜單選擇「工具」,選「WWW代理」,選「代理設置...」
(二)點擊「新增」,然後在「地址」那填上代理的IP以及埠,單擊「確定」,代理就可以生效。
(三)當使用代理的時候,菜單上代理名稱前面有「鉤」,當向要取消代理或者再次使用代理,點擊菜單就行,很方便。
QQ設置代理
● QQ設置SOCK5代理
(一)打開參數設置。
點擊QQ的「QQ2000」,選擇「系統菜單」。
(二)輸入代理參數。
選擇「網路參數」,在騰訊的伺服器地址填上絕對IP(「***.***.***.***形式的」),下面有騰訊伺服器域名轉換絕對IP的表,隨便選擇一個就行。「使用SOCK5代理伺服器」打鉤,填上代理伺服器的地址和埠參數。把用戶名和密碼輸入框清空(假如是使用有密碼的代理,則填上代理的用戶名和密碼)。
sz.tencent.com => 61.144.238.145
sz2.tencent.com => 61.144.238.146
sz3.tencent.com => 202.104.129.251
sz4.tencent.com => 202.104.129.254
sz5.tencent.com => 61.141.194.203
sz6.tencent.com => 202.104.129.252
sz7.tencent.com => 202.104.129.253
(三)測試代理參數。
點擊測試。假如出現「代理伺服器正常」,則這個代理是可用的。假如出現「無法連接代理伺服器」,則說明這個代理不能使用,重新輸入另外的代理參數,重新測試。
(四)使代理生效。
要使剛剛輸入的參數生效,必須下線一次,再上線,這樣才能改變QQ的傳輸狀態,使代理生效。如果不能上線,請多換幾個代理試試。
● QQ設置HTTP代理
(一)打開參數設置。
點擊QQ的「QQ2000」,選擇「系統菜單」。
(二)設置代理參數
選擇「會員功能」,把「使用HTTP協議登陸」打鉤,選擇「通過HTTP代理」,填入HTTP代理的IP以及埠參數,清空用戶名稱和密碼。
(三)測試代理參數。
按「測試」,測試該HTTP代理能不能用,出現「測試成功,請返回」,則該代理能用。否則表示該代理不能用,換別的代理。
(四)使代理生效。
要使剛剛輸入的參數生效,必須下線一次,再上線,這樣才能改變QQ的傳輸狀態,使代理生效。如果不能上線,請多換幾個代理試試。
ICQ設置代理
使用的是ICQ2000中文版。ICQ能使用的代理比較多,可以用HTTP、SOCK4、SOCK5等。在ICQ中,代理也稱作防火牆。
(一)打開參數設置。
點擊「主菜單」,選擇「參數選擇」。
(二)輸入代理參數。
選「連接」,在「代理設置」,選擇「使用防火牆」和「使用代理伺服器」,在「代理伺服器」選擇代理的類型,可以是SOCK4、SOCK5、HTTP等,但一定要和你准備的代理的類型是一 致的。
在「防火牆」組,選擇代理的類型,和輸入代理的IP及埠的參數
(四)使代理生效。
跟QQ一樣,要使得代理生效,必須先下線再上線,假如不能上線就是代理不行,換一個代理重新設置。
UC設置代理
(一)打開參數設置。
點擊「UC」,選擇「系統參數」。
(二)輸入代理參數。
選擇「網路」,選「區域網」,「使用SOCK5代理」打鉤,填上代理IP和埠的參數,清空用戶名和密碼。(假如是使用有密碼的代理,則填上代理的用戶名和密碼)。
(三)測試代理參數。
點擊測試。假如出現「代理伺服器正常」,則這個代理是可用的。假如出現「無法連接代理伺服器」,則說明這個代理不能使用,重新輸入另外的代理參數,重新測試 。
(四)使代理生效。
要使剛剛輸入的參數生效,必須下線一次,再上線,這樣才能改變UC的傳輸狀態,使代理生效。如果不能上線,請多換幾個代理試試。
MSN設置代理
(一)打開參數設置。
點擊「MSN」,選擇「選項(O)...」。
(二)輸入代理參數。
「我使用的代理伺服器」打鉤,選「SOCK5」,填上代理IP和埠的參數,清空用戶名和密碼。(假如是使用有密碼的代理,則填上代理的用戶名和密碼)。 當然還可以選擇HTTP或SOCK4代理,填上相應的參數就行。
(四)使代理生效。
按「確定」就行了。
2003版QQ設置代理
2003版QQ,普通用戶除了可以使用SOCK5代理之外,還可以使用HTTP代理,會員用戶可以使用VIP的HTTP代理。
(一)打開參數設置
點擊QQ的「QQ2003」,選擇「系統菜單」。
(二)設置代理參數
選擇「網路設置」。上網類型要設置為「區域網」。如果使用SOCK5代理的就把「SOCK5代理設置」打鉤,填入代理伺服器的IP和埠的參數。假如使用HTTP代理的就選「HTTP代理設置」,填入參數 。用戶名稱和密碼一般留空,不用填。
(三)測試代理參數。
按「測試」,試試該代理能否成功連接。假如出現「不能連接代理伺服器」的就換別的代理試試。
(四)使代理生效。
要使剛剛輸入的參數生效,必須下線一次,再上線,這樣才能改變QQ的傳輸狀態,使代理生效。如果不能上線,請多換幾個代理試試。
FTP軟體中如何使用代理上傳
在FTP軟體中我們可以使用SOCKS4/SOCKS5代理伺服器,常見的FTP工具中的代理設置方法如下:
1.FlashFXP3.0以前版本中設置代理:菜單欄「選項」——》參數設置——》代理和防火牆,然後在「代理伺服器」項中選擇代理類型,填寫代理
2.FlashFXP3.0以後版本中設置代理:菜單欄「選項」——》參數設置——》連接,然後在「代理伺服器」項中選擇代理類型,填寫代理
3.CuteFTP XP 5.0.2 中文版中設置代理:菜單欄「編輯」——》設置——》連接——》SOCKS--》選擇代理類型,如SOCKS4或者SOCKS5,並填寫代理
4.LeapFtp中設置代理:菜單欄「選項」——》參數設置——》常規——》代理,將「使用代理」前面的方框鉤上,然後填寫代理,並將SOCKS防火牆鉤上。
MyIE2中設置代理伺服器
MyIE2中設置代理伺服器:菜單欄「選項」——》「代理伺服器」——》「代理設置」——》在輸入框中輸入標准格式的代理伺服器,如XXX.XXX.XXX.XXX:埠,然後「確定」並退出,繼續,菜單欄「選項」——》「代理伺服器」——》然後選擇剛才輸入的代理伺服器,最後「確定」即可。
NETSCAPE 4.x的代理設置方法
選擇主菜單上的「Edit」→「Preferences」→「advanced」→「proxies」→「Manual proxy configuration」→「View」,將你找到的代理伺服器地址和埠填入,按「OK」完成。
.
Opera的代理設置方法
選擇主菜單上的「設置」→「Proxy選項」,將你找到的代理伺服器地址和埠填入即可。
網路螞蟻的代理設置方法
在主菜單上選擇「選項設置」→「參數設置」→「代理」→「添加」,然後將可用的代理伺服器地址根據類型填入,如該伺服器需要輸入用戶名和密碼,選中代理伺服器選項下的「認證」,填入即可。大多數下載軟體的代理設置與網路螞蟻相似,如FlashGet。
DNS伺服器
到現在為止我們通過DHCP給客戶端配置的DNS伺服器仍然是直接用電信公司給的DNS,一般來說這已經可以了。但有如下兩種情況可以讓我們有足夠的理由設置一個自己的DNS伺服器:
l 想給內部網的伺服器做本地的名稱解析,方便訪問內部伺服器;
l 和我一樣不幸在使用電信公司提供給的幾個不太穩定的DNS伺服器,並且維護著一個比較大的網路(終端遍布在N區N縣),總不能在某個DNS宕掉後通知各用戶挨個修改吧?(不要試圖在Windows里設置多個DNS來解決這個問題,你試試就知道了)所以有必要設置一個可以轉發DNS查詢請求的本地DNS,這樣對內部用戶來說,只要設置好DNS指向內部DNS地址就可以了,剩下的事情由管理員根據情況修改這個本地DNS把解析請求轉發到最佳的公網DNS上。
在眾多 Internet 伺服器當中DNS服務是所有服務的基礎,它最主要的職責之一是完成從主機域名到IP地址的映射關系的查詢。DNS系統管理域名採用一個樹狀結構,DNS樹的最上面是一個無名的root域,用「.」來表示。這個域只用來定位,並不包含任何信息,它由NIC來管理控制。Root下是分層的domain組成樹狀結構,一個DNS域(domain)是DNS樹狀結構中的一個分枝,domain中包含很多被授權管理的區域(zone),它是每個授權單位所管理的主機和IP地址的集合,我們平時說的域,實際上就是zone。比如,把www.silly.com這個URL地址拆解開:
.com domain
.silly.com zone
www 則是.silly.com區域內的一台具體的主機
Linux上最常用的DNS伺服器軟體是BIND(Berkeley Internet Name Domain),BIND在不斷的更新和完善,在http://www.isc.org/procts/BIND/上可以獲得它的最新源代碼和文檔。Red Hat Linux 7.3自帶的是bind9.2。
§§ 安裝bind軟體包
首先來安裝bind軟體包
[root@rh73 /mnt/cdrom/RedHat/RPMS]# rpm -ivh bind-9.2.0-8.i386.rpm
Preparing... ########################################### [100%]
1:bind ########################################### [100%]
§§ 了解bind的配置文件/etc/named.conf
為了將來維護的方便,我打算把內部的某些主機做本地的名稱解析,假定本地域為silly.com,我要把ns和firewall兩個主機名都指向接入伺服器的地址192.168.100.254:
ns.silly.com 192.168.100.254
firewall.silly.com 192.168.100.254
Linux上的DNS軟體包是bind,但服務進程的名字為named,首先來看一下/etc/named.conf,該文件是bind最主要的配置文件,這里定義了域名伺服器的類型,以及相應的資料庫文件所在目錄等內容。
該文件開始是options設定部分:
options {
directory "/var/named";
/*
* If there is a firewall between you and nameservers you want
* to talk to, you might need to uncomment the query-source
* directive below. Previous versions of BIND always asked
* questions using port 53, but BIND 8.1 uses an unprivileged
* port by default.
*/
// query-source address * port 53;
};
其中directory設定指出了named的數據資源文件存放在/var/named目錄下面。也就是說,named進程會在這個目錄里查找相關文件獲得DNS數據,然後在後面設置數據文件時,可以直接放在這個目錄里,不需要再使用絕對路徑。
接下來的一段文字是說如果你的DNS伺服器是bind 8.1之前的版本,並且和客戶端之間如果隔著防火牆的話,要將// query-source address * port 53;前面的//拿掉(去掉注釋)。我們使用的是9.2版的軟體,所以不需要更改這個設置。
//
// a caching only nameserver config
//
controls {
inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};
controls和文件最後的include "/etc/rndc.key";是bind 9.x版本的新功能,是有關DNS更新以及更新時加密處理的,暫時我們用不到,先不管它。
zone "." IN {
type hint;
file "named.ca";
};
這部分設置定義了DNS系統中的root區域「.」(root zone),其類型為hint。本地DNS無法解析到的非本地區域的內容,都會根據named.ca的里設定到root區域負責查詢。
zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
};
這兩段定義了本機名稱的DNS解析,第一個zone是localhost的解析,其類型為master,數據文件是/var/named/localhost.zone。第二個zone是本機區域的反向解析,即根據IP地址反查域名的數據。
include "/etc/rndc.key";
下面看看localhost.zone的內容:
[root@rh73 /var/named]# cat localhost.zone
$TTL 86400
$ORIGIN localhost.
@ 1D IN SOA @ root (
42 ; serial (d. adams)
3H ; refresh
15M ; retry
1W ; expiry
1D ) ; minimum
1D IN NS @
1D IN A 127.0.0.1
第一行是TTL(Time To Live)設定,以秒為單位,這里定義為86400秒,也就是一天。每一個DNS伺服器都有緩存非本地域名信息的功能,TTL指出了解析結果在緩存中保留的時間。平時你可能注意到了,第一次訪問某個站點可能需要較長的時間才能打開,接下來再訪問時就快一點,這就是DNS緩存功能的作用,它減少了第二次解析域名到IP地址的時間。
第二行是ORIGIN,指出下面的主機記錄屬於哪個域。在下面的@是它的替代符號。
第三行開始的@是ORIGIN的替代符,這里是指localhost。接下來的1D(1day,一天,也可以寫成秒為單位的數字,如86400)是TTL值,可以不指定,如果沒有指定,則參考前面設定的TTL值,如果前面也沒定義,則參考後面要介紹的minium tll的值。你可以單獨為每一個記錄設定TTL,只要將要設定的值放在「IN」之前就可以了。
IN後面的SOA(Start Of Authority)是指這一行記錄的類型,表示當前區域的授權記錄開始。每一個數據文件只能有一個SOA,不能重復,並且必須是所負責zone中的第一個記錄。
SOA後面指定了這個區域的授權主機和管理者信箱,這里分別是@(localhost.)和root@localhost。root如果寫全了應該是root.localhost,這里用「.」代替「@」。SOA的授權主機名稱必須在DNS系統中有一個A記錄。
接下來的 SOA 設定是被括在"( )"之間的 5 組數字,主要作為和 slave 伺服器同步 DNS 數據所使用的數據而設定的:
Serial:其格式通常是「年月日+修改次數」。當 slave 要進行數據同步的時候,會比較這個數值。如果發現在這里的數值比它那邊的數值「大」,就進行更新,否則忽略。serial不能超過 10 位數字。
Refresh:這里是是告訴 slave 隔多久進行一次數據同步(是否同步要看 Serial 的比較結果)。
Retry:slave 在進行更新失敗後,要隔多久再進行重試。
Expire:這是記錄逾期時間;當 slave 一直未能成功與 master 取得聯絡,那到這里就放棄retry,同時這里的數據也將標識為過期(expired)。
Minimum:這是最小預設 TTL 值,如果在前面沒有用「$TTL」來定義,就會以此值為准。
以上的數字都是以秒為單位,也可以用 H(小時)、D(天)、W(星期)來做單位,如:3H 和 259200 是一樣的。無論用什麼單位來設定,都要遵守下面的規則:
expire >= refresh + retry
expire >= 10 * retry
請注意:SOA 記錄中這對「()」符號中的左括弧「(」一定要和 SOA 寫在同一行!
最後兩行表示負責localhost.這個記錄的Name Server(NS)是localhost這台主機,localhost的IP地址(Address)是127.0.0.1。
named.local在/etc/named.conf里定為「0.0.0.127.in-addr.arpa」zone的反向解析數據文件,其內容如下:
[root@rh73 /var/named]# cat named.local
$TTL 86400
@ IN SOA localhost. root.localhost. (
1997022700 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS localhost.
1 IN PTR localhost.
來看最後一行「1 IN PTR localhost.」,這個記錄類型是PTR(Pointer),通常用在反向解析時,將IP指向主機名稱(和A記錄正好相反)。前面的設置中,我們知道127.0.0.1對應的主機名稱是localhost,反向查詢時,IP地址應該倒過來寫1.0.0.127.in-addr.arpa,由於這里的ORIGIN(@)是「0.0.127-in-addr.arpa.」,所以在寫PTR記錄時,只需要寫1,後面會自動補上0.0.127-in-addr.arpa.
§§ 實現本地域主機的解析
了解了上面的內容,我們來看看如何做本地的域名解析。我們要做的工作是:
在/etc/named.conf里添加兩個zone設置:
zone "silly.com" IN {
type master;
file "silly.zone";
allow-update { none; };
};
zone "100.168.192.in-addr.arpa" IN {
type master;
file "named.silly";
allow-update { none; };
};
設置/var/named/下的數據文件:
[root@rh73 /var/named]# cat silly.zone
$TTL 86400
$ORIGIN silly.com.
@ IN SOA ns.silly.com. root.silly.com. (
1997022700 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS ns.silly.com.
ns IN A 192.168.100.254
firewall IN CNAME ns
CNAME記錄用來定義一個主機域名的別名。當多個主機名指向同一個地址的時候,這個記錄類型可以方便設置。
設置反向解析zone:
[root@rh73 /var/named]# cat named.silly
$TTL 86400
@ IN SOA ns.silly.com. root.silly.com. (
1997022700 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS ns.silly.com.
254 IN PTR ns.silly.com.
§§ 轉發解析請求
為了提高我們這個DNS伺服器的查詢效率,我們會採取這樣的措施:把非本地域的解析請求轉發到我們的ISP提供的DNS。
這個功能是由forwarder選項來完成的。所謂的 forwarder,就是當某一台 NS 主機遇到非本機負責的 zone ( slave zone 也屬於本機負責的范圍) 查詢請求的時候,將不直接向 root zone 查詢而把請求轉交給指定的 forwarder (一台或多台) 主機代為查詢。如果你不了解 DNS 的查詢模式,那麼很難理解這個 forwarder 的意義和好處。
我們知道,當DNS伺服器接到客戶端主機的查詢請求時,首先會檢查這個查詢是否屬於本機管轄,否則將轉向 root zone 再逐級的查詢下去,最後再把查詢結果告訴客戶端。在這個過程之中,DNS伺服器還會將查詢到的結果存放到緩存中。只要緩存中的 TTL 沒過期,在下次遇到同樣查詢的時候,就可以直接將結果響應給客戶端,而無需再重復上次的查詢流程。如果DNS伺服器上指定了forwarder,那這個DNS發現緩存中沒有記錄時,將不向 root 查詢,而是向 forwarder 送出同樣的請求(轉發),然後等待查詢結果,即把逐級往下查詢這個耗費精力的動作,交給 forwarder 負責。但無論這個結果是自己直接查詢得來的,還是 forwarder 送回來的,DNS伺服器都會保存一份數據在緩存中。這樣,以後的相同查詢就快多了,這對於DNS所服務的 客戶端而言查詢效率會提高很多。
forwarder 機制的好處並非僅是上面所提到的效率提升,對於整個網路流量(尤其是對外的流量)也是有幫助的。比方說,你的內部網路需要 10 台 DNS 來提供服務,你只需在某一台能直接與外界溝通的計算機上架設 DNS 服務,然後將其它內部DNS的 forwarder 指向該伺服器就行了。這樣可能本來需要 10 次的 root 查詢,在 forwarders 的機制下,就只需 1 次而已。連同下層的往返查詢來計算的話,總體上所省下的對外查詢就更多了,再加上緩存帶來的好處,forwarder 所降低的 DNS 流量是非常顯著的。
事實上,在本章開始我們就提到如何集中管理內部區域網用戶域名解析問題,解決的方法就是:在本地DNS的 forwarder 設定為 ISP 的 DNS,區域網用戶把DNS都設置成本地DNS地址,在進行外部域名解析時,我們的DNS把解析請求轉發給ISP的DNS;又因為 ISP 上的 DNS 也有緩存的關系,所以這樣設置查詢還可以提高速度。
羅嗦了半天,現在看看如何配置。具體的設置很簡單:在named.conf的options部分添加這樣一行:
forwarders { 211.136.17.107; 202.102.152.3; };
如此設置完畢,那麼所有非本區域的查詢都會直接轉發到forwarders指定的DNS伺服器上去。
§§ 測試DNS
全部設置完後,把named進程重起一下,使設置生效:
[root@rh73 /var/named]# /etc/rc.d/init.d/named restart
現在測試一下剛才的設置是否正確:
設置Linux主機的DNS客戶端
[root@rh73 ~]# vi /etc/resolv.conf
其實在系統安裝設置網卡參數時我們已經設置了這個文件,其內容可能是:
nameserver 202.102.152.3
nameserver 202.102.134.68
現在把這兩行內容去掉(或注釋掉,在行首加「#」),然後寫上:
nameserver 192.168.100.254
即使用我們剛才設定的192.168.100.254這個DNS伺服器。
在Linux上我們可以用ping、nslookup、dig、host等命令來測試DNS是否工作正常,這些小工具都很簡單,以host為例:
[root@rh73 ~]# host ns.silly.com
ns.silly.com has address 192.168.100.254
[root@rh73 ~]# host firewall.silly.com
firewall.silly.com is an alias for ns.silly.com.
ns.sill
⑷ OkHttp源碼解析 (三)——代理和路由
初看OkHttp源碼,由於對Address、Route、Proxy、ProxySelector、RouteSelector等理解不夠,讀源碼非常吃力,看了幾遍依然對於尋找復用連接、創建連接、連接伺服器、連接代理伺服器、創建隧道連接等邏輯似懂非懂,本篇決定梳理一遍相關的概念及基本原理。
● HTTP/1.1(HTTPS)
● HTTP/2
● SPDY
一個http請求的流程(直連):
1、輸入url及參數;
2、如果是url是域名則解析ip地址,可能對應多個ip,如果沒有指定埠,則用默認埠,http請求用80;
3、創建socket,根據ip和埠連接伺服器(socket內部會完成3次TCP握手);
4、socket成功連接後,發送http報文數據。
一個https請求的流程(直連):
1、輸入url及參數;
2、如果是url是域名則解析ip地址,可能對應多個ip,如果沒有指定埠,則用默認埠,https請求用443;
3、創建socket,根據ip和埠連接伺服器(socket內部會完成3次TCP握手);
4、socket成功連接後進行TLS握手,可通過java標准款提供的SSLSocket完成;
5、握手成功後,發送https報文數據。
1、分類
● HTTP代理:普通代理、隧道代理
● SOCKS代理:SOCKS4、SOCKS5
2、HTTP代理分類及說明
普通代理
HTTP/1.1 協議的第一部分。其代理過程為:
● client 請求 proxy
● proxy 解析請求獲取 origin server 地址
● proxy 向 origin server 轉發請求
● proxy 接收 origin server 的響應
● proxy 向 client 轉發響應
其中proxy獲取目的伺服器地址的標准方法是解析 request line 里的 request-URL。因為proxy需要解析報文,因此普通代理無法適用於https,因為報文都是加密的。
隧道代理
通過 Web 代理伺服器用隧道方式傳輸基於 TCP 的協議。
請求包括兩個階段,一是連接(隧道)建立階段,二是數據通信(請求響應)階段,數據通信是基於 TCP packet ,代理伺服器不會對請求及響應的報文作任何的處理,都是原封不動的轉發,因此可以代理 HTTPS請求和響應。
代理過程為:
● client 向 proxy 發送 CONNET 請求(包含了 origin server 的地址)
● proxy 與 origin server 建立 TCP 連接
● proxy 向 client 發送響應
● client 向 proxy 發送請求,proxy 原封不動向 origin server 轉發請求,請求數據不做任何封裝,為原生 TCP packet.
3、SOCKS代理分類及說明
● SOCKS4:只支持TCP協議(即傳輸控制協議)
● SOCKS5: 既支持TCP協議又支持UDP協議(即用戶數據包協議),還支持各種身份驗證機制、伺服器端域名解析等。
SOCK4能做到的SOCKS5都可得到,但反過來卻不行,比如我們常用的聊天工具QQ在使用代理時就要求用SOCKS5代理,因為它需要使用UDP協議來傳輸數據。
有了上面的基礎知識,下面分析結合源碼分析OkHttp路由相關的邏輯。OkHttp用Address來描述與目標伺服器建立連接的配置信息,但請求輸入的可能是域名,一個域名可能對於多個ip,真正建立連接是其中一個ip,另外,如果設置了代理,客戶端是與代理伺服器建立直接連接,而不是目標伺服器,代理又可能是域名,可能對應多個ip。因此,這里用Route來描述最終選擇的路由,即客戶端與哪個ip建立連接,是代理還是直連。下面對比下Address及Route的屬性,及路由選擇器RouteSelector。
描述與目標伺服器建立連接所需要的配置信息,包括目標主機名、埠、dns,SocketFactory,如果是https請求,包括TLS相關的SSLSocketFactory 、HostnameVerifier 、CertificatePinner,代理伺服器信息Proxy 、ProxySelector 。
Route提供了真正連接伺服器所需要的動態信息,明確需要連接的伺服器IP地址及代理伺服器,一個Address可能會有很多個路由Route供選擇(一個DNS對應對個IP)。
Address和Route都是數據對象,沒有提供操作方法,OkHttp另外定義了RouteSelector來完成選擇的路由的操作。
1、讀取代理配置信息:resetNextProxy()
讀取代理配置:
● 如果有指定代理(不讀取系統配置,在OkHttpClient實例中指定),則只用1個該指定代理;
● 如果沒有指定,則讀取系統配置的,可能有多個。
2、獲取需要嘗試的socket地址(目標伺服器或者代理伺服器):resetNextInetSocketAddress()
結合Address的host和代理,解析要嘗試的套接字地址(ip+埠)列表:
● 直連或者SOCK代理, 則用目標伺服器的主機名和埠,如果是HTTP代理,則用代理伺服器的主機名和埠;
● 如果是SOCK代理,根據目標伺服器主機名和埠號創建未解析的套接字地址,列表只有1個地址;
● 如果是直連或HTTP代理,先DNS解析,得到InetAddress列表(沒有埠),再創建InetSocketAddress列表(帶上埠),InetSocketAddress與InetAddress的區別是前者帶埠信息。
3、獲取路由列表:next()
選擇路由的流程解析:
● 遍歷每個代理對象,可能多個,直連的代理對象為Proxy.DIRECT(實際是沒有中間代理的);
● 對每個代理獲取套接字地址列表;
● 遍歷地址列表,創建Route,判斷Route如果在路由黑名單中,則添加到失敗路由列表,不在黑名單中則添加到待返回的Route列表;
● 如果最後待返回的Route列表為空,即可能所有路由都在黑名單中,實在沒有新路由了,則將失敗的路由集合返回;
● 傳入Route列表創建Selection對象,對象比較簡單,就是一個目標路由集合,及讀取方法。
為了避免不必要的嘗試,OkHttp會把連接失敗的路由加入到黑名單中,由RouteDatabase管理,該類比較簡單,就是一個失敗路由集合。
1、創建Address
Address的創建在RetryAndFollowUpInteceptor里,每次請求會聲明一個新的Address及StreamAllocation對象,而StreamAllocation使用Address創建RouteSelector對象,在連接時RouteSelector確定請求的路由。
每個Requst都會構造一個Address對象,構造好了Address對象只是有了與伺服器連接的配置信息,但沒有確定最終伺服器的ip,也沒有確定連接的路由。
2、創建RouteSelector
在StreamAllocation聲明的同時會聲明路由選擇器RouteSelector,為一次請求尋找路由。
3、選擇可用的路由Route
下面在測試過程跟蹤實例對象來理解,分別測試直連和HTTP代理HTTP2請求路由的選擇過程:
● 直連請求流程
● HTTP代理HTTPS流程
請求url: https://www.jianshu.com/p/63ba15d8877a
1、構造address對象
2、讀取代理配置:resetNextProxy
3、解析目標伺服器套接字地址:resetNextInetSocketAddress
4、選擇Route創建RealConnection
5、確定協議
測試方法:
● 在PC端打開Charles,設置埠,如何設置代理,網上有教程,比較簡單;
● 手機打開WIFI,選擇連接的WIFI修改網路,在高級選項中設置中指定了代理伺服器,ip為PC的ip,埠是Charles剛設置的埠;
● OkHttpClient不指定代理,發起請求。
1、構造address對象
2、讀取代理配置:resetNextProxy
3、解析目標伺服器套接字地址:resetNextInetSocketAddress
4、選擇Route創建RealConnection
5、創建隧道
由於是代理https請求,需要用到隧道代理。
從圖可以看出,建立隧道其實是發送CONNECT請求,header包括欄位Proxy-Connection,目標主機名,請求內容類似:
6、確定協議,SSL握手
1、代理可分為HTTP代理和SOCK代理;
2、HTTP代理又分為普通代理和隧道代理;普通代理適合明文傳輸,即http請求;隧道代理僅轉發TCP包,適合加密傳輸,即https/http2;
3、SOCK代理又分為SOCK4和SOCK5,區別是後者支持UDP傳輸,適合代理聊天工具如QQ;
4、沒有設置代理(OkHttpClient沒有指定同時系統也沒有設置),客戶端直接與目標伺服器建立TCP連接;
5、設置了代理,代理http請求時,客戶端與代理伺服器建立TCP連接,如果代理伺服器是域名,則解釋代理伺服器域名,而目標伺服器的域名由代理伺服器解析;
6、設置了代理,代理https/http2請求時,客戶端與代理伺服器建立TCP連接,發送CONNECT請求與代理伺服器建立隧道,並進行SSL握手,代理伺服器不解析數據,僅轉發TCP數據包。
如何正確使用 HTTP proxy
OkHttp3中的代理與路由
HTTP 代理原理及實現(一)