パケットの学び(超初級編)
この記事はseccamp2017 Advent Calendar 2017 - Adventarの15日目の記事です。
初ブログ&知識が拙い なので間違いがあれば指摘お願いします。
パケットとは
情報伝送の一単位。伝送・交換に必要な情報を付したもの。
らしいです。
今回色々コードを書いてみて、まさにpacket(小包)だなぁと感じました。
パケットを解析する
基本的にはプロトコルによって「定められたサイズ」ごとにパケットを区切っていく作業です。
お弁当箱に仕切りを入れる感じですね。
ゲームのバイナリを解析したときもこんな感じで進めていったのを思い出しました。
流れ
まず、「定められたサイズ」というのはヘッダーに書いてあるのでインクルード
↓
ファイルディスクリプタであるsocketを得る
↓
soketからパケットを読み取る
↓
上図の流れでパケットの種類を判別する (チェックサムも行う)
↓
「定められたサイズ」に区切る→種類ごとの構造体にキャストする(型抜きでズバッと)
arp=(struct ether_arp *)ptr; //ptrが元data
↓
表示する
詳しくはここのソースを見れば分かると思います
packet/packet_analyze at master · zuvizudar/packet · GitHub
pingを自作する
流れ
ICMPのサイズ分のパケットを目的地IPに送りつける。
↓
目的地IPに反応があればICMPで帰ってくるので解析
packet/ping at master · zuvizudar/packet · GitHub
チェックサムについて
受信者はなにも気にせずパケット全体の「1 の補数和の 1 の補数」を取り、チェックサムが 0x0000 になるか確かめればよい。
「1 の補数和の 1 の補数」を使うと、チェックサムが正しく含まれているデータのチェックサムを計算するとゼロになる性質があるらしいです。
使うだけなら深く考えなくても大丈夫、、
メモ
SIOCGIFINDEX ...Socket Input Output Configuration Get InterFace INDEX の略(?)
ntoa ... Network byte order TO Address の略(?)
ntohs ... Network byte order TO HoSt byte order の略(?)
感想
思っていたよりずっと単純ですよね。
参考書:
Amazon CAPTCHA
書いたソースは多少の改造はあるもののping以外この本の物です。これからブリッジ、ルーターを作っていくそうなので楽しみです。
めっちゃ面白いのでおすすめです!
おまけ
伸びました。パワーワードという奴ですね。”パケットの気持ち”""パケットの気持ち"" pic.twitter.com/yO5KfvKj6p
— けいと (@zuvizudar) 2017年11月11日