On ‘Wrong header’ Error during downloading of aMule v2.3.2 and later

在剛剛發布的CN新版,有關aMule v2.3.2及其以後版本在下載中容易因發生’Wrong header’底層錯誤中斷的問題,已經得到有效緩解。本文是為記述解決這一問題的歷程,並談談本人對一些程序開發規則方面的思考。

一、問題回顧

大概早期aMule v2.3.2發布之後一段時間,我就注意到下載時壞塊的情況增加,當時以為是比較爛的改裝版導致的。但後來通過分析verbose log,發現可能是aMule官方客戶端導致的。

一個log的例子如下:

2/1/2021 4:07:55 PM: Client TCP socket: Error: Wrong header; [email protected] (xxx.xxx.xx.xxx) ‘http://www.aMule.org’ (aMule v2.3.2,Downloading/None/None)

這是比較底層的錯誤,是應用程序在處理TCP數據流時,找不到合法的數據頭從而無法繼續的錯誤。這個問題延續到aMule v2.4.0的每日構建版,以及今年剛發布的aMule v2.3.3。

二、初期eMule CN採取的緩解辦法

如果只是下載中斷還好說,但由於數據傳輸錯誤在中斷之前就已經發生,導致下載數據錯誤,出現壞塊。為對付這種壞塊的出現,eMule CN加入了一旦此類嚴重底層錯誤發生,那麼放棄這一問題客戶端此前下載的一些數據的功能,從而有效緩解了這個問題引發的壞塊。

三、終極緩解方案——重寫下載帶寬分配算法

今年3月開始,我用std::list重寫eMule CN的下載帶寬分配算法,得益於std::list的靈活,能夠比較自如地改動、測試各種方法。經過一段時間的調試,速度控制特性穩定下來後,偶然發現在測試極端的一些模式時,「正常」的下載客戶端(即並非aMule v2.3.2及以後版本的客戶端)也可能產生類似的’Wrong header’錯誤。

這個發現給出一些啟示,就是這類錯誤雖然在aMule v2.3.2中引入boost::asio庫處理socket之後出現,應歸屬於該客戶端的問題,但是在本地通過算法調整來緩解,很可能是可以做到的。

接下來的工作就是,如何找出可以令此問題得以極大緩解的算法模式。這是一項非常delicate的任務,經過多次嘗試,終於發現一種算法模式,其中的一個參數能導致問題惡化,也就意味著,反方向對該參數調整,可以找到一個較佳的參數;同時還有其它方面的配合算法調整,最終得到了一個現有的算法,經測試可以避免絕大多數下載時可能的‘Wrong header’錯誤。

四、引發的一些思考

根據一般的開發者遵循的規則,對方客戶端引發的問題,不可能花時間精力去在本地的客戶端開發上去緩解,尤其是aMule客戶端占比並非很高。

那麼這項工作是否值得呢?eMule Community的維護者fox88就認為,不值得!

但我們另外一個角度上看,不是正是由於aMule v2.3.2及以後版本的這個問題,可以是否觸發它的錯誤作為一項指標,來衡量下載分配算法的錯誤容忍度以及魯棒性嗎?

至少,以前一看到aMule v2.3.2及以後版本客戶端開始下載就害怕,到現在可以放心地看著來自這些客戶端的下載數據流入,能帶來這樣的心境的改變,對我來說,這個開發所耗費的精力還是值得的。

你們說呢?

Related posts

‘Xtreme 8.8’ highid client with multiple public IPs

正當大家在為得不到獨立IP,跑eMule拿不到高ID發愁之際,我倒是遇到一類標記為«Xtreme 8.8»的高ID客戶端,而且它不只一個IP,全是高ID。

之所以這麼定論,是因為以下幾點:

每一個這類高ID客戶端,都有一樣的用戶哈西(userhash),TCP端口一樣;雖然IP不同,但IP基本在一個段內;每一個客戶端連到同一個ed2k服務器;用戶暱稱一樣,而Xtreme系列的用戶名內,在中括號中的部分,是啟動時隨機生成的;行為上表現,如果你正從其中一個此類客戶端下載(源來自服務器),此時kad發現了另外一個高ID,太好了,連吧;結果一連下載就斷掉。

從這些表現上,基本可以判斷,這多個客戶端,其實是同一個eMule的實例,很可能用戶是採用了所謂「多撥」的方式,拿到了多個獨立IP,但這個mod在每一個IP所在的網絡界面上監聽,就形成了咱們所遇到的狀況,每個ID之間互相影響,尤其連接另外一個,將直接使得上傳或者下載中斷。

鑒於Xtreme版本號實際上到8.1就終止,這個mod可能是其他人自己私下弄出來的,利用了Xtreme本身對網絡界面的管理方式。

新的版本在處理來源的時候,將對偵測到的這種情況做特殊處理,在拿到多個高ID來源的情況下,還要看是否滿足觀察到的情況,根據這些條件進行判斷,若確定是此類情況,那麼會將多個高ID客戶端做一個客戶端處理。

這種「多撥」導致的情況還有一些,比如有時自己運行的電騾子請求kad的tcp端口檢測的時候,有時候會收到來自沒有請求IP的回應包,很可能就是向同一個客戶端的某個IP發出請求,而對方用另外一個監聽的IP發出響應而造成的。由於不影響下載,這種情況我們就不做特殊處理了。

Latest posts

‘Xtreme 8.8’ highid client with multiple public IPs

正當大家在為得不到獨立IP,跑eMule拿不到高ID發愁之際,我倒是遇到一類標記為«Xtreme 8.8»的高ID客戶端,而且它不只一個IP,全是高ID。

之所以這麼定論,是因為以下幾點:

每一個這類高ID客戶端,都有一樣的用戶哈西(userhash),TCP端口一樣;雖然IP不同,但IP基本在一個段內;每一個客戶端連到同一個ed2k服務器;用戶暱稱一樣,而Xtreme系列的用戶名內,在中括號中的部分,是啟動時隨機生成的;行為上表現,如果你正從其中一個此類客戶端下載(源來自服務器),此時kad發現了另外一個高ID,太好了,連吧;結果一連下載就斷掉。

從這些表現上,基本可以判斷,這多個客戶端,其實是同一個eMule的實例,很可能用戶是採用了所謂「多撥」的方式,拿到了多個獨立IP,但這個mod在每一個IP所在的網絡界面上監聽,就形成了咱們所遇到的狀況,每個ID之間互相影響,尤其連接另外一個,將直接使得上傳或者下載中斷。

鑒於Xtreme版本號實際上到8.1就終止,這個mod可能是其他人自己私下弄出來的,利用了Xtreme本身對網絡界面的管理方式。

新的版本在處理來源的時候,將對偵測到的這種情況做特殊處理,在拿到多個高ID來源的情況下,還要看是否滿足觀察到的情況,根據這些條件進行判斷,若確定是此類情況,那麼會將多個高ID客戶端做一個客戶端處理。

這種「多撥」導致的情況還有一些,比如有時自己運行的電騾子請求kad的tcp端口檢測的時候,有時候會收到來自沒有請求IP的回應包,很可能就是向同一個客戶端的某個IP發出請求,而對方用另外一個監聽的IP發出響應而造成的。由於不影響下載,這種情況我們就不做特殊處理了。

1 comment

  • Hi, it was a nice read for me. Does official eMule or the latest community version suffer the same ‘Wrong header’ problem from aMule v2.3.2 and later?

Leave a Comment

Leave a Reply

Your email address will not be published. Required fields are marked *