2015年4月7日 星期二

udpcast: 在電腦教室裡平行快速配送大型檔案給幾十位同學

飛奔的龍貓公車 電腦老師照過來!

網路傳遞資訊勝過電視或收音機之處, 在於網路可以點對點傳送個人化的訊息; 電視或收音機贏過網路的地方, 則在於它傳播制式統一訊息時, 不管有多少人同時在收看收聽都不會有塞車問題。 事實上越多人同時收看收聽, 整體而言傳送效率越高。

在區域網路裡面, udpcast 讓你享受電視/收音廣播的快感: 當你有一個很大的檔案要派送給幾十位同學時, (理想上) 只需要花一次的傳送時間就可以搞定, 完全解決 (因為很多人同時下載同一個檔案而造成的) 網路塞車問題。

請先安裝 udpcast 這個套件。 就算你們的電腦課沒在用 linux, 光是為了派送大檔, 就值得下載並學用 (已內建 udpcast 的) 阿貴版 finnix 救援光碟

假設老師要派送 finnix-ckhung15d.iso 這個光碟映像檔給整班的學生。 首先請學生下這個指令: udp-receiver > /some/large/partition/finnix-ckhung15d.iso 學生的電腦上會看到類似這樣的訊息並且停在那邊等待:

Udp-receiver 20100130
UDP receiver for (stdout) at 192.168.1.143 on eth2

另一方面, 老師這邊下: udp-sender --max-bitrate 30m --retries-until-drop 5 --log udpcast.log < finnix-ckhung15d.iso 則會看到很多學生機正在等待連線。 訊息的最後一列是: Ready. Press any key to start sending data. 等夠多學生都已加入、 老師一按下任何鍵, 所有學生機就同步開始接收、 龍貓公車就出發囉!

實作上, 可能需要重複派送個二至三次。 因為總會有些學生趕不上公車 ;-) 另外, 有些機器特別會掉封包。 與其傳太快把很多人都拋出龍貓公車, 不如開慢一點把大家都安全送到目的地 :-) 所以我用 --max-bitrate 30m 把傳輸速率上限設為 30m bits/s。 (所以實際傳送資料的速度可能大約是 3MB/s。 這是我在我們的某間教室實驗出來的理想值。) 這同時也會把區網的頻寬留給大家做其他事。

[2015/12/15] 不論設多慢, 總有幾部電腦怪怪的, 無法接收。 而且會拖累其他電腦 -- 因為老師機為了等它, 無法繼續傳下一個封包。 所以我用 --retries-until-drop 5 指示: 如果試了五次還得不到回應, 就放棄這部電腦。 如果某位學生的電腦被放棄丟包, 他應該按 ctrl-c 中斷接收, 重新再下一次指令, 等待下一班龍貓公車。 如果龍貓公車重開幾次都還是這樣, 那就只好開放讓這幾位同學用其他的傳統方式 (http/ftp/scp) 傳檔。

命令列上的 --log udp.log 是為了要留下記錄, 以便查看傳送過程所發生的問題。

建議不要用 --nokbd 這個選項。 是我不會用還是怎樣? 用了之後怪怪的, 反而就不會傳檔了。

如果電腦上有不只一張網卡, 可像這樣: --interface eth2 指定改用 eth2 這張網卡。

如果想要不斷地重複派送同一個大檔, 真的像公車一樣每隔一段時間就自動發一班車, 那麼可以考慮用這些選項:

  1. --daemon-mode : 進入無窮迴圈, 傳完後重新再服務下一批乘客
  2. --file finnix-ckhung15d.iso 傳送 finnix-ckhung15d.iso 這個檔案 [重要! 在 daemon mode 底下, 一定要用這個選項; 因為 stdin 不能重讀, 所以用如果用 input redirection (<) 的話, 只會傳一次]
  3. --min-receivers 2 : 只有小梅一個人嗎? 不開車哦。 要等到姊姊來、 湊足兩個人才開車
  4. --min-wait 20 : 不管已有多少人上車, 至少要等 20 秒才會開車
  5. --max-wait 120 : 等了 120 秒之後, 就算只有小梅一個人也要開車

一個完整的例子: udp-sender --daemon-mode --file finnix-ckhung15d.iso --min-receivers 2 --min-wait 20 --max-wait 120 --max-bitrate 30m --retries-until-drop 5 --log udpcast.log

有人拿 udpcast 把很大的資料庫定時備份到區網內好幾部機器 這一篇 解釋 --fec 容錯機制、 為何最好不要用 --async。 這一篇 詳述 FEC 容錯演算法。

飛奔吧, トトロ!

1 則留言:

  1. 抱歉, 先前遺漏兩處, 剛剛補上去: 單次傳輸時, 老師端可以用 input redirection ( < ) 的方式讀取資料檔; daemon mode 重複傳輸時, 老師端一定要用 --file 選項來指定要傳送哪個檔案。

    回覆刪除