Skip to content

Instantly share code, notes, and snippets.

@xjdrew
Last active August 13, 2020 03:28
Show Gist options
  • Save xjdrew/1ac0c03717b0f63b5fdd4aadba1528df to your computer and use it in GitHub Desktop.
Save xjdrew/1ac0c03717b0f63b5fdd4aadba1528df to your computer and use it in GitHub Desktop.

build

go build tcpinfo.go

run

./tcpinfo -h
./tcpinfo

feature

print tcp options, include:

  • Maximum segment size
  • Window scale
  • Selective Acknowledgement
  • others
package main
import (
"encoding/json"
"flag"
"fmt"
"log"
"net"
"github.com/mikioh/tcp"
"github.com/mikioh/tcpinfo"
)
func handleConnection(conn net.Conn, monitor bool) {
fmt.Println("new connection:", conn.RemoteAddr())
tc, err := tcp.NewConn(conn)
if err != nil {
conn.Close()
log.Printf("tcp.NewConn failed:", err)
return
}
var o tcpinfo.Info
var b [256]byte
for {
i, err := tc.Option(o.Level(), o.Name(), b[:])
if err != nil {
log.Println(err)
return
}
txt, err := json.Marshal(i)
if err != nil {
log.Println(err)
return
}
fmt.Println(string(txt))
if !monitor {
break
}
}
}
func main() {
listen := flag.String("listen", ":8081", "listen adddress")
monitor := flag.Bool("monitor", false, "monitor options")
flag.Parse()
ln, err := net.Listen("tcp", *listen)
if err != nil {
log.Printf("listen failed: %s", err)
return
}
log.Println("listen:", *listen)
for {
conn, err := ln.Accept()
if err != nil {
// handle error
log.Println("accept failed:", err)
break
}
go handleConnection(conn, *monitor)
}
}
@xjdrew
Copy link
Author

xjdrew commented Aug 13, 2020

options:

{
    "ato": 0,
    "cong_ctl": {
        "snd_ssthresh": 2147483647,
        "rcv_ssthresh": 65483,
        "snd_cwnd_bytes": 0,
        "snd_cwnd_segs": 10
    },
    "flow_ctl": {
        "rcv_wnd": 65483
    },
    "last_ack_rcvd": 0,
    "last_data_rcvd": 0,
    "last_data_sent": 0,
    "opts": {
        "sack": true,
        "tmstamps": true,
        "wscale": 7
    },
    "peer_opts": {
        "sack": true,
        "tmstamps": true,
        "wscale": 7
    },
    "rcv_mss": 536,
    "rto": 200000000,
    "rtt": 14000,
    "rttvar": 7000,
    "snd_mss": 32768,
    "state": "established",
    "sys": {
        "path_mtu": 65535,
        "adv_mss": 65483,
        "ca_state": 0,
        "rexmits": 0,
        "backoffs": 0,
        "wnd_ka_probes": 0,
        "unacked_segs": 0,
        "sacked_segs": 0,
        "lost_segs": 0,
        "retrans_segs": 0,
        "fack_segs": 0,
        "reord_segs": 3,
        "rcv_rtt": 0,
        "total_retrans_segs": 0,
        "pacing_rate": 18446744073709551615,
        "thru_bytes_acked": 0,
        "thru_bytes_rcvd": 0,
        "segs_out": 0,
        "segs_in": 2,
        "not_sent_bytes": 0,
        "min_rtt": 14000,
        "data_segs_out": 0,
        "data_segs_in": 0
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment