2010年10月15日金曜日

勝手に圧縮するんじゃねぇよ

こんにちは、こすげです。
ブログというのは、更新をすると連続してしまうもので、昨日更新したら今日も更新したくなってしまいました。

で、今日のお題は、講義ネタについてです。ええと今週末に情報処理技術者試験があるので、嫌で嫌でたまらなかった講義での試験対策も今週で終わり、来週からはまともな(?)ネットワークの講義ができちゃうんですねぇ。学生さんからみたら、災厄のはじまりなんですけどね。

で、まず初回の講義で、HTTPサーバとWebブラウザのデータのやりとりを tcpdump でリアルタイムに観測するのを実演しようと思って、とりあえず自分でやってみたんですけどね。

とりあえず、職場のサーバにかーんたんなhtmlドキュメントを作成して、クライアントで tcpdump を起動し、同時にブラウザを起動して、サーバー上のhtmlドキュメントにアクセスしてみました。
アドレスバーに入力したのは
「http://kserv.jec.ac.jp/test.html」
なんで、まず、「http:」ってのは HTTPプロトコルだよーん。って意味で、「kserv.jec.ac.jp」はコンテンツが置いてあるサーバのFQDN、で、そのサーバの「/test.html」ってコンテンツを取ってきて表示しろって意味だってことは、さらりと流して(こんなこともわかんない、想像できないなら、情報科学や情報技術を学ぶ資格なし)ですね、さくっとパケットの中身を見ちゃう訳です。
# tcpdump -vv -s 8192 -X -i eth0 tcp port http
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 8192 bytes

コネクション張り(Client->Server SYN)
11:44:19.516906 IP (tos 0x0, ttl 64, id 37211, offset 0, flags [DF], proto TCP (6), length 60)
    kosuge00.jd.jec.ac.jp.50233 > kserv.jec.ac.jp.http: Flags [S], cksum 0x988d (correct), seq 1342296679, win 5840, options [mss 1460,sackOK,TS val 344892 ecr 0,nop,wscale 6], length 0
 0x0000:  4500 003c 915b 4000 4006 3af1 c0a8 0110  E..<.[@.@.:.....
 0x0010:  da2d d289 c439 0050 5001 d267 0000 0000  .-...9.PP..g....
 0x0020:  a002 16d0 988d 0000 0204 05b4 0402 080a  ................
 0x0030:  0005 433c 0000 0000 0103 0306            ..C<........

コネクション張り(Server -> Client SYN+ACK)
11:44:19.523040 IP (tos 0x0, ttl 62, id 0, offset 0, flags [DF], proto TCP (6), length 60)
    kserv.jec.ac.jp.http > kosuge00.jd.jec.ac.jp.50233: Flags [S.], cksum 0xb20a (correct), seq 1515273536, ack 1342296680, win 5792, options [mss 1460,sackOK,TS val 1510733064 ecr 344892,nop,wscale 2], length 0
 0x0000:  4500 003c 0000 4000 3e06 ce4c da2d d289  E..<..@.>..L.-..
 0x0010:  c0a8 0110 0050 c439 5a51 3d40 5001 d268  .....P.9ZQ=@P..h
 0x0020:  a012 16a0 b20a 0000 0204 05b4 0402 080a  ................
 0x0030:  5a0b f508 0005 433c 0103 0302            Z.....C<....

コネクション張り(Client -> Server ACK)
11:44:19.523130 IP (tos 0x0, ttl 64, id 37212, offset 0, flags [DF], proto TCP (6), length 52)
    kosuge00.jd.jec.ac.jp.50233 > kserv.jec.ac.jp.http: Flags [.], cksum 0xf70f (correct), seq 1, ack 1, win 92, options [nop,nop,TS val 344898 ecr 1510733064], length 0
 0x0000:  4500 0034 915c 4000 4006 3af8 c0a8 0110  E..4.\@.@.:.....
 0x0010:  da2d d289 c439 0050 5001 d268 5a51 3d41  .-...9.PP..hZQ=A
 0x0020:  8010 005c f70f 0000 0101 080a 0005 4342  ...\..........CB
 0x0030:  5a0b f508                                Z...

HTTPのGETコマンド(client -> Server GET /test.html .......)
11:44:19.523466 IP (tos 0x0, ttl 64, id 37213, offset 0, flags [DF], proto TCP (6), length 516)
    kosuge00.jd.jec.ac.jp.50233 > kserv.jec.ac.jp.http: Flags [P.], cksum 0x7066 (incorrect -> 0xefd4), seq 1:465, ack 1, win 92, options [nop,nop,TS val 344899 ecr 1510733064], length 464
 0x0000:  4500 0204 915d 4000 4006 3927 c0a8 0110  E....]@.@.9'....
 0x0010:  da2d d289 c439 0050 5001 d268 5a51 3d41  .-...9.PP..hZQ=A
 0x0020:  8018 005c 7066 0000 0101 080a 0005 4343  ...\pf........CC
 0x0030:  5a0b f508 4745 5420 2f74 6573 742e 6874  Z...GET./test.ht
 0x0040:  6d6c 2048 5454 502f 312e 310d 0a48 6f73  ml.HTTP/1.1..Hos
 0x0050:  743a 206b 7365 7276 2e6a 6563 2e61 632e  t:.kserv.jec.ac.
 0x0060:  6a70 0d0a 436f 6e6e 6563 7469 6f6e 3a20  jp..Connection:.
 0x0070:  6b65 6570 2d61 6c69 7665 0d0a 4361 6368  keep-alive..Cach
 0x0080:  652d 436f 6e74 726f 6c3a 206e 6f2d 6361  e-Control:.no-ca
 0x0090:  6368 650d 0a50 7261 676d 613a 206e 6f2d  che..Pragma:.no-
 0x00a0:  6361 6368 650d 0a41 6363 6570 743a 2061  cache..Accept:.a
 0x00b0:  7070 6c69 6361 7469 6f6e 2f78 6d6c 2c61  pplication/xml,a
 0x00c0:  7070 6c69 6361 7469 6f6e 2f78 6874 6d6c  pplication/xhtml
 0x00d0:  2b78 6d6c 2c74 6578 742f 6874 6d6c 3b71  +xml,text/html;q
 0x00e0:  3d30 2e39 2c74 6578 742f 706c 6169 6e3b  =0.9,text/plain;
 0x00f0:  713d 302e 382c 696d 6167 652f 706e 672c  q=0.8,image/png,
 0x0100:  2a2f 2a3b 713d 302e 350d 0a55 7365 722d  */*;q=0.5..User-
 0x0110:  4167 656e 743a 204d 6f7a 696c 6c61 2f35  Agent:.Mozilla/5
 0x0120:  2e30 2028 5831 313b 2055 3b20 4c69 6e75  .0.(X11;.U;.Linu
 0x0130:  7820 6936 3836 3b20 656e 2d55 5329 2041  x.i686;.en-US).A
 0x0140:  7070 6c65 5765 624b 6974 2f35 3334 2e33  ppleWebKit/534.3
 0x0150:  2028 4b48 544d 4c2c 206c 696b 6520 4765  .(KHTML,.like.Ge
 0x0160:  636b 6f29 2043 6872 6f6d 652f 362e 302e  cko).Chrome/6.0.
 0x0170:  3437 322e 3633 2053 6166 6172 692f 3533  472.63.Safari/53
 0x0180:  342e 330d 0a41 6363 6570 742d 456e 636f  4.3..Accept-Enco
 0x0190:  6469 6e67 3a20 677a 6970 2c64 6566 6c61  ding:.gzip,defla
 0x01a0:  7465 2c73 6463 680d 0a41 6363 6570 742d  te,sdch..Accept-
 0x01b0:  4c61 6e67 7561 6765 3a20 6a61 2c65 6e2d  Language:.ja,en-
 0x01c0:  5553 3b71 3d30 2e38 2c65 6e3b 713d 302e  US;q=0.8,en;q=0.
 0x01d0:  360d 0a41 6363 6570 742d 4368 6172 7365  6..Accept-Charse
 0x01e0:  743a 2053 6869 6674 5f4a 4953 2c75 7466  t:.Shift_JIS,utf
 0x01f0:  2d38 3b71 3d30 2e37 2c2a 3b71 3d30 2e33  -8;q=0.7,*;q=0.3
 0x0200:  0d0a 0d0a                                ....

命令を正常に受領したことに対するACK(Server -> Client ACK)
11:44:19.526557 IP (tos 0x0, ttl 62, id 51277, offset 0, flags [DF], proto TCP (6), length 52)
    kserv.jec.ac.jp.http > kosuge00.jd.jec.ac.jp.50233: Flags [.], cksum 0xeee1 (correct), seq 1, ack 465, win 1716, options [nop,nop,TS val 1510733069 ecr 344899], length 0
 0x0000:  4500 0034 c84d 4000 3e06 0607 da2d d289  E..4.M@.>....-..
 0x0010:  c0a8 0110 0050 c439 5a51 3d41 5001 d438  .....P.9ZQ=AP..8
 0x0020:  8010 06b4 eee1 0000 0101 080a 5a0b f50d  ............Z...
 0x0030:  0005 4343                                ..CC

クライアントへコンテンツを戻す(Server -> Client レスポンスコード 200)☆☆☆
11:44:19.533314 IP (tos 0x0, ttl 62, id 51279, offset 0, flags [DF], proto TCP (6), length 726)
    kserv.jec.ac.jp.http > kosuge00.jd.jec.ac.jp.50233: Flags [P.], cksum 0x4275 (correct), seq 1:675, ack 465, win 1716, options [nop,nop,TS val 1510733074 ecr 344899], length 674
 0x0000:  4500 02d6 c84f 4000 3e06 0363 da2d d289  E....O@.>..c.-..
 0x0010:  c0a8 0110 0050 c439 5a51 3d41 5001 d438  .....P.9ZQ=AP..8
 0x0020:  8018 06b4 4275 0000 0101 080a 5a0b f512  ....Bu......Z...
 0x0030:  0005 4343 4854 5450 2f31 2e31 2032 3030  ..CCHTTP/1.1.200
 0x0040:  204f 4b0d 0a44 6174 653a 2046 7269 2c20  .OK..Date:.Fri,.
 0x0050:  3135 204f 6374 2032 3031 3020 3032 3a34  15.Oct.2010.02:4
 0x0060:  363a 3232 2047 4d54 0d0a 5365 7276 6572  6:22.GMT..Server
 0x0070:  3a20 4170 6163 6865 0d0a 4c61 7374 2d4d  :.Apache..Last-M
 0x0080:  6f64 6966 6965 643a 2054 6875 2c20 3134  odified:.Thu,.14
 0x0090:  204f 6374 2032 3031 3020 3034 3a34 393a  .Oct.2010.04:49:
 0x00a0:  3337 2047 4d54 0d0a 4554 6167 3a20 2232  37.GMT..ETag:."2
 0x00b0:  3763 3239 652d 3234 612d 3666 6531 6661  7c29e-24a-6fe1fa
 0x00c0:  3430 220d 0a41 6363 6570 742d 5261 6e67  40"..Accept-Rang
 0x00d0:  6573 3a20 6279 7465 730d 0a56 6172 793a  es:.bytes..Vary:
 0x00e0:  2041 6363 6570 742d 456e 636f 6469 6e67  .Accept-Encoding
 0x00f0:  2c55 7365 722d 4167 656e 740d 0a43 6f6e  ,User-Agent..Con
 0x0100:  7465 6e74 2d45 6e63 6f64 696e 673a 2067  tent-Encoding:.g
 0x0110:  7a69 700d 0a43 6f6e 7465 6e74 2d4c 656e  zip..Content-Len
 0x0120:  6774 683a 2033 3434 0d0a 4b65 6570 2d41  gth:.344..Keep-A
 0x0130:  6c69 7665 3a20 7469 6d65 6f75 743d 3135  live:.timeout=15
 0x0140:  2c20 6d61 783d 3130 300d 0a43 6f6e 6e65  ,.max=100..Conne
 0x0150:  6374 696f 6e3a 204b 6565 702d 416c 6976  ction:.Keep-Aliv
 0x0160:  650d 0a43 6f6e 7465 6e74 2d54 7970 653a  e..Content-Type:
 0x0170:  2074 6578 742f 6874 6d6c 0d0a 0d0a 1f8b  .text/html......
 0x0180:  0800 0000 0000 0003 8d91 4d4f 8340 1086  ..........MO.@..
 0x0190:  effe 8a71 bde8 01a6 580f a62e 1c6c 9b68  ...q....X....l.h
 0x01a0:  526d 6330 ea71 5916 d840 d916 86d2 fe7b  Rmc0.qY..@.....{
 0x01b0:  17a9 297a 30ce 69de 999d 673e 969f cf96  ..)z0.i...g>....
 0x01c0:  d3f0 6335 878c d605 ac5e ef17 8f53 600e  ..c5.....^...S`.
 0x01d0:  e2db 788a 380b 67f0 fe10 3e2d c073 4710  ..x.8.g...>-.sG.
 0x01e0:  56a2 ac35 6953 8a02 71fe cc80 6544 9b09  V..5iS..q...eD..
 0x01f0:  62db b66e 3b76 4d95 62f8 82fb 8ee5 75c5  b..n;vM.b.....u.
 0x0200:  47d7 a141 a51b 53cc 8233 de65 8233 b0c6  G..A..S..3.e.3..
 0x0210:  3325 e2de fd92 6b45 023a b2a3 b68d def9  3%....kE.:......
 0x0220:  4c9a 9254 490e 1d36 8ac1 51f9 8cd4 9eb0  L..TI..6..Q.....
 0x0230:  c3dc 81cc 4455 2bf2 1b4a 9c5b 3660 91a6  ....DU+..J.[6`..
 0x0240:  4205 79ad aa1d b42a e2d8 07fa be78 6acc  B.y....*.....xj.
 0x0250:  2313 1f20 4aa5 294c e5b3 8bc4 9a94 0c44  #...J.)L.......D
 0x0260:  a1cb dcea b1b5 2461 f04b ee7e ea41 e3a8  ......$a.K.~.A..
 0x0270:  3032 df36 8654 c063 bdeb 4069 e9b3 4aa7  02.6.T.c..@i..J.
 0x0280:  19b1 a010 3541 b389 05a9 0978 37ce 5292  ....5A.....x7.R.
 0x0290:  733d f246 1ced db80 e3a0 fa84 ccbc 6f8a  s=.F..........o.
 0x02a0:  b4fb ab8a 053c b1b7 80e3 cc69 a554 c986  .....<.....i.T..
 0x02b0:  bb76 590b cbbc 7fcf 7529 af20 3775 932a  .vY.....u)..7u.*
 0x02c0:  220d 7f4d 6423 f662 f61f b1ff c84f ec12  "..Md#.b.....O..
 0x02d0:  dab8 4a02 0000                           ..J...

クライアントからサーバにコンテンツ正常受領のACK(Client -> Server)
11:44:19.533371 IP (tos 0x0, ttl 64, id 37214, offset 0, flags [DF], proto TCP (6), length 52)
    kosuge00.jd.jec.ac.jp.50233 > kserv.jec.ac.jp.http: Flags [.], cksum 0xf273 (correct), seq 465, ack 675, win 113, options [nop,nop,TS val 344909 ecr 1510733074], length 0
 0x0000:  4500 0034 915e 4000 4006 3af6 c0a8 0110  E..4.^@.@.:.....
 0x0010:  da2d d289 c439 0050 5001 d438 5a51 3fe3  .-...9.PP..8ZQ?.
 0x0020:  8010 0071 f273 0000 0101 080a 0005 434d  ...q.s........CM
 0x0030:  5a0b f512                                Z...

    ↓↓↓↓↓ 以下省略 ↓↓↓↓↓
ええと、これは、OSのTCP/IPプロトコルスタックが出しているパケットと、WebサーバおよびWebクライアントが出しているパケットの2つのレベルのパケットが混在しているのですが、やはりこんなこともわかんない、想像できないようじゃ、情報科学および情報技術を学ぶ資格なしというか、想像力不足でリジェクトなんで、さくっと話を進めちゃいます。

まー、初めの3つのパケットは、コネクションを確率するためのパケットで、教科書どおりですねーって、感じで話を進めて、4つ目のパケットは、クライアントからサーバにGET命令を出力してますよねー、で5番目のパケットはOSが出しているACKで、6つ目のパケットで、Webサーバがクライアントにコンテンツを返しているんですよー。って感じで話を・・・・って、コンテンツの部分が、なにやら文字化けじゃなくて、なにやら怪しげなデータが戻っているじゃん。なんじゃこれ???

って感じで、しばしなんてコンテンツの内容(HTMLファイル)がプレーンで送られていないんだろう、、、これって何か圧縮して入るみたいだなぁと悩むこと数分。。。クライアントからサーバに送られたデータに


0x0180: 342e 330d 0a41 6363 6570 742d 456e 636f 4.3..Accept-Enco
0x0190: 6469 6e67 3a20 677a 6970 2c64 6566 6c61 ding:.gzip,defla
0x01a0: 7465 2c73 6463 680d 0a41 6363 6570 742d te,sdch..Accept-

おー、「Accept-Encoding」に「gzip,deflate,sdch」が送られているじゃありませんか。もしかして、これをみてWebサーバは律儀に gzip 形式で圧縮してコンテンツを送っているのかなーーー。ちいさな親切大きなお世話だなーって設定ファイルを見てみると、「/etc/httpd/conf.d」に、「deflate.conf」って設定ファイルがあるじゃありませんか。。。で、こいつの中身には
# cat deflate.conf 


# DEFLATEの有効化
SetOutputFilter DEFLATE

# 送信先ブラウザがNetscape 4.xの場合はtext/htmlのみ圧縮
BrowserMatch ^Mozilla/4 gzip-only-text/html

# 送信先ブラウザがNetscape 4.06-4.08の場合は圧縮しない
BrowserMatch ^Mozilla/4\.0[678] no-gzip

# 送信先ブラウザがMSIEの場合は全て圧縮する
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# 画像ファイルは圧縮しない
SetEnvIfNoCase Request_URI\.(?:gif|jpe?g|png|iso|gz)$ no-gzip dont-vary

# プロキシサーバーが圧縮未対応ブラウザへ圧縮ファイルを送信しないようにする
Header append Vary User-Agent env=!dont-vary
こんなことが書いてある。おー、送信先ブラウザがNetscape 4.xの場合はtext/htmlのみ圧縮 って設定なのね。。。じゃ。この次の行に

BrowserMatch ^Mozilla/5 no-gzip

ってのを追加してやって、Webサーバを再起動してやると
12:13:09.262605 IP (tos 0x0, ttl 62, id 56354, offset 0, flags [DF], proto TCP (6), length 638)
    kserv.jec.ac.jp.http > kosuge00.jd.jec.ac.jp.34561: Flags [P.], cksum 0x59cf (correct), seq 291:877, ack 465, win 1716, options [nop,nop,TS val 1512462756 ecr 4294954927], length 586
 0x0000:  4500 027e dc22 4000 3e06 efe7 da2d d289  E..~."@.>....-..
 0x0010:  c0a8 0110 0050 8701 c7b8 86de 9867 f974  .....P.......g.t
 0x0020:  8018 06b4 59cf 0000 0101 080a 5a26 59a4  ....Y.......Z&Y.
 0x0030:  ffff cfaf 3c21 444f 4354 5950 4520 6874  .....<h
 0x00b0:  746d 6c3e 0a20 2020 203c 6865 6164 3e0a  tml>.....<head>.
 0x00c0:  2020 2020 2020 2020 3c6d 6574 6120 6874  ........<meta.ht
 0x00d0:  7470 2d65 7175 6976 3d22 636f 6e74 656e  tp-equiv="conten
 0x00e0:  742d 7479 7065 2220 636f 6e74 656e 743d  t-type".content=
 0x00f0:  2274 6578 742f 6874 6d6c 3b20 6368 6172  "text/html;.char
 0x0100:  7365 743d 7574 662d 3822 3e0a 2020 2020  set=utf-8">.....
 0x0110:  2020 2020 3c74 6974 6c65 3e6b 7365 7276  ....<title>kserv
 0x0120:  2077 6562 3c2f 7469 746c 653e 0a20 2020  .web</title>....
 0x0130:  203c 2f68 6561 643e 0a20 2020 203c 626f  .</head>.....<bo
 0x0140:  6479 2062 6763 6f6c 6f72 3d22 2366 6666  dy.bgcolor="#fff
 0x0150:  6663 6322 2061 6c69 6e6b 3d22 2333 3333  fcc".alink="#333
 0x0160:  3366 6622 206c 696e 6b3d 2223 3333 3333  3ff".link="#3333
 0x0170:  6666 2220 766c 696e 6b3d 2223 3333 3333  ff".vlink="#3333
 0x0180:  6666 223e 0a20 2020 2020 2020 203c 626c  ff">.........<bl
 0x0190:  6f63 6b71 756f 7465 3e3c 6469 7620 616c  ockquote><div.al
 0x01a0:  6967 6e3d 2272 6967 6874 223e 6c61 7374  ign="right">last
 0x01b0:  2075 7064 6174 653a 2031 342d 4f63 742d  .update:.14-Oct-
 0x01c0:  3230 3130 3c2f 6469 763e 3c2f 626c 6f63  2010</div></bloc
 0x01d0:  6b71 756f 7465 3e0a 2020 2020 2020 2020  kquote>.........
 0x01e0:  3c68 3120 616c 6967 6e3d 2263 656e 7465  <h1.align="cente
 0x01f0:  7222 3e3c 666f 6e74 2063 6f6c 6f72 3d22  r"><font.color="
 0x0200:  6772 6565 6e22 3e6b 7365 7276 2077 6562  green">kserv.web
 0x0210:  3c2f 666f 6e74 3e3c 2f68 313e 0a20 2020  </font></h1>....
 0x0220:  2020 2020 203c 626c 6f63 6b71 756f 7465  .....<blockquote
 0x0230:  3e3c 6469 7620 616c 6967 6e3d 2272 6967  ><div.align="rig
 0x0240:  6874 223e 2863 2920 6b6f 7375 6765 7474  ht">(c).kosugett
 0x0250:  6920 3230 3130 3c2f 6469 763e 3c2f 626c  i.2010</div></bl
 0x0260:  6f63 6b71 756f 7465 3e0a 2020 2020 3c2f  ockquote>.....</
 0x0270:  626f 6479 3e0a 3c2f 6874 6d6c 3e0a       body>.</html>.
ってな感じで、ちゃーんと、コンテンツが無圧縮で戻されてます。
めでたし、めでたしなんですけど、こんな短いコンテンツも圧縮してくれちゃってまぁ。ごくろうさまなこってす。

しかし、実用度がたかまると、教え辛くなるっていう典型ですね。これは、、、
だから、vi に gcc コンソールから手打ちがいいんだよ、まったく。ほんと最近は本質が見えにくくなって困っちゃうんだな。
「↓↓↓↓↓ 以下省略 ↓↓↓↓↓」の下にもですねー。favicon.ico よこせだとかさぁ、いらんことやってくれちゃっているんだなー。もー死んでしまえ(笑

0 件のコメント:

コメントを投稿