Forum: Ruby-core [ruby-trunk - Feature #8871][Open] Server side TCP fast open

C042517d59bed4761cc88681bf71fca8?d=identicon&s=25 Glass_saga (Masaki Matsushita) (Guest)
on 2013-09-06 18:05
(Received via mailing list)
Issue #8871 has been reported by Glass_saga (Masaki Matsushita).

----------------------------------------
Feature #8871: Server side TCP fast open
https://bugs.ruby-lang.org/issues/8871

Author: Glass_saga (Masaki Matsushita)
Status: Open
Priority: Normal
Assignee:
Category: ext
Target version: current: 2.1.0


I propose that ruby support server side TCP fast open (TFO).
TCP fast open reduces step of the handshake process.

detailed information about TCP fast open:
http://lwn.net/Articles/508865/

# example

## server side

require "socket"

serv = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM)
serv.setsockopt(Socket::SOL_TCP, Socket::TCP_FASTOPEN, 5)
addrinfo = Addrinfo.new(Socket.sockaddr_in(8888, "localhost"))
serv.bind(addrinfo)
serv.listen(1)

loop do
  socket, addrinfo = serv.accept
  p socket, addrinfo
  p socket.gets
end

## client side (Python)

#!/usr/bin/env python

import sys, socket

HOST = "localhost"
PORT = 8888

TCP_FASTOPEN = 23
MSG_FASTOPEN = 0x20000000

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# sendto with MSG_FASTOPEN flag
s.sendto("Hello, world!", MSG_FASTOPEN, (HOST, PORT))
s.close()

# tcpdump result

% sudo tcpdump -i lo port 8888

## without TFO

00:46:43.029704 IP localhost.35653 > localhost.8888: Flags [S], seq
1189386786, win 43690, options [mss 65495,sackOK,TS val 476896037 ecr
0,nop,wscale 7], length 0
00:46:43.029735 IP localhost.35653 > localhost.8888: Flags [.], ack
2201113579, win 342, options [nop,nop,TS val 476896037 ecr 476896037],
length 0
00:46:43.029782 IP localhost.35653 > localhost.8888: Flags [P.], seq
0:13, ack 1, win 342, options [nop,nop,TS val 476896037 ecr 476896037],
length 13
00:46:43.029808 IP localhost.35653 > localhost.8888: Flags [F.], seq 13,
ack 1, win 342, options [nop,nop,TS val 476896037 ecr 476896037], length
0

4 packets captured
8 packets received by filter
0 packets dropped by kernel

## with TFO

00:47:01.787766 IP localhost.36567 > localhost.8888: Flags [S], seq
2471392232:2471392245, win 43690, options [mss 65495,sackOK,TS val
476900726 ecr 0,nop,wscale 7,Unknown Option 254f989ccf497eb7eb6ea2e],
length 13
00:47:01.787814 IP localhost.36567 > localhost.8888: Flags [.], ack
874717749, win 342, options [nop,nop,TS val 476900726 ecr 476900726],
length 0
00:47:01.788029 IP localhost.36567 > localhost.8888: Flags [F.], seq 0,
ack 1, win 342, options [nop,nop,TS val 476900726 ecr 476900726], length
0

3 packets captured
6 packets received by filter
0 packets dropped by kernel
18813f71506ebad74179bf8c5a136696?d=identicon&s=25 Eric Wong (Guest)
on 2013-09-06 22:20
(Received via mailing list)
"Glass_saga (Masaki Matsushita)" <glass.saga@gmail.com> wrote:
> https://bugs.ruby-lang.org/issues/8871

> I propose that ruby support server side TCP fast open (TFO).
> TCP fast open reduces step of the handshake process.

Yes.  It should be an easy change.

> TCP_FASTOPEN = 23
> MSG_FASTOPEN = 0x20000000

I think we only need to add two constants to ext/socket/mkconstants.rb
(I haven't bothered updating my system headers, yet, but it should be
easy to test).
This topic is locked and can not be replied to.