そういえば、GNU/Linux では、getsockopt の TCP_INFO で TCP の state を見れる。
ある端末で以下のように TCP のサーバを動かす
% nc -v -l -p 9999 Listening on [0.0.0.0] (family 2, port 9999)
で、次のようにして接続して getsockopt(TCP_INFO) すると、state=ESTABLISHED ということで、TCP state は ESTABLISHED であることがわかる。 (行は長いので改行してある)
% ruby -rsocket -e 'Socket.tcp("127.0.0.1", 9999) {|s| p s.getsockopt(Socket::IPPROTO_TCP, Socket::TCP_INFO) }' #<Socket::Option: INET TCP INFO state=ESTABLISHED ca_state=Open retransmits=0 probes=0 backoff=0 options=TIMESTAMPS,SACK,WSCALE rto=0.204000s ato=0.000000s snd_mss=21845 rcv_mss=536 unacked=0 sacked=0 lost=0 retrans=0 fackets=0 last_data_sent=0.000s last_ack_sent=0.000s last_data_recv=0.000s last_ack_recv=0.000s pmtu=65535 rcv_ssthresh=43690 rtt=0.000022s rttvar=0.000011s snd_ssthresh=2147483647 snd_cwnd=10 advmss=65483 reordering=3 rcv_rtt=0.000000s rcv_space=43690 total_retrans=0 (120 bytes too long)>
[latest]