[Webシステム] ブログ村キーワード

前回の、Firefox高速化~早くなったFirefoxをさらに高速化してみるの続きです。


これまでの記事



TCP/IPについて


httpやTCP/IPについて、一通り理解しているつもりでいましたが、
実はよく分かってないことが分かりました。

というわけで、ネットワークについて1からお勉強。
あれ?これって、さらにfirefox速くできる?
と密かな期待を抱きつつ。
中途半端な知識はよくないです。

今回は、かなり技術的なお話です。
普段は噛み砕きますが、ボクも本格的にお勉強始めたばかりですので、
気が向いたら清書します。

とりあえずTCP/IPについて分かったこと。
他にはIPアドレスあたりのお話は割愛して、
話題をプロトコルに絞ります。

TCP/IPとは下位のIPの上位で使われるプロトコル【protocol】(通信規約)である。

Windowsでのプロトコル番号


RFC 1700で定義されており、
Windows XPの場合、プロトコル番号が記載されたファイルは
C:\WINDOWS\system32\drivers\etc\protocol
である。

protocolファイルの内容

# [aliases...] [#]

ip 0 IP # Internet protocol
icmp 1 ICMP # Internet control message protocol
ggp 3 GGP # Gateway-gateway protocol
tcp 6 TCP # Transmission control protocol
egp 8 EGP # Exterior gateway protocol
pup 12 PUP # PARC universal packet protocol
udp 17 UDP # User datagram protocol
hmp 20 HMP # Host monitoring protocol
xns-idp 22 XNS-IDP # Xerox NS IDP
rdp 27 RDP # "reliable datagram" protocol
rvd 66 RVD # MIT remote virtual disk


IPが、OSI参照モデルの第3層(ネットワーク層)にあたるプロトコルであり、
TCP/IPは第4層(トランスポート層)にあたるプロトコルである。

TCP/IPではIPパケット単位でデータを送信


TCP/IPにおいて、データはIPパケットとよばれる単位で送信される。
1つのIPパケットで送信可能な最大データサイズは64KB。
ヘッダ最小サイズが5B。

実際には1度に64Kを送信できる物理的なネットワーク媒体が存在しない。
イーサネットだと、最大1500B≒1.5KB
光ファイバでも、4352B=4.25KB
そのため、IPパケットは分割して送る(IPフラグメンテーションする)必要があり、
分割されたものをIPプロトコルで再構成する。

1度に送信できるデータサイズをMTU(Maximum Transmission Unit)という。
1度に送信できるサイズに分割したデータをIPフラグメントという。
MTUの最小サイズはデータ512B+ヘッダ用領域64B=576B

TCP/IPとUDP


IPパケットは独立して転送されるため、途中で順序が入れ替わったり、
データが欠落する可能性がある。
そのため、信頼性がない。
信頼性を確保したプロトコルがTCP(Transmission Control Protocol)であり、
信頼性を確保せず、スピードを優先させたプロトコルがUDP(User Datagram Protocol)である。

TCPは、HTTPやFTPに代表されるようなファイルの転送等、
信頼性が必要な通信に利用され、
UDPは、音声や動画のリアルタイム転送等、
信頼性よりもスピードが求められる通信に利用される。

TCP/IPのコネクションの状態は
netstat
というコマンドで確認できる。

TCP/IPの通信内容の確認方法


TCP/IPの通信内容は、
netcap.exe
というコマンドで確認できる。

Windows XPのインストールCDにある、Support Toolsの中の、
setup.exeを実行することでインストールできる。
(らしいが、今CDドライブが使えないため、確認していない。)

ARPとは?


TCP/IPでは、通信の始めにARP【Address Resolve Protocol】(アドレス解決プロトコル、アープ)という、
プロトコルが利用されている。

IPネットワークのコンポーネントの
各ネットワークカード【Network Interface Card、NIC】(ニック)には、
固有のアドレスである、MACアドレス【Media Access Control Address】(マック・アドレス)が割り当てられている。

IPアドレスからMACアドレスを調べるために使われるのが、
ARPであり、ARPはTCPやUDPと同様、
OSI参照モデルの第4層(トランスポート層)にあたるプロトコルである。

ちなみに、MACアドレスからIPアドレスを求めるプロトコルが、
RARP【Reverse Address Resolve Protocol】である。
現在はほとんど利用されていない。

一度、ARPでMACアドレスがわかると、
通信するお互いのコンポーネント(ノード)の中で、
自身が持つARPテーブルへ、IPアドレスに対応するMACアドレスをキャッシュする。

Windows XPの場合、デフォルトのキャッシュ時間は600秒(10分)である。
arp -a
というコマンドを実行すると、ARPテーブルの内容が参照できる。

httpに見るTCP/IP


ここまで分かったところで、httpに戻ります。
httpでは、効率を上げるため、同時接続をして、
TCP/IPコネクションを複数張っています。

HTTP/1.0では、同時接続数は4でしたが、
HTTP/1.1においては、RFC2616で、同時接続数を2以下にすることが
推奨されています。

これは、一見、デチューンな気がしますが、
HTTP1.1で持続的接続【Keep Alive】(キープアライブ)や
パイプライン処理【Pipelining】がサポートされたため、
そもそも同時接続数がそんなに必要なくなったためです。

Keep Aliveとは、コネクション確立のための負荷を軽減するため、
TCP/IPの接続を維持したまま、いろんなファイルを取ってくるというもの。

Pipeliningとは、Keep Aliveした上で、まとめてリクエストすることで、
1つの処理の応答を待つことなく、全部まとめてもらう通信方法です。

Firefoxの同時接続数を増やす


ここまで分かると、要は同時接続数を増やせば、
Firefox君はもっと早くなるんですね。

例によってabout:configで設定内容をチェック

Firefox 3.5.7の初期値はこんな値です。

network.http.keep-alive true
network.http.keep-alive.timeout 300
network.http.max-connections 30
network.http.max-connections-per-server 15
network.http.max-persistent-connections-per-proxy 8
network.http.max-persistent-connections-per-server 6
network.http.pipelining false
network.http.pipelining.maxrequests 4
network.http.pipelining.ssl false

え?推奨同時接続数は2なのに初期値は6なのですね。
ちなみにWindows XPでの制限数は10
ということは、10までは上げてもOK!

しかもパイプライン処理はデフォルトでは行われないのですね。
ということでこれも有効にしてみる。

network.http.max-persistent-connections-per-proxy 10
network.http.max-persistent-connections-per-server 10

network.http.pipelining true
network.http.pipelining.maxrequests 8
network.http.pipelining.ssl true

こんな風にしてみました。

同時接続数を増やすとサーバ側にはいい迷惑


ちなみにこれはWebサーバが2本までの同時接続を推奨してるのに、
Firefox君は6本を同時につかい、
この設定で10本を同時に使っています。
apacheだと同時接続数はデフォルトで256。
2/256だから、同時に128人まで受け入れできるところを
Firefox君は、
6/256を使って、同時に42人までしか受け入れできなくしています。
さらにこれを
10/256人にしているので、同時に25人しか受け入れできなくなります。

サーバ側からするといい迷惑です。
接続拒否されても文句は言えない設定なのでご注意を。

Firefoxではページは先読みされる


ついでに見つけたのが、Firefox君、
どうやらデフォルトでページの先読みをしているようです。

これは、待っている間に、リンクが押されたときのために、
リンク先のページをあらかじめ持ってこよう!というお話。
いやいや、たくさんあるリンクを持ってくる必要なんてないです。

と思ったら、Fasterfoxというアドオンを使った場合のお話で、
普通のFirefoxは、meta linkタグで指定されたページだけを先読みするようです。

しらなかった。

ちなみにサーバ運営者としては、
robots.txtファイルに

User-agent: Fasterfox
Disallow: /

と記載するとFasterfoxによる先読みを防止できるそうです。
内部リンクいっぱいのSEOかかってるサイトで、
先読みなんてされようものなら…。
怖いですね。

意見は分かれそうですが、
要は速い人が遅い人に合わせるか、
遅い人が速い人を待つかというお話です。
渋滞のお話と一緒。

ボクからすれば、サイトに来てくれる人はお客様なわけで、
お客様が満足いくようにおもてなしするのが、
サイト運営者のあるべき姿だと思います。

これって、行列ができてお客さんが並んでいるときに、
いっぱい買うと他のお客さんが買えなくなるから買わないでね。
って言ってるのと変わらないと思います。

ボクの設定はお一人様2個までねって言われているところに、
お友達を4人つれていって、10個買っちゃいました!
ってお話。

とはいえ、運営側にも限界はある。
だったら、限界を示してくれればいいのです。
一番いいのは、サーバ側でお友達も含めて1組だねって
1組にすることです。
できるのかな?

嫌ならサーバ側で拒否すればいい。
いっぱい買われると他のお客様に迷惑だから、
そもそもお店にこないでねってお話。

そもそもタブブラウザ使ってたり、複数のウインドウを使ってたりして、
同じサイトを複数個開くと同じことだと思います。

もっと言うと、いまどき、ISDNやらADSLやらで接続するなよ!
早く買ってくれないと、次のお客さんが迷惑だから。
って言っているのと同じこと。
ん?ケータイのアクセスはPCに比べてそもそも取得に時間がかかる???

AjaxやらFlashやらで、最近は非同期通信がはやっているので、
パイプラインはFirefoxのデフォルトどおり使わない。
network.http.pipelining false
の方が速いみたい。

どうもパイプラインは有効にすると、もうリクエストない?
って待っているみたいです。

設定かえると速い速い!
もうデフォルトFirefoxは使えなさそうです。

参考:
daily dayflower

@IT 基礎から学ぶWindowsネットワーク
http://www.atmarkit.co.jp/fwin2k/serial/index/index.html

dayflower
HTTP/1.1 の同時接続数について
http://d.hatena.ne.jp/dayflower/20081024/1224830945

今日は午前中にたまっていた洗濯物を片して、
午後からずっとこんなことを調べておりました。

なんだか情報セキュリティスペシャリストを受けるよりも
ここまで調べたなら、ネットワークスペシャリストを受けた方が早そうです。

おやすみなさい。

関連記事



もと東大生もと社長の自由奔放日記 Just do it now! このエントリーをはてなブックマークに追加