server: MTU probe (MTU_PROBE/MTU_ACK) — path-MTU / black-hole measurement
Server ACKs each DF-flagged probe with a tiny MTU_ACK carrying the size it received; the client binary-searches the path MTU. Non-amplifying by construction. Tested. Also records: v0.3.2 (http-echo + tls-reference) verified live on fmr, and the finding that upstream trains are already observable via the observations API (dedicated TRAIN_REPORT deferred — needs an anti-amplification grant + columnar encoding). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
38fb73c34e
commit
c9e0d06ea2
@@ -29,6 +29,8 @@ const (
|
||||
TypeEchoResp = 0x02
|
||||
TypeTimesyncReq = 0x07
|
||||
TypeTimesyncRsp = 0x08
|
||||
TypeMtuProbe = 0x09
|
||||
TypeMtuAck = 0x0A
|
||||
TypeDelayedEcho = 0x0B
|
||||
)
|
||||
|
||||
@@ -132,11 +134,24 @@ func (s *Server) handle(conn *net.UDPConn, raddr netip.AddrPort, pkt []byte, tRx
|
||||
s.echoResp(conn, raddr, sess, pkt, seq, tRxNs)
|
||||
case TypeTimesyncReq:
|
||||
s.timesyncResp(conn, raddr, sess, pkt, seq, tRxNs)
|
||||
case TypeMtuProbe:
|
||||
s.mtuAck(conn, raddr, sess, seq, len(pkt))
|
||||
default:
|
||||
slog.Debug("unhandled data-plane type", "type", typ)
|
||||
}
|
||||
}
|
||||
|
||||
// mtuAck replies to an MTU_PROBE with a small MTU_ACK carrying the total
|
||||
// datagram size the server actually received (spec §3.2). The client sends
|
||||
// DF-flagged probes of increasing size and binary-searches the path MTU / a
|
||||
// black hole from which sizes stop being acknowledged. The ACK is tiny, so it
|
||||
// can never amplify regardless of probe size.
|
||||
func (s *Server) mtuAck(conn *net.UDPConn, raddr netip.AddrPort, sess *session.Session, seq uint32, received int) {
|
||||
var payload [4]byte
|
||||
binary.BigEndian.PutUint32(payload[:], uint32(received))
|
||||
s.send(conn, raddr, sess, TypeMtuAck, seq, payload[:])
|
||||
}
|
||||
|
||||
// Observation block (spec §3.3), fixed 40 bytes appended to the RESP header:
|
||||
// 0 8 t_rx_ns (server clock, process epoch)
|
||||
// 8 8 t_tx_ns
|
||||
|
||||
Reference in New Issue
Block a user