你正在使用的Go版本是( go version
)?
$ go version
go1.14.9
这个问题在最新版本的发布中是否会重现?
是的
你正在使用的操作系统和处理器架构是( go env
)?go env
输出
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/luizluca/.cache/go-build"
GOENV="/home/luizluca/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/luizluca/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/lib64/go/1.14"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/lib64/go/1.14/pkg/tool/linux_amd64"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/home/luizluca/prog/blackbox_exporter/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build078173291=/tmp/go-build -gno-record-gcc-switches"
你做了什么?
根据 RFC8200
Hop Limit 8-bit unsigned integer. Decremented by 1 by
each node that forwards the packet. When
forwarding, the packet is discarded if Hop
Limit was zero when received or is decremented
to zero. A node that is the destination of a
packet should not discard a packet with Hop
Limit equal to zero; it should process the
packet normally.
所以,HopLimit == 0 对于在同一子网内的目标发送或接收具有HopLimit 0的数据包是完全有效的。实际上,发送HopLimit==1或HopLimit==0与避免将其转发到不同的网络一样有效。区别在于接收数据包时的情况。如果主机收到具有HopLimit==0的数据包,它可以说它从未被转发过,而HopLimit==1可能只是使用了最后允许的跳数。
然而,ipv6.ControlMessage告诉我它必须在1到255之间。
HopLimit int // hop limit, must be 1 <= value <= 255 when specifying
https://github.com/golang/net/blob/a7d1128ccaa05167332a625f69773af1a0c6b39c/ipv6/control.go#L57
因此,它应该接受HopLimit值在0到255之间。这带来了一个问题:ControlMessage中的HopLimit的初始值(对于go中任何非显式初始化的整数)为0。没有直接的方法来判断ControlMessage中的HopLimit是否缺失或定义为零。
Go也会忽略我在WriteTo()中将其设置为0的情况。也许一个简单的解决方法是将其初始值设置为-1。
顺便说一下,IPv4 TTL没有与TTL==0的数据包必须无条件销毁的问题。
你期望看到什么?
类似于:
+++ https://github.com/golang/net/blob/a7d1128ccaa05167332a625f69773af1a0c6b39c/ipv6/control.go#L57
- HopLimit int // hop limit, must be 1 <= value <= 255 when specifying
+ HopLimit int = -1 // hop limit, must be 0 <= value <= 255 when specifying
+++ https://github.com/golang/net/blob/a7d1128ccaa05167332a625f69773af1a0c6b39c/ipv6/control.go#L84
- if ctlOpts[ctlHopLimit].name > 0 && cm.HopLimit > 0 {
+ if ctlOpts[ctlHopLimit].name > 0 && cm.HopLimit >= 0 {
我应该提交一个PR吗?
你看到了什么?
我无法在ipv6.WriteTo()中将ControlMessage.HopLimit设置为0,也无法判断ipv6.ReadFrom()中的ControlMessage.HopLimit是否缺失或为零。
1条答案
按热度按时间0g0grzrc1#
CC @mikioh, @ianlancetaylor per owners。