ロバストプロコル・オープンチャレンジ大会に参加した
ロバストプロコル(ロバストプロトコル)オープンチャレンジ大会とは
セキュリティキャンプ2020の選択コースで開講された講義.昨年のアップグレード(?)版
https://www.ipa.go.jp/jinzai/camp/2020/zenkoku2020%5Fprogram%5Flist.html#list%5Fa8
講義紹介は上記のリンクから.
簡単に説明すると,パケット損失率が50%(50%?!)の10Mbpsの回線で1分の間に100kBのファイルを自分で作ったプロトコルでどれだけ転送できるかを競う大会. 去年はネクストのみの開講だったが今年はキャンプの方に降りてきた.のに謎のバグで僕以外個人の参加者が全員ネクストだった(?????).
大会のルール策定や準備の方は別の講義の参加者が運営委員会として尽力してくれていて,本当に満足しかない大会でした. すばらしい大会を運営してくださった今岡講師と麻生講師と運営委員会のみなさんには頭が上がりません…本当にありがとうございました.
自作プロトコル -udptable-
今回大会に参加するにあたって,全くプロトコルの知識なんてあるわけなく(参加者全員プロトコルなんか作ったことねえつってた),大学の実験でtcpでソケット通信した程度だったので とりあえずそのへんに落ちてたマスタリングTCP/IPとか眺めながらtcpがどのようなことしてるのかをみてファイルの転送プロトコルには何が必要なのかを調べるところからはじめた.
そもそもtcpだとどれくらいのファイル数を送信できるのか確かめるべく大会の環境で実験したら一桁とか二桁ちょっととかいう悲惨な結果で,
めちゃめちゃがんばって送受信してるtcpを眺めてると涙が止まらなくなった… tcpみたいな友達とか彼女が欲しい人生だった.
最初はtcpから今回の環境では必要なさそうなフロー制御とか順序制御とか輻輳制御みたいなものを取り除く方向でいこうかと思ったが,結局同期式だとACKが損失したときに遅くなりかねないと思い udpで相互に無秩序にパケットを送信しまくるプロトコルを作成することにした.
といっても最初は何から作成したらよいかもわからなかったのでとりあえず,相互通信→ファイル転送→ノイズありファイル転送の順番で段階を踏みながら作成した.ファイルを受け取るテーブル方式は間違ったファイルを 書き出すこともないのでそこそこうまく設計できた気がする.
https://github.com/Siva0410/udptable
完成したのがこれ. 仕様はこのスライド(雑なのは許して)で説明してる.
結果
ノイズが上り側にのみある状態で2回ずつ上りと下りでファイル送信した結果です.
1回目 | 2回目 | 平均 | |
---|---|---|---|
上り | 122 | 124 | 123 |
下り | 203 | 181 | 192 |
なんと,個人戦4位!!!!!!ヤッター…… ネクスト勢が強すぎるのもあるけどもう少し時間があれば多少はマシにできたかもしれない. 個人の目標としてたtcpより多くのファイルを送信する(ついでに3桁),を達成できたので結構満足している. ちなみに今大会最高は上り351, 下りは709です.(は?)
これ 10Mbps * 60s で100kBのファイルがだいたい732個(ノイズありでこれの半分とか)が限界値なのでほぼ無駄なくファイルを送信しているというあれです. というかネクスト勢が上り下りともに全員"325"以上のファイルを送信してるので,はい…強すぎました.“325"を目標に改善するのは楽しそうなのでやるかもしれない.
反省・感想
実は並列処理ではなくタイマー割り込みで送受信を行っているのでそこらへんがボトルネックになってそうな予感はある. あと再送リクエスト周りが割と適当で(時間が……なかった…)意味のないパケットを送信している時間が多かったのもよくないポイント.
†今大会覇者†であるTumoiYorozuさんが有志で環境を公開してくださってるので,勝手に延長戦ということで並列処理とか施して実験をするつもりではある(今のところ).
昨年はネクストのみの開催ということで少しハードルを感じていたけど,いざやってみると割とあっさり動くものは作れるので是非来年以降も興味がある方は参戦してみてください. 事前課題が一番ハードなのは間違いないですが,その分結果がでたときの嬉しさも一入です.大したことしなくても100ファイルくらいは転送できるということをこのブログで知って, 来年以降のロバストプロコル大会のハードルが少しでも下がればなーというお気持ちです.
また,他の参加者のブログが更新されれば感想とともに追記していきたいと思います!
それではー.