有用過ping的應該都知道,一般區域網路兩台電腦間ping封包的往返都在1~2 ms之間,甚至是小於1 ms,但大概從一個多月前,為了解決FTP不能在WiMAX模擬平台上傳輸的問題,加入了一些機制後,ping封包往返的時間就再也沒小於200 ms了,於是從禮拜二開始,做起一連串的實驗,想找出這200 ms到底是被甚麼步驟給吃掉了?為了避免大架構實驗容易失敗和失真,我只擷取了幾個元件,另外寫了一支比較小的程式來測試並監控時間,直到昨天只知道從ping封包送出去到收到ping封包就是200 ms,和我另外一支單純收送封包的數據卻是天壤地別,收送一個封包只需要3.5 ms,即使乘上50倍也不過150 ms,所以我一直懷疑是thread在作怪,只是找不到確切的證據證明...

  但說也奇怪,昨天快十點多回到家後,腦袋差不多是一片空白,晚上睡覺前只能看X檔案,但躺在床上,腦筋又開始運轉了,而且是那種幾乎全速道不能睡覺的運轉,於是早上六點半的鬧鐘還沒響,我就醒來了,吃過早餐在客廳的椅子稍微休息一下,老媽看我又快睡著了就問:沒事這麼早起來做什麼?我只淡淡地回答:等等要去學校,休息了好幾天後終於又騎上腳踏車,看來膝蓋已經沒有大礙了,到學校後就開始把湘輔的那本Linux網路程式的書挖來,想找一些跟我我昨晚腦中想法有關的蛛絲馬跡,最後,還是覺得setsocketopt()這個API似乎能做到我想要的東西...

  找到後馬上開始動手,但...怪事發生了,Compiler一直跟我說找不到X選項和Y選項,怎麼會呢?明明書上和網路上都有提到這兩個選項啊,最後,我只好把Linux提供的C/C++ Library裡幾個和網路有關的Header檔通通看過,總算找到X選項和Y選項了,我能說什麼呢?有了上次Kerenel從2.6.18升級到2.6.25後,我們的虛擬網卡Driver就死翹翹(Kernel的API沒有向下相容)的經驗後,API不在你想像的位置也不是甚麼大不了的,Compile終於成功後馬上deploy到另外一台電腦上,程式執行後,開始透過WiMAX虛擬平台下ping的指令,終於,令人高興的數字出現了,平均4~6 ms的往返時間出現了,SFTP的傳輸率也正式突破2 MB/s,沒想到一個平常使用TCP傳輸資料都不會開啟的選項竟然會是我想找的解答,真是愛捉弄人啊...

  事後想想也沒錯,ping所使用的ICMP協定封包本來就不是TCP協定的封包,TCP為了有效使用網路流量,在接收兩端都有buffer的機制(John Nagle's algorithm),差不多是資料量達1460 bytes(或是timeout)才會以一個TCP封包送出,ping的ICMP封包才98 bytes(含header),大概都是等到timeout才會被丟出...
創作者介紹

Spirit的異想世界

dbi1463 發表在 痞客邦 PIXNET 留言(0) 人氣()