-
Notifications
You must be signed in to change notification settings - Fork 0
/
mtu.go
64 lines (53 loc) · 1.41 KB
/
mtu.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package mtu
import (
"errors"
"github.com/human1001/mtu/internal/com"
)
var err error
type MTU struct {
PingHost string // 探测上行MTU时设置, PING命令请求地址, 默认baidu.com
SeverAddr string // 下行MTU时设置, 服务器IP或域名
// Port 使用端口(UDP), 探测下行链路时设置, 默认 19986
Port int
}
// NewMTU
func NewMTU(f func(m *MTU) *MTU) *MTU {
var m = new(MTU)
m = f(m)
if m.PingHost == "" {
m.PingHost = "baidu.com"
}
if m.Port == 0 {
m.Port = 19986
}
return m
}
// Client 客户端
//
// isUpLink 探测上行路径MTU,否则探测下行MTU
// fastMode 探测上行链路的快速模式,更快
// 如数据包太大时,Ubuntu会提示:ping: local error: message too long, mtu=1400,快速模式直接采用1400这个值
func (m *MTU) Client(isUpLink bool, fastMode bool) (uint16, error) {
if isUpLink {
//Uplink ping
return clientUpLink(m.PingHost, fastMode)
} else {
//Downlink
if m.SeverAddr == "" {
return 0, errors.New("must set MTU.SeverAddr")
}
if ip, err := com.ToIP(m.SeverAddr); err != nil {
return 0, err
} else {
m.SeverAddr = ip.String() //最终SeverAddr的是IP
}
return clientDownLink(m.SeverAddr, m.Port)
}
}
// Sever 服务, 探测下行链路需要
//
// 需要发送自定义IP包, 需要root权限运行。
// 确保服务器的上行MTU足够大, 不应成为链路瓶颈
func (m *MTU) Sever() error {
return m.sever()
}