トランスポートレイヤ技術- TCP; Transmission Control Protocol -1

トランスポートレイヤの仕事• 計算機のインターフェース(Socket)間での 良好なデータのやり取りを実現する。
– 誤りがないように• 再送• パリティー情報による自動再生(FEC; Forward Error Correction)– データを取りこぼさないように(*) ファイルアクセスと同じ インターフェース を提供• それ以外に欲しくなる機能– 並列データ転送– ネットワークに “やさしく”• 道が混まないように• ネットワークは単純化、エンドホストが賢く

2

3

4

インターネットアーキテクチャ- TCP : Transmission Control Protocol • TCP (Transmission Control Protocol) ； end-to-end– フロー制御– エラー制御 / 再送制御
– コネクション管理– セッションの多重化
Application

Application

TCP

TCP

IP

IP

IP

Network
Interface

Network
Interface

Network
Interface

PhysicalPhysicalPhysical
5TCP Features
・ “Stream” Oriented Data Transmission→ Connection確立(Three-way-handshake)・ Connection (“Stream”) Identifier ＝ “Socket”{dst_IP_addr, dst_port, src_IP_addr, src_port}
・ “Sequence Number” ; 32 bits
→ バイト番号 ： 0 － (2^32-1)→ 2^32 でSequence NumberがWrapされる
・ “Full-Duplex”での通信
・ Acknowledgement (ACK) ;→ 次に受信すべきバイト番号(SN)の通知
・ エラー回復： セグメント再送(Segment retransmission)
by Time-out, Dupilicated-ACK・ “Sliding Window Control” を用いたデータ転送制御(*) Window_size ≦ 65,535 Bytes67

8

TCP Header FormatUR
AKPH
RT
SYFN

： Urgent Pointer Field Significant (URG)： Acknowledgement Field Significant (ACK)： Push Function： Reset the Connection： Synchronize Sequence Numbers (SYN)： No More Data From Sender (FIN)

9

TCP Port Allocation （RFC1700)
1. Well-Known Ports;
0 - 1,023
2. Registered Ports; 1,024 - 49,151
3. Dynamic and/or Private Ports ; 49,152 - 65,535
最新情報 :
ftp://ftp.isi.edu/in-notes/iana/assignments/port-numbers

10

TCP Well-Known Ports
Port Number Keyword
52021232539536367
69707980
110
111
119

rje
ftp-data
ftp
telnetsmtp
rlp
domainwhois++
bootp
tftp
gopherfinger
httppop3
sunrpcnntp

Application
Remote Job Entry
File Transfer [Default data]
File Transfer [Control]
TelnetSimple Management Protocol
Resource Location Protocol
Domain Name Server
Whois++
Bootstrap Protocol Server
Trivial File Transfer
GopherFingerWorld Wide Web HTTP
Post Office Protocol - Version 3
SUN Remote Procedure Call
Network News Transfer Protocol
11TCP Well-Known Ports
Port Number Keyword
123
137
138
139
179
202
213
220
396
540
546
547
560

Application

ntp
Network Time Protocol
netbios-ns
NetBIOS Name Service
netbios-dgm NetBIOS Datagram Service
netbios-ssn
NetBIOS Session Service
bgp
Border Gateway Protocol (BGP)
at-nbpAppleTalk Name Binding Protocol
ipx
IPX
imap3
IMAP3 (Interactive Mail Access Protocol)
netware-ip
Novell Netware over IP
uucp
uucp daemon
dhcpv6-client DHCPv6 Client
dhcpv6-server DHCPv6 Server
rmonitor
remote monitor daemon

12

TCP Connection確立/解放
svr4.1037 (client)“Active open”

bsdi.discard(server)(appli. open : telnet)

SYN_ACK(a+1,b)“Passive open”“open”“open”“Active Close”(application close: quit)“half close”

FIN (m,s+1)
ACK (m+1)

EOF to Application“Passive Close”
FIN_ACK (m+1,s)ACK (s+1)(application close)“half close”→ full close 13

Three Way Handshalking• エラー が発生する可能性が存在する。
• 2つの ノードの間での それぞれのノードが持つ 情報の「同期」 を確立させたい。
• 3つのパケット(＝メッセージ)の 送受信で、情報の同期が確保・保証される(必要十分条件)。

14

TCP Connection確立/開放
ServerClientSYN_SENT(Active open)

SYN_ACK(a+1,b)

LISTEN(Passive open)

SYN_RCVDESTABLISHEDESTABLISHED
FIN_WAIT_1(Active close)

FIN (m,s)
ACK (m+1)

CLOSE_WAIT(Passive close)

FIN_WAIT_2
LAST_ACKTIME_WAIT
2-MSL
CLOSEDFIN_ACK (m+1,s)ACK (s+1)

CLOSED
15

TCP Connection確立/開放
Log on the console;
svr4% telnet bsdi discard
Trying 140.252.13.35
Connected to bsdi.
Escape character is ‘^]’.
^]telnet> quit
Connection closed.

#port=“9” (server discard packet)

tcpdump output
1 0.0
2 0.024 (0.0024)
3 0.007 (0.0048)
4 4.155 (4.1482)
5 4.158 (0.0013)
6 4.159 (0.0014)
7 4.189 (0.0225)

svr4.1037 > bsdi.discard: S 14155.14155(0)win 4096 <mss 1024>
bsdi.discard > svr4.1037: S 18239.18239(0)ack 14156 win 4096 <mss 1024>
svr4.1037 > bsdi.discard: . ack 18240 win 4096
svr4.1037 > bsdi.discard: F 14156:14156(0)ack 18240 win 4096
bsdi.discard > svr4.1037: . ack 14157 win 4096
bsdi.discard > svr4.1037: F 18240.18240(0)ack 14157 win 4096
svr4.1037 > bsdi.discard: . ack 18241 win 4096

TCP
Connection確立/開放
tcpdump output
1 0.0

2 0.024 (0.0024)
3 0.007 (0.0048)
4 4.155 (4.1482)

5 4.158 (0.0013)
6 4.159 (0.0014)
7 4.189 (0.0225)

svr4.1037 > bsdi.discard: S 14155.14155(0)win 4096 <mss 1024>
bsdi.discard > svr4.1037: S 18239.18239(0)ack 14156 win 4096 <mss 1024>
svr4.1037 > bsdi.discard: . ack 18240 win 4096
svr4.1037 > bsdi.discard: F 14156:14156(0)ack 18240 win 4096
bsdi.discard > svr4.1037: . ack 14157 win 4096
bsdi.discard > svr4.1037: F 18240.18240(0)ack 14157 win 4096
svr4.1037 > bsdi.discard: . ack 18241 win 4096

[意味]source.port > destination.port : flags SN_begin.SN_end(data_size)
flags : S = SYN ; Synchronize sequence_number(SN)F = FIN ; Finish data transmission
R = RST ; Reset connection
P = PSH ; push data to receiving process asap
. =; none of above four flags is on
SN_end = SN_begin + data_size
win 4096 ; window size is 4096
mss 1024 ; maximum segment size is 1024 bytes
17

CLOSED
appl: passive open
send: <nothing>appl: active open
send: SYN

LISTEN

recvl: SYN
send: SYN, ACK

appl: close
send: FIN

passive open
appl: send data
Send : RST
send: SYN
Active open
recv: SYN
close
SYN_RCVDSYN_SENT appl:
send: SYN,ACK
or timeout(simultaneous open)
recv: SYN,ACK
recv: ACK
send: ACK
send: <nothing>appl: close
send: FIN

FIN_WAIT_1
recv: ACK
send: <nothing>

ESTABLISHED recv: FIN

CLOSE_WAIT

send: ACK

appl: close
send: FIN

recv: FIN
send: ACK

recv: FIN,ACK
send: ACKFIN_WAIT_2

recv: FIN
send: ACK
Active close

simultaneous close

CLOSING
recv: ACK
send: <nothing>

TIME_WAIT
2 MSL timeout

LAST_ACK
Passive close

recv: ACK
send: <nothing><< Client >>CLOSEDappl: passive open
send: <nothing>

LISTEN

recvl: SYN
send: SYN, ACK

appl: active open
send: SYN

appl: close
send: FIN

passive open
appl: send data
send: RST
send: SYN
Active open
recv: SYN
close
SYN_RCVDSYN_SENT appl:
send: SYN,ACK
or timeout(simultaneous open)
recv: SYN,ACKrecv: ACK
send: ACK
send: <nothing>appl: close
send: FIN

FIN_WAIT_1
recv: ACK
send: <nothing>

ESTABLISHED recv: FIN

CLOSE_WAIT

send: ACK

appl: close
send: FIN

recv: FIN
send: ACK

recv: FIN,ACK
send: ACKFIN_WAIT_2

recv: FIN
send: ACK
Active close

simultaneous close

CLOSING
recv: ACK
send: <nothing>

TIME_WAIT
2 MSL timeout

LAST_ACK
Passive close

recv: ACK
send: <nothing>CLOSED<< Server >>appl: passive open
send: <nothing>appl: active open
send: SYN

LISTEN

recvl: SYN
send: SYN, ACK

appl: close
send: FIN

passive open
appl: send data
send: RST
send: SYN
Active open
recv: SYN
close
SYN_RCVDSYN_SENT appl:
send: SYN,ACK
or timeout(simultaneous open)
recv: SYN,ACK
recv: ACK
send: ACK
send: <nothing>appl: close
send: FIN

FIN_WAIT_1
recv: ACK
send: <nothing>

ESTABLISHED recv: FIN

CLOSE_WAIT

send: ACK

appl: close
send: FIN

recv: FIN
send: ACK

recv: FIN,ACK
send: ACKFIN_WAIT_2

recv: FIN
send: ACK
Active close

simultaneous close

CLOSING
recv: ACK
send: <nothing>

TIME_WAIT
2 MSL timeout

LAST_ACK
Passive close

recv: ACK
send: <nothing>21

誤りのないデータ転送• パケットが紛失したり誤ったりしたら– 再送(Resend)して、もとにもどす。

• 正しく受信できたかの確認のメッセージ(ACK; Acknowledge)を送信(From dst➔src)– とても原始的な手順では、、、、速度が出ない。。
– 2つの改善手法• 大きなパケット長： 最大でも 帯域幅の 1/3 まで。。。
• パイプラインで パケットを転送
22

TCP Bulk Data Transmission- Sliding Window ・ Window制御を用いたパケット転送①Sliding Window (Receiver設定)②Congestion Window(Sender設定)(1) ACKなしにwindow数のパケットを転送(2) ACKのAggregation(ACKパケットの減少)(3) Receiver側によるwindow幅の制御(4) ACK受信でwindowをスライドさせる
23

TCP Sliding Window
Offered window(advertised by receiver)Unsent window

1

2

3

4

5

sent andACKed
sent but not ACKed

67Can send ASAP

891011 …

Can not send until
window slides

24

TCP Sliding Window
Sent “3” and “4”Offered window(advertised by receiver)Unsent window

12

3

4

5

6

7

8

sent and ACKed

91011 …

Can send ASAP

Can not send
until window
slidessent but not ACKed

Receive ack “5”from receiver

3+window=95+window=11

Receive ack “5”from receiverTCP Sliding Window
Window advertise by receivershrinkenlargewindowclosed by
ACK reception= ACKed SN

Opend byACK reception(=ack+window)

Slide window by ACK from receiver26

TCP Congestion Window
Offered window(advertised by receiver)Unsent window

1

2

sent andACKed

3

4

5

6

7

Shall not send ASAP

Congestion window(“cwnd”=1 )

8

9

10

11 …

Can not send until
window slides→ sent but not ACKed
27

TCP Congestion Window
Sent “3”Offered window(advertised by receiver)Unsent window

123sent and ACKed

456789

Shall not send ASAP
Shall send without
ACK ASAP;
cwnd=2 (cwnd←cwnd*2)

10Can not send
until window
slides3+window=94+window=10

Receive ack “4”from receiver

11 …

Receive ack “4”from receiverTCP Congestion Window
・ Slow Start Policy (cwnd ; exponential increase)cwnd = 1 ;for (セグメント転送){for (not congestion){
if (セグメント転送ACK受信){ cwnd = cnwd +1 }cwnd = 1}(*)注意 : Congestion Avoidance では若干異なる。
SenderがLocal に制御することなので、変えることが容易に可能
29

TCP Congestion Window
congestion

cwnd

cwnd

advertised_window

advertised_window

timetime< Congestionなしの場合 >< Congestion経験の場合 >(*) Duplicated ACKを使用せず
30

TCP Congestion Window(1)
1[受]

[送]

[受][送]
1

1

1
1

1
1

131

TCP Congestion Window(2)
2

3[受]

[送]

[受][送]
23 2

2
3

3

2

2
3

3

2

2

3
32

TCP Congestion Window(3)47[受][送]6 5[受][送]45 4

764 56 57 67454565674433

TCP Congestion Window(4)812[受]

[送]
56

[受]

[送]
879 86710 913 1211 108 98711 1011 10 998814 1312 1189 1015 1413 12

911

必要なウィンドー幅 ≧ BWxRTT1034

Congestion Window Control[目的]
cwndの大きな振動を防ぎ、適切なcwndで運用する[1] cwndの制御(i) ssthresh以下のcwndサイズ→ Exponential increase(slow start)(ii) ssthresh以上のcwndサイズ→ Liner increase(congestion avoidance)[2] ssthreshの制御(i) Timeout ； goto “1”(ii) Duplicated-ACK ； 1/2

cwnd=1; ssthresh=64KB;
for (){if (“Timeout”){ cwnd=1;
ssthresh = cwnd/2; }if (“duplicated ACK”){ ssthresh=cwnd / 2;
cwnd=ssthresh;}if (cwnd ≦ ssthresh){ slow_start;/* exponential */}else{ congestion_avoidance;/* liner */}}35

Congestion Window Control (続)・ ICMP 制御メッセージ(1) ICMP Source Quench→ cwnd = 1 ;ssthresh = as is ;(2) Host unreachable→ No Action ;36

Congestion Congestion
slow-start avoidance avoidanceslow-start

Congestion
avoidancecwdn_1
cwdn_3

Timeout“ssthresh”

FastRecovery(cwnd_3) / 2(cwnd_1) / 2

cwnd

Targetcnwd

Fast
Recovery37

Window Scaling for Long Fat Pipe
- RFC1323 Network
Ethernet
T1（大陸間）T1（衛星）T3（大陸間）OC12（大陸間）

Bandwidth（bps）
10.000 M
1.544 M
1,544 M
45,000 M
2,400,000 M

RTT（ms）
360
500
60
60

BWxRTT（B）
3,750
11,58096,500337,500
7,500,000

・ Max. Window Size ； 2^(16) Bytes = 64KB
→ Window Scaling ; “wscale”
wscale=n → 64 x 2^(n) windowサイズ
38

64KB だと、どのくらいになる ?
RTT (msec)
200202Throughput
2.56Mbps
25.60 Mbps256.00 Mbps

• どうすれば、高速化できるか?
1. Window-Scale Option (前述)
2. 複数のTCPパイプを利用✓ TCP port-ID を複数利用する。

39

40

BW x RTT を測定できないか ?
1. RTT✓ ping (by ICMP echo request/reply) で 可能

41

“Destintionunreachable..….”“echo request/reply”

Src1

Dst1

42

BW x RTT を測定できないか ?
1. RTT✓ ping (by ICMP echo request/reply) で 可能

2. BW
✓ Packet-Pair で可能✓ IPパケットを、連続して転送した時の、IPパケットの到着間隔 で 利用可能な 帯域幅の最大値が 分かる。
43

D1

D2

B1

D4

D3

B2

B4

B3

サーバ

R2

R1

M/B1

M/B2

R3

M/B3

受信ノードで観測される パケットの到着間隔 ΔTi
min{ΔTi} ＝ M/B3
つまり、サーバでの IPパケットの到着間隔の最小値で、経路上での 利用可能な最大帯域幅が分かる(図では、B3 )。

M/B4

M/B344

RFC 1379 ; T/TCP- Transaction TCP [目的]TCPコネクションの確立・開放手続きの速度アップ[方法]
・ CC (Connection Count) Option
・ SYNへのPiggy-back ; “half-synchronization”(1) SYN, Data, FIN, CC(2) SYN, SYN-ACK, Data, FIN, FIN-ACK,CC, CC-Echo(3) FIN-ACK45

RFC 1379 ; T/TCP
ServerClientSYN_ACK(a+1,b)

ClientServerSYN,S-ack,Data,
F,F-ack

Data_ACK(a+2,b+1)
FIN (m,s)
ACK (m+1)
FIN_ACK (m+1,s)ACK (s+1)

9 セグメント→ 3 セグメント46

47

RTO Expired Retransmission
bsdi.1023
134

再送間隔
1.5 sec
3 sec

6786 sec
91764 sec18

svr4.discard

SYN 0:0(0) win4096 <mss1024>
SYN 3:3(0) ack 1 win4096 <mss1024>
ack 4 win4096
PSH 1:15(14) ack 4 win4096
ack 15 win 4096

2

再送トライ (RTO; 再送タイマ)
RTO = 1.5 sec /* 変更可能*/
5for ( 9 minutes){if ( RTO expired){retransmission;
RTO=RTO x 2;
RTO=min{64sec, RTO};}}end /* 諦める */48

Retransmission by Duplicated ACK(2) Reception of Duplicated ACK- Fast Retransmission / Fast Recovery
Segment廃棄特性 ;→ “single (or few) segment(S)” あるいは連続多数。
→ 未ACKの同一ACK Segmentsを複数(3回)受信したら、再送。
49

Fast Retransmission by Duplicated ACK
6401:6656(256) ack1
6657:6912(256) ack1
6913:7168(256) ack1
7169:7424(256) ack1

ack 5889
ack 6145

ack 6401
ack 6657

7425:7680(256) ack1

ack 6657 ①

7681:7936(256) ack1

ack 6657 ②

7937:8192（256) ack1
8193:8448(256) ack1

6657:6912(256) ack1
“Fast Retransmission”

ack 6657 ③
ack 6657
ack 6657
ack 6657

8449:8704(256) ack1
8705:8960(256) ack1

ack 8449 win5888

8961:9216(256) ack1

ack 8705 win5888

UDP51UDP Header format
0
7 8
15 16
23 24
31
+--------+--------+--------+--------+|
Source|Destination |
|
Port|
Port|
+--------+--------+--------+--------+||||
Length|Checksum|+--------+--------+--------+--------+|||
data octets ...
|+---------------- ...

53

UDP Header format
07 8
15 16
23 24
31
+--------+--------+--------+--------+|
Source|Destination |
|
Port
|
Port
|
+--------+--------+--------+--------+||||
Length|Checksum|+--------+--------+--------+--------+|||
data octets ...
|+---------------- ...

フロー制御 も 誤り訂正制御
も 行わない。
アプリケーションに任せる。

RTP55

RTP・ RTP; Real-time Transport Protocol
・ RTPはEnd-Hostでのみ適用される(*) ルータでの通信品質はOut-of-Focus
・ 基本仕様; RFC1889, RFC1890
・ Playbackタイミングの再生- Payload Type- Sequence Number- Time-Stamp・ 2対のUDP Portを使用- User Data
- Control Data

・ ContentごとにRTP Payload Formatを規定
56

RTP
・ RTP Payload Format 仕様
RFC2029 ; CellB Video Encoding (for SUN)
RFC2032 ; H.261 Video Stream
RFC2035 ; JPEG-compressed Video
RFC2250 ; MPEG1/MPEG2 Video・ Control Protocol
RTCP ; RTP Control Protocol
・ 通信品質監視機能- 通信受信/送信ノード- 品質監視ノード
57

RTP
・ RTPの仕事;「受信ノードにおいて、送信側から送信されるデータの出力タイミングを再生する。」

受信バッファ

送信ノード

Application

タイミング制御

Generate
Delay-Jitter
58

RTP
d1

d2

d3

d4

・ 送信側タイミング;
t1

t2

t3

t4

t5

t1

t2

t3

t4

t5

T

T+t1

T+t2

T+t3

T+t4

・ 受信側入力タイミング;

・ 受信側出力タイミング;

d1

d2

d3

T+t5

d4

Off-set
59

NAT

60

61

NAT(Network Address Translation)
・ 受信パケットのIPアドレス(src_IP)およびポート番号の(src_port)変換テーブルを持ちIPヘッダの変換。
(RFC1631)(1) Private → Global- DNS ： 宛先ノードのIPアドレスが解決される。
- 受信パケット(dst_IP)→ 送信パケットの(src_IP, src_port)の書換え(2) Global → Private- 受信パケット(src_IP, src_port)→ 送信パケットの(dst_IP)の書換え(*) ポート番号(src_port)の機能(i) src_IPの多重化(ii) dst_IPのマッピング

62

NAT
NAT

A

C

入力
出力アドレス
ポートアドレス ポート
送信 宛先 送信 宛先 送信 宛先 送信 宛先ー ー
Ａ ー
Ｎ ーーー

送信アドレスＡ→Ｎに変換AC

N C
宛先アドレスAC

N C
Ｎ→Ａに変換Traditional NAT
組織内

インターネット
NAT

A
送信ポート番号C

送信アドレス Ａ→Ｎに変換

１００ Ａ
２００ C

１００ Ｎ
２００ C

Ｂａｓｉｃ ＮＡＴ

宛先アドレス

宛先ポート番号
Ｃ ２００
Ａ １００

Ｃ ２００
Ｎ １００

Ｎ→Ａに変換

送信ポート番号

Ａ→Ｎ、１００→１５０に変換

送信アドレス

１００ Ａ
２００ C
宛先ポート番号

１５０ Ｎ２００ C

ＮＡＰＴ

宛先アドレス

Ｃ ２００
Ａ １００

Ｃ ２００
Ｎ １５０
Ｎ→Ａ
１５０→１００に変換

NAPT (Network Address andPort Translation)
172.20.6.1

172.20.6.2

172.20.6.3
NATルータ157.82.246.115
送信元IP=172.20.6.1①

送信元ポート=1234

宛先IP=172.20.6.1
宛先ポート=1234②

インターネットへ

送信元IP=157.82.240.115
送信元ポート=54321

宛先IP=157.82.240.115
宛先ポート=54321① 内から外に向かうパケットがあるとNATルータはポート番号を割当② その後外から来るパケットについてもIPアドレスとポート番号を変換
65

Bi-directional NAT
組織内

インターネット
NATAC（１） ホストＡのアドレスは？
（２）アドレスはＮ

ＤＮＳ

Ｃ ２００
Ａ １００

Ｃ ２００
Ｎ １００

（３）

Ｎ→Ａに変換

送信ポート番号 送信アドレス
１００ Ａ
２００ C

宛先ポート番号Ａ→Ｎに変換
１００ Ｎ
２００ C

宛先アドレス（４）

Twice NAT
組織内

インターネットNATA（１）ホストＣ のアドレスは?
（２）アドレスは Ｎｌ１

ＤＮＳCＡ→Ｎｇ
Ｎｌ１→Ｃに変換

送信アドレス
Ａ
Nl1

（３）

Ng1
Ｃ

宛先アドレス

（４）

Ｃ
Ng1

Nl1
Ａ
Ｎｇ→ＡＣ→Ｎｌ１に変換

However……
• Limitation on the number of session states for
NAT operation• Each user could use certain number of sessions– How many sessions ?
– Even as the best case, 65,536 is the maximum
number of sessions, shared by customers
accommodated into a single IPv4 address➔ When the number of users is30 sessions➔ This means……..
68

2,000, it will be onlyLimitation of NAT Solution
Host
Host

Host
NAT

Host

Host

Host
Maximum # of sessions
69

Limitation of NAT Solution
Host

You may have alreadyexperienced!!!!
Host

Host

Host

Host

NAT

Host

Maximum # of sessions
70

Max 30 Connections

71

Max 20 Connections

72

Max 15 Connections73

Max 10 Connections

74

Max 5 Connections

75

Some examples of major Web site
Application
No operation
Yahoo top page
Google image search
ニコニコ動画
OCN photo friend
iTunesiGoogle
楽天(Rakuten)
Amazon
HMVYouTube76# of TCP sessions
5～1010～2030～6050～80
170～200+
230～270
80～100
50～60
90
10090

新しい方向性• マルチパス化– MTCP (Multi-Pah TCP)
➔ 複数のIPアドレスを利用• UDP ＋ アプリケーション での実装
– QUIC(Quick UDP Internet Connection)(*) Proposed and implemented by Google
1. 初期設定のための Hand-Shake を高速化
2. 前方誤り訂正機能(FEC：Forward Error Correction)
3. 暗号化
4. 自由なフロー制御
77