go build tcpinfo.go./tcpinfo -h
./tcpinfoprint 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) | |
| } | |
| } |
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 } }