# Round Trip Time と私の時間
:::info
この記事は[群馬大学電子計算機研究会 IGGG Advent Calendar 2017](https://adventar.org/calendars/2300) 15日目の記事です
:::
## なぜRound Trip Timeが大事か
TCPを利用した通信において,Round Trip Time(RTT)は非常に重要になります.
TCPにおけるRTTはセグメント送信からACKが戻ってくるまでの時間を計算することで求められるようです.
RTTを用いて,TCPのスループットを決定することができます.
$T$をスループット,$W$をTCPウィンドウサイズ(KB),$t$をRTT(s)とすると,
$T = \frac{W *8}{t}$
と求められます.[^1]
TCPの場合,ACKが戻ってこないと次のセグメントを送ることができず待つため,このRTTで待つ時間というのを最適な値にすることが,スループットの決定に影響します.
[^1]: http://jehupc.exblog.jp/15349359/
## RTTを計測する
RTTを計測する簡単な方法は`ping`コマンドを利用することです.今回はUbuntu Linuxを利用してやってみます.
```
root@9b11a86b1024:/# ping -c 5 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=37 time=6.818 ms
64 bytes from 8.8.8.8: icmp_seq=1 ttl=37 time=6.932 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=37 time=15.309 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=37 time=7.459 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=37 time=82.272 ms
--- 8.8.8.8 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max/stddev = 6.818/23.758/82.272/29.431 ms
```
`round-trip min/avg/max/stddev`の部分を読めばRTTが分かります.それぞれ最小,平均,最大,標準偏差であることが読めます.
今回は`GNU inetutils`の`ping`を用いてみましたが,その他のOSやpingツールでも大体同じ結果が得られるはずです.
## TCPのRTTを良い感じ制御 in Linux
現在のLinuxにはGoogleの開発した(?)[Bottleneck Bandwidth and RTT (BBR) congestion control](https://github.com/torvalds/linux/blob/master/net/ipv4/tcp_bbr.c)が実装されています.
Linux 2.6では[CUBIC-TCP](http://blog.yuuk.io/entry/cubictcp)が実装されているようです.
## 詳説をしたかったんですが
やる気が起きませんでした.すみません.