router-utils.rbのソースコードにARPPacketというクラスがあります。
以下がそのソースになります。
(router-utils.rbから抜粋)
1 class ARPPacket 2 attr_accessor :type, :tha, :sha, :tpa, :spa 3 4 def initialize type, tha, sha, tpa, spa 5 @type = type 6 @tha = tha 7 @sha = sha 8 @tpa = tpa 9 @spa = spa 10 end 11 12 def pack 13 eth_header = EthernetHeader.new( @tha, @sha, 0x0806 ) 14 15 # arp 16 arp = [ 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, @type ] 17 arp += @sha.to_a + @spa.to_a + @tha.to_a + @tpa.to_a 18 19 while arp.length < 46 do 20 arp += [ 0x00 ] 21 end 22 23 eth_header.pack + arp.pack( "C*" ) 24 end 25 end
今回は詳しく見ませんが、以下の部分はARPパケットの中身そのものです。
16 arp = [ 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, @type ] 17 arp += @sha.to_a + @spa.to_a + @tha.to_a + @tpa.to_a
16行目は、ARPパケットの制御情報と動作コードを配列にセットしています。
0x0001 ネットワーク種類(Ethernet) 0x0800 プロトコル(IP) 0x06 ハードウェアアドレス長さ 0x04 プロトコルアドレス長さ 0x0001 または 0x0002 動作コード(ARPリクエスト/ARPリプライ)
17行目はARPパケットの送信元、目標の情報をarp変数の配列に追加しています。
sha 送信元のMACアドレス spa 送信元のIPアドレス tha 目標のMACアドレス tpa 目標のIPアドレス
ARPパケットについて知らずにソースを見てもよくわかりませんでしたが、ARPパケットの中身が分かってから見ると意味がわかる気がしますね。
0 件のコメント:
コメントを投稿