diff --git a/cmd/cmd.go b/cmd/cmd.go index 41aff3d..32ec6be 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -61,8 +61,8 @@ func Excute() { srcAddr := parser.String("s", "source", &argparse.Options{Help: "Use source src_addr for outgoing packets"}) srcDev := parser.String("D", "dev", &argparse.Options{Help: "Use the following Network Devices as the source address in outgoing packets"}) //router := parser.Flag("R", "route", &argparse.Options{Help: "Show Routing Table [Provided By BGP.Tools]"}) - packetInterval := parser.Int("z", "send-time", &argparse.Options{Default: 100, Help: "Set how many [milliseconds] between sending each packet.. Useful when some routers use rate-limit for ICMP messages"}) - ttlInterval := parser.Int("i", "ttl-time", &argparse.Options{Default: 500, Help: "Set how many [milliseconds] between sending packets groups by TTL. Useful when some routers use rate-limit for ICMP messages"}) + packetInterval := parser.Int("z", "send-time", &argparse.Options{Default: 50, Help: "Set how many [milliseconds] between sending each packet.. Useful when some routers use rate-limit for ICMP messages"}) + ttlInterval := parser.Int("i", "ttl-time", &argparse.Options{Default: 50, Help: "Set how many [milliseconds] between sending packets groups by TTL. Useful when some routers use rate-limit for ICMP messages"}) timeout := parser.Int("", "timeout", &argparse.Options{Default: 1000, Help: "The number of [milliseconds] to keep probe sockets open before giving up on the connection."}) packetSize := parser.Int("", "psize", &argparse.Options{Default: 52, Help: "Set the packet size (payload size)"}) str := parser.StringPositional(&argparse.Options{Help: "IP Address or domain name"}) diff --git a/trace/udp.go b/trace/udp.go index eaf09d3..e3d2dcf 100644 --- a/trace/udp.go +++ b/trace/udp.go @@ -2,6 +2,7 @@ package trace import ( "log" + "math/rand" "net" "sync" "time" @@ -169,46 +170,53 @@ func (t *UDPTracer) send(ttl int) error { srcIP, srcPort, udpConn := t.getUDPConn(0) defer udpConn.Close() - var payload []byte - if t.Quic { - payload = GenerateQuicPayloadWithRandomIds() - } else { - ipHeader := &layers.IPv4{ - SrcIP: srcIP, - DstIP: t.DestIP, - Protocol: layers.IPProtocolUDP, - TTL: uint8(ttl), - } - - udpHeader := &layers.UDP{ - SrcPort: layers.UDPPort(srcPort), - DstPort: layers.UDPPort(t.DestPort), - } - _ = udpHeader.SetNetworkLayerForChecksum(ipHeader) - buf := gopacket.NewSerializeBuffer() - opts := gopacket.SerializeOptions{ - ComputeChecksums: true, - FixLengths: true, - } - - desiredPayloadSize := t.Config.PktSize - payload := make([]byte, desiredPayloadSize) - copy(buf.Bytes(), payload) - - if err := gopacket.SerializeLayers(buf, opts, udpHeader); err != nil { - return err - } - - payload = buf.Bytes() + //var payload []byte + //if t.Quic { + // payload = GenerateQuicPayloadWithRandomIds() + //} else { + ipHeader := &layers.IPv4{ + SrcIP: srcIP, + DstIP: t.DestIP, + Protocol: layers.IPProtocolUDP, + TTL: uint8(ttl), } + udpHeader := &layers.UDP{ + SrcPort: layers.UDPPort(srcPort), + DstPort: layers.UDPPort(t.DestPort), + } + _ = udpHeader.SetNetworkLayerForChecksum(ipHeader) + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{ + ComputeChecksums: true, + FixLengths: true, + } + + desiredPayloadSize := t.Config.PktSize + payload := make([]byte, desiredPayloadSize) + // 设置随机种子 + rand.Seed(time.Now().UnixNano()) + + // 填充随机数 + for i := range payload { + payload[i] = byte(rand.Intn(256)) + } + //copy(buf.Bytes(), payload) + + if err := gopacket.SerializeLayers(buf, opts, udpHeader, gopacket.Payload(payload)); err != nil { + return err + } + + //payload = buf.Bytes() + //} + err = ipv4.NewPacketConn(udpConn).SetTTL(ttl) if err != nil { return err } start := time.Now() - if _, err := udpConn.WriteTo(payload, &net.UDPAddr{IP: t.DestIP, Port: t.DestPort}); err != nil { + if _, err := udpConn.WriteTo(buf.Bytes(), &net.UDPAddr{IP: t.DestIP, Port: t.DestPort}); err != nil { return err }