naoki86star

このインターネットの片隅で、バルスと唱えてみる

tfo(TCP fastopen)のこと

基本的には、TCPの3handshakeでのオーバーヘッドを補うような仕組み、とのこと。それを、graphite carbonのデータポストのような使い方少しでも改善になるかな、と試してみる。

サーバ側は、linux3.7以降で/proc/sys/net/ipv4/tcpfast_open の値が0x01ビットがたっていれば、特に実装を変える必要がなくtfoのパケットをさばいてくれる。

クライアントは、tfoの設定をenableにした上で、実装も考慮してあげる必要がある。実装レベルではちょっと従来のTCPで書かれているのを引数を変えてあげるレベルでは対応できないくらいの差がでてきてしまう、ように理解している。複雑になるわけでないのだが、むしろUDPの書き方に近いと思った。

import sys, socket, time

MSG_FASTOPEN = 0x20000000

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
msg = "..."
s.sendto(msg, MSG_FASTOPEN, ("192.168.0.1", 2003))
time.sleep(1)
s.send("... ")
s.close()
import "strings"
import "syscall"
import "fmt"

   var buffer strings.Builder
   
   ... building buffer

   var ip [4]byte
   copy(ip[:], net.ParseIP("192.168.0.1")[12:16])
   sockaddr := &syscall.SockaddrInet4{Addr: ip, Port: 2003}

   conn , _ := syscall.Socket(syscall.AF_INET, syscall.SOCK_STREAM, 0)
   defer syscall.Close(conn)

   err = syscall.Sendto(conn, []byte(buffer.String()), syscall.MSG_FASTOPEN, &sockaddr)
  • Windowsでどうやって実装するかわからない、golang/Windowsだとsyscallモジュールの中身が少し違う。python/Windowsでもだめだった。
  • もしかして、dnsとかntpのクライアントに応用してそれが広まるといいことあるのかもしれない。