基本的には、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)