Chapter 3
Transport Layer
A note on the use of these ppt slides:
We’re making these slides freely available to all (faculty, students, readers).
They’re in PowerPoint form so you can add, modify, and delete slides
(including this one) and slide content to suit your needs. They obviously
represent a lot of work on our part. In return for use, we only ask the
following:
 If you use these slides (e.g., in a class) in substantially unaltered form,
that you mention their source (after all, we’d like people to use our book!)
 If you post any slides in substantially unaltered form on a www site, that
you note that they are adapted from (or perhaps identical to) our slides, and
note our copyright of this material.
Computer Networking:
A Top Down Approach
Featuring the Internet,
2nd edition.
Jim Kurose, Keith Ross
Addison-Wesley, July
2002.
Thanks and enjoy! JFK/KWR
All material copyright 1996-2002
J.F Kurose and K.W. Ross, All Rights Reserved
Transport Layer
3-1
Chapter 3: トランスポート層
目標:
 トランスポート層サービ
スの背後にある原理の
理解:




多重化/逆多重化
高信頼データ転送
フロー制御
輻輳制御
 インターネットにおけるトラン
スポート層について学習:



UDP: コネクションレストランス
ポート
TCP: コネクション指向トランス
ポート
TCP 輻輳制御
Transport Layer
3-2
Chapter 3 内容
 3.1 トランスポート層サー
ビス
 3.2 多重化と逆多重化
 3.3 コネクションレス型ト
ランスポート: UDP
 3.4 高信頼データ転送の
原理
 3.5 コネクション指向型トラ
ンスポート: TCP




セグメント構造
高信頼データ転送
フロー制御
コネクション管理
 3.6 輻輳制御の原理
 3.7 TCP 輻輳制御
Transport Layer
3-3
トランスポートサービスとプロトコル
 異なるホスト間で実行されるアプ
リ間に論理的通信を提供
 トランスポートプロトコルはエンド
システムにおいて実行


送信側:アプリケーションメッ
セージをセグメントに分割し,
ネットワーク層に渡す
受信側:セグメントからメッセ
ージを再構成し,アプリケー
ション層に渡す
 アプリケーションにとってひとつ以
上のプロトコルが利用可能
 インターネット: TCP と UDP
application
transport
network
data link
physical
network
data link
physical
network
data link
physical
network
data link
physical
network
data link
physical
network
data link
physical
application
transport
network
data link
physical
Transport Layer
3-4
トランスポート層とネットワーク層

ネットワーク層: ホスト間
の論理的通信

トランスポート層: プロセ
ス間の論理的通信

ネットワーク層サービスに
依存し,その機能を強化す
る
家庭での類似:
12 人の子供が12人の子供
に手紙を送る
 プロセス = 子供
 アプリケーションメッセー
ジ = 封筒内の手紙
 ホスト = 家庭
 転送プロトコル = アンとビ
ル
 ネットワーク層プロトコル=
郵便サービス
Transport Layer
3-5
インターネットトランスポート層プロトコル
 高信頼,順序保証配送:
TCP



輻輳制御
フロー制御
コネクションセットアップ
application
transport
network
data link
physical
network
data link
physical
network
data link
physical
network
data link
physical
 低信頼,順序非保証配送:
UDP

“best-effort” IP に特別な
機能を追加しない(プロセス
識別のみ)
 利用できないサービス:
 遅延保証
 帯域保証
network
data link
physical
network
data link
physical
application
transport
network
data link
physical
Transport Layer
3-6
Chapter 3 内容
 3.1 トランスポート層サー
ビス
 3.2 多重化と逆多重化
 3.3 コネクションレス型ト
ランスポート: UDP
 3.4 高信頼データ転送の
原理
 3.5 コネクション指向型トラ
ンスポート: TCP




セグメント構造
高信頼データ転送
フロー制御
コネクション管理
 3.6 輻輳制御の原理
 3.7 TCP 輻輳制御
Transport Layer
3-7
多重化/逆多重化
始点ホストにおける多重化:
複数ソケットからデータを集め,
(後に逆多重で用いられる)ヘッ
ダを付加してまとめる
終点ホストにおける逆多重化:
受信セグメントを適切なソケットに
転送
= socket
application
transport
network
link
= process
P3
P1
P1
application
transport
network
P2
P4
application
transport
network
link
link
physical
host 1
physical
host 2
physical
host 3
Transport Layer
3-8
逆多重化はどのように機能するか
 ホストはIPデータグラムを受信



各データグラムは,送信IPア
ドレス,受信IPアドレス
各データグラムは,ひとつのト
ランスポート層セグメントを運
ぶ
各セグメントは,送信ポート番
号と受信ポート番号をもつ
(特定のアプリの有名なポート
番号を思い出そう)
32 bits
始点ポート番号 終点ポート番号
他のヘッダフィールド
アプリケーションデータ
(メッセージ)
 ホストは,適切なソケットにセグメ
ントを向けるためにIPアドレスとポ
ート番号を使う
TCP/UDP セグメントフォーマット
Transport Layer
3-9
コネクションレス型の逆多重化
 ポート番号を付与してソケッ
トを生成:
DatagramSocket mySocket1 = new
DatagramSocket(99111);
DatagramSocket mySocket2 = new
DatagramSocket(99222);
 UDP ソケットは
(終点IPアドレス,終点ポート
番号)
で識別される
 ホストがUDPセグメントを
受信すると:


セグメント内の終点ポート番
号をチェック
UDPセグメントをそのポート
番号をもつソケットに向ける
 同一ソケットにむけられた
異なる始点IPアドレスある
いはまた異なる始点ポート
番号をもつIPデータグラム
Transport Layer 3-10
コネクションレス型の逆多重化(つづき)
DatagramSocket serverSocket = new DatagramSocket(6428);
P3
P1
P1
P3
SP: 6428
SP: 6428
DP: 9157
DP: 5775
SP: 9157
client
IP: A
DP: 6428
SP: 5775
server
IP: C
DP: 6428
Client
IP:B
始点ポート番号は“返信アドレス”として使用される
Transport Layer
3-11
コネクション指向型の逆多重化
 TCP ソケットは次の4つの
値によって識別される:




始点IPアドレス
始点ポート番号
終点IPアドレス
終点ポート番号
 終点ホストは,4つの値を
使ってセグメントをアプリケ
ーションソケットに向ける
 サーバホストは同時に多数
のTCPソケットをサポートす
るかもしれない:

各ソケットは自身の4つの値
によって識別される
 Webサーバは各クライアン
トに対して異なるソケットを
持つ

非継続型 HTTP は各リクエ
ストに対して異なるソケットを
持つ
Transport Layer 3-12
コネクション指向型の逆多重(つづき)
P3
P3
SP: 80
SP: 80
DP: 9157
DP: 5775
SP: 9157
client
IP: A
DP: 80
P1
P1
P4
SP: 5775
server
IP: C
DP: 80
Client
IP:B
Transport Layer 3-13
Chapter 3 内容
 3.1 トランスポート層サー
ビス
 3.2 多重化と逆多重化
 3.3 コネクションレス型ト
ランスポート: UDP
 3.4 高信頼データ転送の
原理
 3.5 コネクション指向型トラ
ンスポート: TCP




セグメント構造
高信頼データ転送
フロー制御
コネクション管理
 3.6 輻輳制御の原理
 3.7 TCP 輻輳制御
Transport Layer 3-14
UDP: User Datagram Protocol [RFC 768]
 “余計な機能のない,” “余計な
部分を削った” インターネットト
ランスポートプロトコル
 “ベストエフォート” サービス,
UDPセグメントは, may be:
 失われる


アプリへの非順序保証配
信
コネクションレス:


送信,受信間でハンドシェ
イク不要
各 UDP セグメントは互い
に独立に扱われる
なぜ UDP は存在する
のか?
 (遅延の原因となりうる)コ
ネクション設定不要
 単純:送受信側でコネク
ション状態なし
 小さいセグメントヘッダ
 輻輳制御なし:UDP は,
所望の速度で送信可能
Transport Layer 3-15
UDP: さらに
 ストリーミングマルチメディアア
プリケーションによく利用され
る
Length, in
 廃棄への耐性
bytes of UDP
segment,
 速度に敏感
including
 他の UDP アプリ
header
 DNS
 SNMP
 アプリ層で追加されたUDPを
介した高信頼転送

アプリケーション独自のエ
ラー回復!
32 bits
始点ポート番号 終点ポート番号
長さ
チェックサム
アプリケーションデータ
(メッセージ)
UDP セグメントフォーマット
Transport Layer 3-16
UDP チェックサム
目的: 転送セグメント中の“誤り”を検出する(例えば,ビット
反転など)
始点ホスト:
終点ホスト:
 セグメントの内容を16ビット整
 受信セグメントの内容の和をチェ
数の系列として扱う
 チェックサム: セグメントの内
容の和の1の補数
 始点ホストは,UDPチェックサ
ムフィールドにチェックサム値
を入力
ックサムフィールドを含めて計算
 全てのビットが1となる
 NO – 誤り検出
 YES – 誤り未検出.誤りはな
いのか?
0110011001100110
+0101010101010101
+0000111100001111
=1100101011001010
1の補数=0011010100110101
Transport Layer 3-17
Chapter 3 内容
 3.1 トランスポート層サー
ビス
 3.2 多重化と逆多重化
 3.3 コネクションレス型ト
ランスポート: UDP
 3.4 高信頼データ転送の
原理
 3.5 コネクション指向型トラ
ンスポート: TCP




セグメント構造
高信頼データ転送
フロー制御
コネクション管理
 3.6 輻輳制御の原理
 3.7 TCP 輻輳制御
Transport Layer 3-18
高信頼データ転送の原理
 アプリ層,トランスポート層,リンク層において重要
 重要課題トップ10!
 低信頼性チャネルの特徴が高信頼データ転送プロトコル
(rdt: reliable data transfer) の複雑さを決定付ける
Transport Layer 3-19
高信頼データ転送:はじめに
rdt_send(): 上位層(例:アプリ層)
から呼び出される.データを終点ホスト
側で上位層に渡してください.
送信側
udt_send(): rdt によって呼び
出される.低信頼性チャネルを介
してパケットを終点ホストに転送
deliver_data():上位層にデータを配
信するためにrdtによって呼び出される.
受信側
rdt_rcv(): チャネルの終点ホスト側
にパケットが到着すると呼び出される
Transport Layer 3-20
高信頼データ転送:はじめに
以後:
 高信頼転送プロトコル(rdt)の始点ホスト,終点ホスト
を順に発展させる
 一方向転送のみを考える

ただし,制御情報は両方向に流れる
 始点ホスト,終点ホストを記述するために有限状態マ
シン (FSM: finite state machines) を用いる
状態遷移を引き起こすイベント
状態遷移によってとられるアクション
状態: この状態にいるとき,
次のイベントによって次
状態が一意に決定され
る
state
1
event
actions
state
2
Transport Layer 3-21
Rdt1.0: 高信頼チャネルを介した高信頼転送
 下層チャネルは完全に信頼できる
 ビットエラーなし
 パケット損失なし
 始点ホストと終点ホストは分離:
 始点ホストはデータを下層チャネルに送信する
 終点ホストは下層チャネルからデータを読む
Wait for
call from
above
rdt_send(data)
packet = make_pkt(data)
udt_send(packet)
sender
Wait for
call from
below
rdt_rcv(packet)
extract (packet,data)
deliver_data(data)
receiver
Transport Layer 3-22
Rdt2.0: ビットエラーのあるチャネル
 下層チャネルでパケット内のビット反転が発生しうる
 UDPチェックサムはビットエラーを検出できる

疑問: 誤りからどのように回復するか:

acknowledgements (ACKs): 終点ホストが受信パケットはOKで
あると明示的に伝える






negative acknowledgements (NAKs): 終点ホストが受信パケッ
トに誤りがあると明示的に伝える
始点ホストは NAK を受信するとパケットを再送する
Ack, NAK を使ったヒューマンプロトコルは?
rdt2.0 における新メカニズム(rdt1.0を上回る):
誤り検出
受信側からのフィードバック:終点ホストから始点ホストへの制御
メッセージ(ACK, NAK)
Transport Layer 3-23
rdt2.0: FSM の記述
rdt_send(data)
snkpkt = make_pkt(data, checksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
isNAK(rcvpkt)
Wait for
Wait for
call from
ACK or
udt_send(sndpkt)
above
NAK
rdt_rcv(rcvpkt) && isACK(rcvpkt)
L
始点ホスト
終点ホスト
rdt_rcv(rcvpkt) &&
corrupt(rcvpkt)
udt_send(NAK)
Wait for
call from
below
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)
Transport Layer 3-24
rdt2.0: 誤りがない場合
rdt_send(data)
sndpkt = make_pkt(data, checksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
isNAK(rcvpkt)
Wait for
Wait for
call from
ACK or
udt_send(sndpkt)
above
NAK
rdt_rcv(rcvpkt) && isACK(rcvpkt)
L
rdt_rcv(rcvpkt) &&
corrupt(rcvpkt)
udt_send(NAK)
Wait for
call from
below
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)
Transport Layer 3-25
rdt2.0: 誤りがある場合
rdt_send(data)
sndpkt = make_pkt(data, checksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
isNAK(rcvpkt)
Wait for
Wait for
call from
ACK or
udt_send(sndpkt)
above
NAK
rdt_rcv(rcvpkt) && isACK(rcvpkt)
L
rdt_rcv(rcvpkt) &&
corrupt(rcvpkt)
udt_send(NAK)
Wait for
call from
below
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)
Transport Layer 3-26
rdt2.0 の致命的欠陥!
ACK/NAK が壊れたらどう
する?
重複の取り扱い:
 始点ホストは終点ホストで何が
ーケンス番号を付与する
 もし,ACK/NAKが誤った場合
は,始点ホストは現在のパケッ
トを再送する
 終点ホストは(上位層に上げず
に)重複パケットを廃棄する
起こっているかわからない!
 単純に再送はできない:重複
受信の可能性あり
どするか?
 終点ホストからのACK/NAKに
対して始点ホストがACK/NAK
を返す.それが失われたらどう
するか?
 再送する,しかしこれは正しく
受信されたパケットの再送信を
引き起こす
 始点ホストは,各パケットにシ
stop and wait
始点ホストは,1パケットを
送信し,受信応答を待つ
Transport Layer 3-27
rdt2.1: 始点ホストでの ACK/NAKs 誤りの扱い
rdt_send(data)
sndpkt = make_pkt(0, data, checksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
Wait
for
Wait for
isNAK(rcvpkt) )
ACK or
call 0 from
udt_send(sndpkt)
NAK 0
above
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt)
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt)
L
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
isNAK(rcvpkt) )
udt_send(sndpkt)
L
Wait for
ACK or
NAK 1
Wait for
call 1 from
above
rdt_send(data)
sndpkt = make_pkt(1, data, checksum)
udt_send(sndpkt)
Transport Layer 3-28
rdt2.1: 終点ホストでの ACK/NAKs 誤りの取り扱い
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
&& has_seq0(rcvpkt)
rdt_rcv(rcvpkt) && (corrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) && (corrupt(rcvpkt)
sndpkt = make_pkt(NAK, chksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
not corrupt(rcvpkt) &&
has_seq1(rcvpkt)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
sndpkt = make_pkt(NAK, chksum)
udt_send(sndpkt)
Wait for
0 from
below
Wait for
1 from
below
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
&& has_seq1(rcvpkt)
rdt_rcv(rcvpkt) &&
not corrupt(rcvpkt) &&
has_seq0(rcvpkt)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
Transport Layer 3-29
rdt2.1: ディスカッション
始点ホスト:
 パケットにシーケンス番
号を付与
 二つのシーケンス番号
(0,1) で十分.なぜか?
 受信ACK/NAKに誤りが
あるかどうかチェックする
必要あり
 2倍の状態

状態は,現在のパケットの
シーケンス番号が0か1か
を記憶しておかなければな
らない
終点ホスト:
 受信パケットが重複かど
うかをチェックしなければ
ならない

状態は,所望のパケットシ
ーケンス番号が0か1かを
示している
 注意:受信ホストは,最後
のACK/NAKが送信側に
正しく受信されたかどうか
を知ることはできない
Transport Layer 3-30
rdt2.2: NAK フリープロトコル
 ACKのみを使って rdt2.1 と同一機能を実現
 NAKの代わりに,終点ホストは最後に正しく受信されたパ
ケットに対する ACK を送信

終点ホストは,最後に正しく受信されたパケットのシーケンス番号を
ACKに陽に含まなければならない
 始点ホストは,重複ACKに対して NAK と同様に対処する:
パケットの再送
Transport Layer 3-31
rdt2.2: 始点ホスト,終点ホストの FSM(一部)
rdt_send(data)
sndpkt = make_pkt(0, data, checksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
Wait for
Wait for
isACK(rcvpkt,1) )
ACK
call 0 from
0
udt_send(sndpkt)
above
sender FSM
fragment
rdt_rcv(rcvpkt) &&
(corrupt(rcvpkt) ||
has_seq1(rcvpkt))
udt_send(sndpkt)
Wait for
0 from
below
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt,0)
receiver FSM
fragment
L
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
&& has_seq1(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK1, chksum)
udt_send(sndpkt)
Transport Layer 3-32
rdt3.0: 誤りと廃棄があるチャネル
新しい仮定: 下層チャネル
はパケット(data, ACK)を
損失する可能性がある
アプローチ: 始点ホストは,“適
切な” 時間 ACK を待つ
チェックサム,シーケンス
番号,ACK,再送が助けに
なるが,不十分
れば再送
 もしパケット(またはACK)が(廃
棄ではなく)たんに遅れたのなら:

疑問: ロスをどう扱うか?


始点ホストは,失われたデ
ータやACKを待って,再送
する
おいおい: 具合悪い?
 この時間内に ACK を受信しなけ

再送が重複するが,シーケン
ス番号で対処できる
終点ホストは,最後に受信し
たパケットのシーケンス番号
を記述しなければならない
 カウントダウンタイマーが必要

Transport Layer 3-33
rdt3.0: 始点ホスト
rdt_send(data)
sndpkt = make_pkt(0, data, checksum)
udt_send(sndpkt)
start_timer
rdt_rcv(rcvpkt)
L
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt,1)
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
isACK(rcvpkt,0) )
timeout
udt_send(sndpkt)
start_timer
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt,0)
stop_timer
stop_timer
timeout
udt_send(sndpkt)
start_timer
L
Wait
for
ACK0
Wait for
call 0from
above
L
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
isACK(rcvpkt,1) )
Wait
for
ACK1
Wait for
call 1 from
above
rdt_send(data)
rdt_rcv(rcvpkt)
L
sndpkt = make_pkt(1, data, checksum)
udt_send(sndpkt)
start_timer
Transport Layer 3-34
rdt3.0: 動作
Transport Layer 3-35
rdt3.0: 動作
Transport Layer 3-36
rdt3.0 の性能
 rdt3.0 は動作するが,性能は悪い
 例: 1 Gbps リンク,15 ms エンド間伝播遅延, 1KB パケット:
Ttransmit =
U



L (packet length in bits)
8kb/pkt
=
= 8 microsec
R (transmission rate, bps)
10**9 b/sec
sender
=
L/R
RTT + L / R
=
.008
30.008
= 0.00027
microsec
onds
U sender: 利用率 – 始点ホストが送信している時間割合
30ms ごとに 1KB パケット -> 1 Gbpsリンク上で33kB/sec スループット
ネットワークプロトコルが物理的資源の利用を制約している!
Transport Layer 3-37
rdt3.0: stop-and-wait の動作
sender
receiver
first packet bit transmitted, t = 0
last packet bit transmitted, t = L / R
first packet bit arrives
last packet bit arrives, send ACK
RTT
ACK arrives, send next
packet, t = RTT + L / R
U
sender
=
L/R
RTT + L / R
=
.008
30.008
= 0.00027
microsec
onds
Transport Layer 3-38
パイプラインプロトコル
パイプライン: 始点ホストは,ACK を待つことなく複数のパ
ケットを送信できる


シーケンス番号の範囲が増加する
始点ホスト/終点ホストにおけるバッファリング
 2種類の一般的なパイプラインプロトコル形式:
selective repeat(選択的再送)
go-Back-N,
Transport Layer 3-39
パイプライン: 利用率の改善
sender
receiver
first packet bit transmitted, t = 0
last bit transmitted, t = L / R
first packet bit arrives
last packet bit arrives, send ACK
last bit of 2nd packet arrives, send ACK
last bit of 3rd packet arrives, send ACK
RTT
ACK arrives, send next
packet, t = RTT + L / R
利用率は3倍に増加!
U
sender
=
3*L/R
RTT + L / R
=
.024
30.008
= 0.0008
microsecon
ds
Transport Layer 3-40
Go-Back-N
始点ホスト:
 パケットヘッダ内に k ビットのシーケンス番号
 最大 N までのウインドウ, 連続する ACK 身受信のパケット
 ACK(n): シーケンス番号 n までの(n を含む)連続する全パケットへ正常
受信を通知 – 累積
 重複 ACK をまるめこむ
 ACK未受信パケットに対するタイマー
 timeout(n): ウインドウ内の n 以上のシーケンス番号のパケットを再送
Transport Layer 3-41
GBN: 始点ホストの拡張
rdt_send(data)
L
base=1
nextseqnum=1
rdt_rcv(rcvpkt)
&& corrupt(rcvpkt)
if (nextseqnum < base+N) {
sndpkt[nextseqnum] = make_pkt(nextseqnum,data,chksum)
udt_send(sndpkt[nextseqnum])
if (base == nextseqnum){
start_timer
}
nextseqnum++
}
else
refuse_data(data)
timeout
start_timer
Wait
udt_send(sndpkt[base])
udt_send(sndpkt[base+1])
…
udt_send(sndpkt[nextseqnum-1])
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
base = getacknum(rcvpkt)+1
If (base == nextseqnum)
stop_timer
else
start_timer
Transport Layer 3-42
GBN: 終点ホストの拡張 FSM
default
udt_send(sndpkt)
L
Wait
expectedseqnum=1
sndpkt =
make_pkt(expectedseqnum,ACK,chksum)
rdt_rcv(rcvpkt)
&& notcurrupt(rcvpkt)
&& hasseqnum(rcvpkt,expectedseqnum)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(expectedseqnum,ACK,chksum)
udt_send(sndpkt)
expectedseqnum++
ACKのみ: 正しく受信したパケットに対して,順序どおりに正しく
受信された最大シーケンス番号に対してACK を送信


重複 ACK を生成するかもしれない
Expectedseqnum のみを記憶しておく必要あり
 順序誤りのパケット:
 廃棄-> 終点ホストのバッファリングなし!
 最大順序シーケンス番号をもつ ACK パケットの再送
Transport Layer 3-43
GBN
の動作
Transport Layer 3-44
選択的再送
 終点ホストは,正しく受信された個々のパケットに ACK
を送信する

必要に応じ,上位層に順序正しく配送するためにパケットをバ
ッファリング
 始点ホストは,ACK 未受信のパケットのみを再送
 ACK 未受信のパケットごとに始点ホストタイマー
 始点ホストウインドウ
 N 累積シーケンス番号
 送信済の ACK 未受信のパケットのシーケンス番号を制限
Transport Layer 3-45
選択的再送: 始点ホスト,終点ホストのウインドウ
Transport Layer 3-46
選択的再送
始点ホスト
上位層からのデータ :
 ウインドウ内で有効なシーケン
ス番号があれば,パケット送信
timeout(n):
 パケット nを再送し,タイマーを
リセット
ACK(n)([sendbase,sendbase+N]間):
 パケット n は受信されたものと
記録
 n がACK未受信の最小パケット
であったなら,ウインドウベース
を次の ACK 未受信パケットに
移動
終点ホスト
パケット n([rcvbase, rcvbase+N-1] 内)
 ACK(n)を送信
 順序がおかしい: バッファリング
 順序どおり: (バッファ内に含まれる
順序どおりのパケットも含めて)上
位層に配信し,ウインドウをまだ未
受信のパケットに進める
パケット n([rcvbase-N,rcvbase-1] 内)
 ACK(n)
その他:
 無視
Transport Layer 3-47
選択的再送の動作
Transport Layer 3-48
選択的再送:ジレンマ
例:
 シーケンス番号: 0, 1, 2, 3
 ウインドウサイズ = 3
 終点ホストは二つのシナリオ間
の差がわから
 (a) では,重複データを新規デー
タとして上位層に誤配送する
疑問: シーケンス番号の大きさとウ
インドウサイズの間の関係は?
ウインドウサイズ<シーケンス番
号
課題:
いくらにセットするのが良いか?
Transport Layer 3-49
Chapter 3 内容
 3.1 トランスポート層サー
ビス
 3.2 多重化と逆多重化
 3.3 コネクションレス型ト
ランスポート: UDP
 3.4 高信頼データ転送の
原理
 3.5 コネクション指向型トラ
ンスポート: TCP




セグメント構造
高信頼データ転送
フロー制御
コネクション管理
 3.6 輻輳制御の原理
 3.7 TCP 輻輳制御
Transport Layer 3-50
TCP: 概要
RFCs: 793, 1122, 1323, 2018, 2581
 ポイント・ツー・ポイント:
 1始点ホスト,1終点ホスト
 全二重データ:

 高信頼,順序保証,バイト

ストリーム:

メッセージの境界なし
 パイプライン:
 TCP 輻輳制御,フロー制御
によりウインドウ設定

同一コネクション上での双
方向データフロー
MSS: maximum segment
size,最大セグメントサイズ
 コネクション指向型:

送信&受信バッファ
データ交換の前に,ハンド
シェイク (制御メッセージ交
換) により,始点ホスト,終
点ホストの状態を設定
 フロー制御:
socket
door
application
writes data
application
reads data
TCP
send buffer
TCP
receive buffer
socket
door

始点ホストが終点ホストを
過負荷にすることはない
segment
Transport Layer 3-51
TCP セグメント構造
32 bits
URG: 緊急データ
(通常未使用)
ACK: ACK 番号
有効
PSH: 上位層に直ちに渡す
(通常未使用)
RST, SYN, FIN:
コネクション設定
(セットアップ,
終了コマンド)
Internet
チェックサム
(UDPと同様)
source port #
dest port #
sequence number
acknowledgement number
head not
UA P R S F
len used
checksum
Receive window
Urg data pnter
Options (variable length)
データのバイト
単位でのカウン
ト(セグメントで
はない!)
終点ホストが
次に受信を
望むバイト番
号
application
data
(variable length)
Transport Layer 3-52
TCP シーケンス番号とACK
シーケンス番号:
 セグメントデータの開
始バイトのバイトスト
リームにおけるバイト
単位の通し番号
ACK:
 次に受信すべきバイ
トのシーケンス番号
 累積 ACK
質問: 終点ホストは,順序逆
転して到着したセグメント
をどのように扱うのか
 答え: TCP RFCは規
定せず,実装者任せ
Host A
User
types
‘C’
Host B
host ACKs
receipt of
‘C’, echoes
back ‘C’
host ACKs
receipt
of echoed
‘C’
simple telnet scenario
time
Transport Layer 3-53
TCP ラウンドトリップ時間とタイムアウト
疑問: TCPはどのよう
にタイムアウト時間
を設定するのか?
 RTTより長い時間
 しかし,RTTは可変
 短すぎると…: はやま
ったタイムアウト
 不要な再送
 長すぎると…: セグメン
トロスに対する応答が
遅い
疑問: RTTをどのように見積もる
か?
 SampleRTT: セグメント送信から
ACK受信までの時間を測定
 再送は無視
 SampleRTT は変動するので,より
安定した値が欲しい

最近のいくつかの測定結果の平
均,最新の RTT ではない
Transport Layer 3-54
TCP ラウンドトリップ時間とタイムアウト
EstimatedRTT = (1- )*EstimatedRTT + *SampleRTT
 指数加重移動平均
 過去のサンプルの影響は指数的に減少
 典型的な値:  = 0.125
Transport Layer 3-55
RTT 推定の例:
RTT: gaia.cs.umass.edu to fantasia.eurecom.fr
350
RTT (milliseconds)
300
250
200
150
100
1
8
15
22
29
36
43
50
57
64
71
78
85
92
99
106
time (seconnds)
SampleRTT
Estimated RTT
Transport Layer 3-56
TCP ラウンドトリップ時間とタイムアウト
タイムアウトの設定
 EstimtedRTT + “安全マージン”

EstimatedRTTの変動大 -> より大きな安全マージン
 SampleRTT がEstimatedRTTからどの程度変動するかの一次推定:
DevRTT = (1-)*DevRTT +
*|SampleRTT-EstimatedRTT|
(推奨値,  = 0.25)
タイムアウト値の設定:
TimeoutInterval = EstimatedRTT + 4*DevRTT
Transport Layer 3-57
Chapter 3 内容
 3.1 トランスポート層サー
ビス
 3.2 多重化と逆多重化
 3.3 コネクションレス型ト
ランスポート: UDP
 3.4 高信頼データ転送の
原理
 3.5 コネクション指向型トラ
ンスポート: TCP




セグメント構造
高信頼データ転送
フロー制御
コネクション管理
 3.6 輻輳制御の原理
 3.7 TCP 輻輳制御
Transport Layer 3-58
TCP 始点ホストのイベント:
アプリからのデータ受取り:
タイムアウト:
 シーケンス番号つきセグ
 タイムアウトを引き起こし
メントの生成
たセグメントの再送
 タイマ再起動
 シーケンス番号は,セグ
メントの1バイト目のバイト Ack受信:
ストリーム値
 ACKがセグメントに対して
 タイマ未動作ならタイマ起
初めてのものなら
動 (ACK未受信の最も古
 どこまで ACK されたのか
いセグメントに対するタイ
を更新
マ)
 もし未決着のセグメントが
あれば,タイマを起動
 タイムアウト間隔:
TimeOutInterval
Transport Layer 3-59
NextSeqNum = InitialSeqNum
SendBase = InitialSeqNum
loop (forever) {
switch(event)
event: data received from application above
create TCP segment with sequence number NextSeqNum
if (timer currently not running)
start timer
pass segment to IP
NextSeqNum = NextSeqNum + length(data)
event: timer timeout
retransmit not-yet-acknowledged segment with
smallest sequence number
start timer
event: ACK received, with ACK field value of y
if (y > SendBase) {
SendBase = y
if (there are currently not-yet-acknowledged segments)
start timer
}
} /* end of loop forever */
TCP
送信ホスト
(単純化)
コメント:
• SendBase-1: 最も
最近に累積 ACK さ
れたバイト
例:
• SendBase-1 = 71;
y= 73の場合,終点
ホストは73以上を望
んでおり,y >
SendBaseであるか
ら,新規データは
ACK される
Transport Layer 3-60
TCP: 再送シナリオ
Host A
X
loss
Sendbase
= 100
SendBase
= 120
SendBase
= 100
time
SendBase
= 120
ACK損失の場合
Host B
Seq=92 timeout
Host B
Seq=92 timeout
timeout
Host A
time
早まったタイムアウトの場合
Transport Layer 3-61
TCP 再送シナリオ (つづき)
timeout
Host A
Host B
X
loss
SendBase
= 120
time
累積ACKの場合
Transport Layer 3-62
TCP ACK 生成
[RFC 1122, RFC 2581]
終点ホストにおけるイベント
終点ホストにおけるアクション
予定したシーケンス番号のセグメント
到着,このシーケンス番号のセグメン
トまでの全データはACK済み
ACK を遅らせる,正しい順序の次のセ
グメントの到着を 500ms 待つ,この間
に到着がない場合,当然 ACK を送信
予定したシーケンス番号のセグメント
の到着,ACK の送信待ち状態のセ
グメントが存在する
2つのセグメントに対する累積 ACK を
直ちに送信
予定したシーケンス番号より大きい
値のセグメントの到着,データ欠損の
検出
予定するシーケンス番号(欠損部の小さ
い側)を示す重複ACKを直ちに送信
受信データの欠損部を部分的または
完全に埋めるセグメントの受信
そのセグメントが欠損部の番号の小さい
側から連続している場合は,直ちに
ACK を送信
Transport Layer 3-63
高速再送
 タイムアウト間隔は,相対
的に長い:

損失パケット再送前の長期
遅延
 重複ACKによるセグメント
ロスの検出

始点ホストは,しばしば連
続してセグメントを送信す
る

セグメントが廃棄された場
合,重複 ACK が送信され
る傾向がある
 始点ホストが同一データに
対する ACK を3つ受信し
た場合,ACKが対象とする
セグメントが失われた後の
セグメントに対するものと
推定する:

高速再送:タイマが切れる前
にセグメントを再送
Transport Layer 3-64
高速再送アルゴリズム:
event: ACK received, with ACK field value of y
if (y > SendBase) {
SendBase = y
if (there are currently not-yet-acknowledged segments)
start timer
}
else {
increment count of dup ACKs received for y
if (count of dup ACKs received for y = 3) {
resend segment with sequence number y
}
既に ACK を受信したセグメント
に対する重複 ACK
高速再送
Transport Layer 3-65
Chapter 3 内容
 3.1 トランスポート層サー
ビス
 3.2 多重化と逆多重化
 3.3 コネクションレス型ト
ランスポート: UDP
 3.4 高信頼データ転送の
原理
 3.5 コネクション指向型トラ
ンスポート: TCP




セグメント構造
高信頼データ転送
フロー制御
コネクション管理
 3.6 輻輳制御の原理
 3.7 TCP 輻輳制御
Transport Layer 3-66
TCP フロー制御
 TCPコネクションの終点ホ
ストは受信バッファをもつ:
フロー制御
始点ホストが速く送信しす
ぎることにより終点ホストの
バッファをオーバフローさせ
ることがないようにする
 スピード制御サービス:ア
プリケーション読み出し速
度に送信速度を調整する
 アプリプロセスは,バッフ
ァからの読み出しに遅れ
るかもしれない
Transport Layer 3-67
TCP フロー制御: どのように動作するか
 終点ホストは,セグメント
(TCP 終点ホストは, ことなる順
序で到着したセグメントを廃
棄すると仮定)
 バッファ内の空きスペース
内にRcvWindow 値を含
むことで,空きスペースを
通知
 始点ホストは,ACK未受
信のデータをRcvWindow
に制限

受信バッファがオーバフロ
ーしないことを保証
= RcvWindow
= RcvBuffer-[LastByteRcvd LastByteRead]
Transport Layer 3-68
Chapter 3 内容
 3.1 トランスポート層サー
ビス
 3.2 多重化と逆多重化
 3.3 コネクションレス型ト
ランスポート: UDP
 3.4 高信頼データ転送の
原理
 3.5 コネクション指向型トラ
ンスポート: TCP




セグメント構造
高信頼データ転送
フロー制御
コネクション管理
 3.6 輻輳制御の原理
 3.7 TCP 輻輳制御
Transport Layer 3-69
TCP コネクション管理
Recall: TCP 始点ホストと終点ホ
ストは,データセグメント交換の
前にコネクションを設定する
 TCP 変数の初期化:
 シーケンス番号
バッファ,フロー制御情報(
例,受信ウインドウ)
 クライアント: コネクション開始
側

Socket clientSocket = new
Socket("hostname","port
number");

サーバ: クライアントによってコン
タクトをうける
Socket connectionSocket =
welcomeSocket.accept();
スリーウェイハンドシェイク:
Step 1: クライアントホストは,TCP
SYN セグメントをサーバに送信
 初期シーケンス番号を記述
 データなし
Step 2: サーバホストは,SYNを受
信すると,SYNACKセグメントで応答

サーバはバッファを割当る
サーバの初期シーケンス番号を
記述
Step 3: クライアントは,SYNACKを受
信すると,ACKセグメントで応答する
.このセグメントはデータを含みうる

Transport Layer 3-70
TCP コネクション管理(つづき)
client
コネクションの終了:
client closes socket:
clientSocket.close();
close
Step 1: クライアントエンドシス
close
FINを受信すると,ACKで応
答,FINを送信
timed wait
テムは,TCP FIN 制御セグメ
ントをサーバに送信
Step 2: serverサーバは,
server
closed
Transport Layer 3-71
TCP コネクション管理(つづき)
Step 3: client はFINを受信す
ると,ACKで応答

client
server
closing
タイムアウトに入る – 受信
した FIN に対して ACK で
応答するため
closing
Step 4: serverはACKを受信
注意: わずかな変更で,同時に
timed wait
すると,コネクションをクローズ
FIN (双方が同時にコネクショ
ンを終了する場合)を行う場合
closed
を取り扱うことができる
closed
Transport Layer 3-72
TCP コネクション管理(つづき)
TCP server
lifecycle
TCP client
lifecycle
Transport Layer 3-73
Chapter 3 内容
 3.1 トランスポート層サー
ビス
 3.2 多重化と逆多重化
 3.3 コネクションレス型ト
ランスポート: UDP
 3.4 高信頼データ転送の
原理
 3.5 コネクション指向型トラ
ンスポート: TCP




セグメント構造
高信頼データ転送
フロー制御
コネクション管理
 3.6 輻輳制御の原理
 3.7 TCP 輻輳制御
Transport Layer 3-74
輻輳制御の原理
輻輳:
 簡単にいうと: “多くのソースが大量のデータをネットワークが
扱うことができる速度より速く送信している”
 フロー制御とは異なる!
 現象:
 パケット廃棄 (ルータにおけるバッファオーバーフロー)
 遅延大 (ルータバッファにおける待ち)
 非常に重要な問題のトップ10!
Transport Layer 3-75
輻輳の原因/コスト:シナリオ1
Host A
 始点ホスト2,終点
lout
lin : original data
ホスト2
 ルータ1,無限バッ
Host B
unlimited shared
output link buffers
ファ
 再送なし
 輻輳時は遅延大
 最大スループット
達成可能
Transport Layer 3-76
輻輳の原因/コスト:シナリオ2
 ルータ1,有限バッファ
 始点ホストは,ロスしたパケットを再送
Host A
Host B
lin : original
data
l'in : original data, plus
retransmitted data
lout
finite shared output
link buffers
Transport Layer 3-77
輻輳の原因/コスト:シナリオ2
= l
(goodput)が成立
out
in
 ロス発生時のみの“完璧な”再送: l > l
out
in
 (廃棄されていなくとも)遅延大のパケットの再送は,同じ
 常に
l
完璧な再送の場合よりも)
l
ルータの空きバッファ検出可能な場合
l
を増大させる
lout
に対し,(
in
in
パケットロスを正確に検出可能な場合
タイムアウト値が小さくパケットロス
を正確に検出できない場合
輻輳のコスト:
 ある “goodput” に対してより多くの再送
 不必要な再送:リンクは同一パケットの複数のコピーを伝送
Transport Layer 3-78
輻輳の原因/コスト:シナリオ3
質問: l と l
が大きく
in
in
なると,何が起こるか?
 始点ホスト4
 マルチホップパス
 タイムアウト/再送
Host A
lin : original data
lout
l'in : original data, plus
retransmitted data
finite shared output
link buffers
Host B
Transport Layer 3-79
輻輳の原因/コスト:シナリオ3
l
H
o
s
t
A
o
u
t
H
o
s
t
B
輻輳の別のコスト:
 パケット廃棄が発生した場合,そのパケットのために利用
された上流リンクの帯域は浪費されたことになる!
Transport Layer 3-80
輻輳制御へのアプローチ
輻輳制御のための2つの基本的アプローチ:
エンド間輻輳制御:
 ネットワークからの陽なフィー
ドバックなし
 輻輳は,エンドシステムが観測
する遅延やロスから推定され
る
 TCP によってとられるアプロー
チ
ネットワーク支援型輻輳制
御:
 ルータがエンドシステムにフィ
ードバックを提供
 輻輳かどうかを示す1ビット
(SNA, DECbit, TCP/IP
ECN, ATM)

始点ホストが送信可能な
速度
Transport Layer 3-81
ケーススタディ: ATM ABR 輻輳制御
ABR: available bit rate:
 エラスティックサービス(
elastic service)
 始点ホストのパスが低負荷
なら:

送信ホストは利用可能な
帯域を使用すべき
 始点ホストのパスが輻輳して
いるなら:

始点ホストは,最小保証
速度まで速度を落とすべ
き
資源管理 (RM: resource
management)セル:
 始点ホストによって送信され,デー
タセルの間に分散して挿入される
 RMセル内のビットはスイッチによ
って設定される(ネットワーク支援
型)
 NI bit: レート非増加(中程度
の輻輳)
 CI bit: 輻輳通知
 RMセルは,これらのビットを保持し
たまま,終点ホストによって始点ホ
ストに送り返される
Transport Layer 3-82
ケーススタディ: ATM ABR 輻輳制御
 RMセル内の2バイト明示的レート(ER: explicit rate)フィールド
 輻輳スイッチは,セル内のER値を下げる
 パス上の最小対応レートに送信レートを適応できる
 データセル内のEFCIビット: 輻輳スイッチ内で1にセットされる
RMセルにEFCIビットがセットされている場合,終点ホストは,
次にくる RMセル内のCIビットに1をセットして送り返す
Transport Layer 3-83
Chapter 3 内容
 3.1 トランスポート層サー
ビス
 3.2 多重化と逆多重化
 3.3 コネクションレス型ト
ランスポート: UDP
 3.4 高信頼データ転送の
原理
 3.5 コネクション指向型トラ
ンスポート: TCP




セグメント構造
高信頼データ転送
フロー制御
コネクション管理
 3.6 輻輳制御の原理
 3.7 TCP 輻輳制御
Transport Layer 3-84
TCP 輻輳制御
 エンド間制御 (ネットワーク支援な
し)
 始点ホストは,伝送を制限:
LastByteSent-LastByteAcked
 CongWin
 大雑把に言うと
rate =
CongWin
Bytes/sec
RTT
 CongWin は,知覚されたネットワ
ーク輻輳に応じて,動的に制御され
る
始点ホストはどうやって輻輳
を知覚するのか?
 ロスイベント = タイムアウ
ト または 3重複 ACK
 TCP 始点ホストは,ロス
イベントの後,レート
(CongWin) を減少させる
3つのメカニズム:



AIMD(加算増加,乗算減
少)
スロースタート
タイムアウトへの対応
Transport Layer 3-85
TCP AIMD
乗算的減少: ロスイベント認
識後,CongWin を半減
させる
加算的増加: ロスイベントが
ない場合,RTTごとに
CongWin を 1 MSS だ
け増加:プロービング
congestion
window
24 Kbytes
16 Kbytes
8 Kbytes
time
Long-lived TCP connection
Transport Layer 3-86
TCP スロースタート
 コネクション開始時,
CongWin = 1 MSS


例: MSS = 500 bytes &
RTT = 200 msec
初期レート = 20 kbps
 コネクション開始時は,最
初のロスイベントまで,レー
トを指数関数的に増加させ
ることが望ましい
 利用可能帯域はおそらく
MSS/RTT より十分大きい

相当なレートまで,すばやく
上昇させることが望ましい
CongWin=1MSSから線形増加させた場合,
20Kbpsに達するのにどれだけ時間がかかるか。
また,指数増加させた場合どれだけの時間がかかるか。
Transport Layer 3-87
TCP スロースタート (つづき)
 コネクション開始時,最初


RTTごとに CongWin を倍
増
ACK受信ごとに CongWin
をインクリメント
Host B
RTT
のロスイベントまでレート
を指数関数的に増加:
Host A
 まとめると…: 初期レート
は小さいが,指数関数的
に増加
time
Transport Layer 3-88
改善(セグメントロスが起こったときの対処)
フィロソフィー:
 3つの重複ACK受信後:

CongWin を半減
その後,ウインドウを線形
増加
 しかし, タイムアウトイベント
後は:
 CongWin を1 MSSに設定
 その後,window を指数関
数的に増加


• 3つの重複 ACKは,セグメ
ントをいくらかは配送できる
ということを示している
• 3つの重複 ACK 以前に タ
イムアウトは,“より強い警
告”である
閾値に到達後,線形的に
増加
Transport Layer 3-89
改善 (つづき)
14
congestion window size
(segments)
質問: いつ指数増加から
線形増加に切り替え
るべきか?
答え: CongWin がタイ
ムアウト以前の半分
の値に到達したとき
実装:
 可変閾値
 ロスイベント時,閾値は,ロス
12
10
8
6
4
threshold
2
0
1
TCP
Tahoe
TCP
Reno
2 3
6 7
4 5
8 9 10 11 12 13 14 15
Transmission round
Series1
Series2
イベント直前の CongWin の半
分に設定
Transport Layer 3-90
まとめ: TCP 輻輳制御
 CongWin が Threshold 以下のとき,始点ホストはス
ロースタートフェーズに入り,ウインドウを指数的に増加
させる
 CongWin が Threshold を超えると,始点ホストは,
輻輳回避フェーズに入り,ウインドウを線形的に増加させ
る
 3重ACK受信後,Threshold を CongWin/2 に設定
し,CongWin を閾値に設定する
 タイムアウト発生後は,閾値を CongWin/2 に設定し,
CongWin を 1 MSS に設定する
Transport Layer 3-91
TCP 公平性
公平性の目的: K本のTCPセッションが帯域 R の同一ボト
ルネックリンクを共有している場合,各セッションは平均
R/Kの速度を持つべきである
TCP connection 1
TCP
connection 2
bottleneck
router
capacity R
Transport Layer 3-92
TCP はなぜ公平化?
2本の競合セッション:
 加算増加は,スループット増加時,傾き1の増加を与える
 乗算減少は,スループットを比例的に減少させる
R
等しい帯域分割
廃棄: ウインドウを半減
輻輳回避: 加算増加
廃棄: ウインドウ半減
輻輳回避: 加算増加
Connection 1 throughput R
Transport Layer 3-93
公平性 (つづき)
公平性と UDP
 マルチメディアアプリは
TCP を使わないことが多
い

輻輳制御による速度調整
を望まない
 代わりに UDP を使用:

一定レートで音声/映像を
送信,パケット廃棄への耐
性
 研究テーマ: TCP
friendly
公平性と並列TCPコネクション
 アプリがホスト間で複数コネク
ションをはることを妨げるもの
はない
 Webブラウザはこれを実行
 例: レート R のリンクが9コネ
クションをサポート:


新規アプリが1TCPを設定すれ
ば,レート R/10 を得る
新規アプリが 9 TCPを設定すれ
ば,レート R/2 を得る
Transport Layer 3-94
遅延モデル
Q: リクエスト送信後,Webサー
バからオブジェクトを受信す
るのにどのくらいの時間を要
するか?
輻輳を無視すると,遅延は以下
に影響される:
記号と仮定:
 クライアント・サーバ間は帯域
R の1リンク
 S: MSS (bits)
 O: オブジェクトサイズ (bits)
 再送なし (廃棄なし,誤りなし)
ウインドウサイズ:
 TCP コネクション設定
 最初の仮定: 固定輻輳ウイン
 データ伝送遅延
ドウ,W セグメント
 その後,スロースタートをモデ
ル化した可変ウインドウに
 スロースタート
Transport Layer 3-95
固定輻輳ウインドウ (1)
ケース1:
WS/R > RTT + S/R: ウインドウ
内のデータを全て送信する前
にウインドウ内の第1セグメ
ントに対する ACK が返ってく
る
遅延 = 2RTT + O/R
Transport Layer 3-96
固定輻輳ウインドウ (2)
ケース2:
 WS/R < RTT + S/R: ウイン
ドウ内のデータを送信した後
,ACKが返ってくるのを待つ
遅延 = 2RTT + O/R
+ (K-1)[S/R + RTT - WS/R]
Transport Layer 3-97
TCP 遅延モデル: スロースタート (1)
ウインドウがスロースタートに従って増加すると仮定
オブジェクト転送遅延が以下の式で与えられることを示す:
Latency  2 RTT 
O
S
S

 P  RTT    (2 P  1)
R
R
R

ここで,P はサーバで TCP がアイドルとなる回数であり,
P  min{Q, K  1}
- ここで,Q は,オブジェクトが無限サイズとしたときに,サーバがアイドルとなる回数
- K は,オブジェクト全てを送信するのに必要なウインドウ回数
Transport Layer 3-98
TCP 遅延モデル: スロースタート (2)
遅延要素:
• 2 RTT:コネクション設定
と要求に対するもの
• O/R:オブジェクト転送の
ため
• スロースタートによりサー
バがアイドルとなる時間
initiate TCP
connection
request
object
first window
= S/R
RTT
サーバーアイドル回数:
P = min{K-1,Q}
例:
• O/S = 15 セグメント
• K = 4 ウィンドウ
•Q=2
• P = min{K-1,Q} = 2
サーバは P=2 回アイドル
second window
= 2S/R
third window
= 4S/R
fourth window
= 8S/R
complete
transmission
object
delivered
time at
client
time at
server
Transport Layer 3-99
TCP 遅延モデル (3)
S
 RTT  サーバがセグメント送
R
信開始してから ACK を受信するまでの時間
S
 k番目のウインドウを
R
送信するのに
要する時間
2 k 1
initiate TCP
connection
request
object
first window
= S/R

S
k 1 S 

RTT

2
 k番目のウインドウ後の
 R

R
ア
イドル時間
RTT
second window
= 2S/R
third window
= 4S/R
P
O
delay   2 RTT   idleTim ep
R
p 1
P
O
S
S
  2 RTT   [  RTT  2 k 1 ]
R
R
k 1 R
O
S
S
  2 RTT  P[ RTT  ]  (2 P  1)
R
R
R
fourth window
= 8S/R
complete
transmission
object
delivered
time at
client
time at
server
Transport Layer 3-100
TCP Delay Modeling (4)
K = オブジェクト全てを送信するのに必要なウインドウ回数
K をどのように計算するか?
K  min{k : 20 S  21 S    2 k 1 S  O}
 min{k : 20  21    2 k 1  O / S}
O
 min{k : 2  1  }
S
O
 min{k : k  log2 (  1)}
S
O


 log2 (  1)
S


k
無限サイズのオブジェクトに対してサーバがアイドルとなる回数 Q の計算も同
様(テキストの課題)
Transport Layer 3-101
HTTP モデリング
 Web ページが以下から構成されると仮定:


1 基本 HTML ページ (サイズ O bits)
M 個の画像 (各サイズ O bits)
 非継続型 HTTP:


M+1 TCP コネクションが順番に設定される
応答時間 = (M+1)O/R + (M+1)2RTT + アイドル時間の総和
 継続型 HTTP:



2 RTT :ベース HTML ファイルを要求,受信するための時間
1 RTT :M画像を要求,受信するための時間
応答時間 = (M+1)O/R + 3RTT + アイドル時間の総和
 非継続型 HTTP (X 本の並列コネクション)




M/X は整数と仮定
1 TCP はコネクション用
M/X セットの画像用並列コネクション
応答時間 = (M+1)O/R + (M/X + 1)2RTT + アイドル時間の総和
Transport Layer 3-102
HTTP 応答時間 (秒単位)
RTT = 100 msec, O = 5 Kbytes, M=10 and X=5
20
18
16
14
12
10
8
6
4
2
0
non-persistent
persistent
parallel nonpersistent
28
100
1
10
Kbps Kbps Mbps Mbps
狭帯域に対しては,伝送時間がコネクション,応答時間において主要因
継続型コネクションは,並列コネクションに対して若干の改善を与えるのみ
Transport Layer 3-103
HTTP 応答時間 (秒単位)
RTT =1 sec, O = 5 Kbytes, M=10 and X=5
70
60
50
non-persistent
40
persistent
30
20
parallel nonpersistent
10
0
28
100
1
10
Kbps Kbps Mbps Mbps
RTTが大きくなると,TCP設定,スロースタート遅延が応答時間において大きな要因になる.
継続型コネクションは,特に帯域遅延積大のネットワークにおいて,重大な改善をもたらす.
Transport Layer 3-104
Chapter 3: まとめ
 トランスポート層サービスの背
後にある原理:
 多重化,逆多重化
 高信頼性データ転送
 フロー制御
 輻輳制御
 インターネットにおける事例と
実装
 UDP
 TCP
Next:
 ネットワークのエッジ(
アプリ層,トランスポ
ート層)を離れて
 ネットワークのコアに
Transport Layer 3-105
ダウンロード

高信頼データ転送