おがさわらなるひこのオープンソースとかプログラミングとか印刷技術とか

おがさわらなるひこ @naru0ga が技術系で興味を持ったりなんだりしたことをたまーに書くブログです。最近はてなダイアリー放置しすぎて記事書くたびにはてな記法忘れるのではてなブログに移行しました。

クリエイティブ・コモンズ・ライセンス
特に断りがない場合は、本ブログの筆者によるコンテンツは クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンスの下に提供されています。

WiresharkでApple AirPrintを覗き見するのだ(その2)

昨日のエントリの続き。今度は印刷のパケット見てみましょう。

iOS 側のアプリケーションは標準の「写真」で、フツーに写真を印刷してみました。

IPP のやり取りを見てみるよ

述べたとおり、印刷ジョブは IPP で行われているので、IPP の上位レイヤの HTTP のアクセス見ようかなーって思ったら、IPP サポートしてるので、なーんだってことで IPP でフィルタリング。手抜きスマヌでござります。しっかし超便利だな Wireshark

|Time     | fe80::9284:dff:fe56:a4b3              |
|         |                   | fe80::ee55:f9ff:fec3:9461             
|25.878   |         IPP request                   |IPP: IPP request
|         |(53833)  ------------------>  (631)    |
|25.901   |         IPP response                  |IPP: IPP response
|         |(53833)  <------------------  (631)    |
|26.537   |         IPP request                   |IPP: IPP request
|         |(53834)  ------------------>  (631)    |
|26.538   |         IPP response                  |IPP: IPP response
|         |(53834)  <------------------  (631)    |
|26.682   |         IPP request                   |IPP: IPP request
|         |(53835)  ------------------>  (631)    |
|26.683   |         IPP response                  |IPP: IPP response
|         |(53835)  <------------------  (631)    |
|27.986   |         IPP request                   |IPP: IPP request
|         |(53834)  ------------------>  (631)    |
|27.989   |         IPP request                   |IPP: IPP request
|         |(53836)  ------------------>  (631)    |
|27.996   |         IPP response                  |IPP: IPP response
|         |(53834)  <------------------  (631)    |
|27.997   |         IPP response                  |IPP: IPP response
|         |(53836)  <------------------  (631)    |
|28.012   |         IPP request                   |IPP: IPP request
……
|41.233   |         IPP request                   |IPP: IPP request
|         |(53834)  ------------------>  (631)    |
|41.234   |         IPP response                  |IPP: IPP response
|         |(53834)  <------------------  (631)    |
|41.332   |         IPP request                   |IPP: IPP request
|         |(53840)  ------------------>  (631)    |
|41.333   |         IPP response                  |IPP: IPP response
|         |(53840)  <------------------  (631)    |

昨日言及し忘れたんですが、ふつーに IPv6 なんすね……。

IPP は Request - Response なプロトコルなので、当然ですけどちゃんと印刷*1 できてればちゃんと対になってるはずですが、ちゃんとなってますね。よしよし。

中身をもっと見てみよう

AirPrint で使っている IPP はバージョン 1.1 で、これは IEEE Printer Working Group の IPP Working Group*2 で策定されているので、リンク先の RFC を見ればいいわけなんですが、なにせボリュームあるので大変ですわなw 少なくとも私はめんどくさいです。

ということで小理屈を並べる前にもういきなりプロトコルを見てしまいましょう。それぞれの Request - Response の対応の意味はこんな感じになってます。

Time Request Operation ID 応答 意味
25.878 Get-Printer-Attribute(document-format-supported) application/pdf, image/jpeg など サポートしている文書の種類などの属性を得る
26.537 Validate-Job Status-code: Successful-OK ジョブ受付可能かを調べる
26.682 Get-Printer-Attribute(printer-state-reasons) none ステータスを調べる
27.986 Print-Job(image/jpeg, job-state: Processing 印刷ジョブを投げる
Copies=1,
fit-to-page=true,
...)
27.989 Get-Printer-Attribute(printer-status-reasons) job-state: Processing 印刷完了まで待つ
...
41.233 Get-Printer-Attribute(printer-status-reasons) job-state: Complete 印刷完了!!
41.332 Get-Printer-Attribute(printer-status-reasons) none ステータスを再度得る

あ、あれ? PDF じゃなくて jpeg 投げてる……しかもデータダンプしてみると Exif 付きでそのまんま投げてます (興味がある人はやってみてくだせー)。

多分ですけど、document-format-supported で jpeg を受け付けてる場合はまんまで投げ、そうでない場合は iOS ビルトイン*3 の PDF エンジンを使って PDF で印刷するんじゃないかなー。

/usr/share/cups/mime 以下をいじくって image/jpeg の受付を止めちゃえば、もしかしたら PDF で投げてくるのかもしれませんが、今日はめんどうなので実験はやめておきます。気が向いたらあとで補足しておきますね。

終わりに

二回続けた割にはショボい内容ですねー。

でも、Wireshark 面白いので、あーんなことやこーんなこと、いろいろ覗いてみようかと思いますです。そういう意味でこんな適当な記事でも(私には)価値があった。

さて明日ですが、三連休はスキー旅行にいってしまうのであんまり凝ったネタは書けないなー。読書感想ネタでごまかすかもしれませんが、なんか考えます……。

*1:実際は、今回試してるプリントキューは FileDevice を使って /tmp にデータをダンプしてます。

*2:関係ないですけど CUPS の主開発者である Michael Sweet は PWG の議長です。

*3:だったはず:私は自他共に認めるアンチ Apple なのであんまり詳しくないですが、iOS のグラフィックエンジンも Quartz なんですよね?