TCP/IP に関するメモ

お勉強したので、要点だけまとめたメモです。

IP

IP の基本

IP は、到達性を保障しないプロトコルです。 あて先の IP アドレスさえ指定すれば送れます。 また、IP パケットの大きさは可変です。 ただし、大きなパケットは途中で勝手に断片化される場合もあります。
到達性を保障したり、大きなデータを送受信するためには、複数の IP パケットを束ねて、別の決まり事にそって 通信します。これが TCP です。だから、TCP のパケットは同時に IP のパケットでもあります。
IP ヘッダの構造は以下のようになっています。 パケットのサイズは基本的に 1.5KB でしたが、もっと大きなパケットも 送れるようになっています。これを Jumnbo Frame (ジャンボフレーム) といいます。

IP に関するいろいろ

IP に関する Q & A

TCP

TCP パケットの構造

TCP のパケットは、以下の要素からなっています。 (大事なものだけ抜き出しました) TCP フラグは、以下のものが定義されている。 パケットの話しをするときは、「SYN」とか「RST」とか言葉が飛び交うから、覚えておきましょう。 例えばSYN パケット(シンパケット)とは、syn フラグが on なパケット、RSTパケット(リセットパケット)とは、RSTフラグが on なパケットです。

TCP を使った通信 (ソケット)

TCP を使ってプログラミングをする時には、ソケット API を用います。
普段プログラムを書くときに目にするのは、以下のような関数 (API) です。
[サーバ側]
socket()
bind()
listen()
accept()
このうち、listen() まではマシン内
[クライアント]
socket()
connect()
[通信]
recv()
send()

TCP のセグメントとウィンドウ

TCP も IP のように、データにヘッダを付けて送ります。
[TCP ヘッダ] [TCP データ] 
この一つを TCP セグメントと呼びます。
TCP セグメントは、多くの場合 IP パケット一つに対応します。 でも、絶対ではありません。IP パケットは、経路中のルータの都合で 勝手に断片化されてしまう場合があります。
例えば、断片化前がこんな感じだったとします。( 0123456789 がデータです)
[IPヘッダ] [TCP ヘッダ] [01234567890123456789]
断片化によって、この IP パケットは二つに分割されてしまいました。
[IPヘッダ] [TCP ヘッダ] [0123]
[IPヘッダ] [4567890123456789]
この場合、受け取り側ではこの二つの IP パケットを結合して、まず 正しい [TCPヘッダ] + [データ] という構造を復元します。その上で、 ポート番号などの意味を解釈します。
このセグメントの最大値を、MSS と呼びます。 MSS はコネクション確立時に決めて、1 セグメント = 1 パケットになるようにします。

TCP の元々のアイディアは、セグメントが正しい順番で確実に届くことを保障するため、 セグメント一つに対し必ず ACK を送受信します。 でも、これだと効率が悪いので、複数のセグメントに対する ACK をまとめて 返せるようになっています。これがウィンドウです。 ウィンドウサイズは、受信バッファサイズ以下でなければならないため、 希望するウィンドウのサイズを受信側が TCP ヘッダに乗せて送信します。 ウィンドウサイズを書く場所は、全ての TCP ヘッダに存在します。
ウィンドウサイズは通例 1 から始めます (スロースタート)

TCP についていろいろ

UDP