mnet 0.1.1 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/mnet/version.rb +1 -1
- data/lib/mnet.rb +22 -4
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f6bfc9f4f191ccc85bc0826dce0bb1db83e8b2cc7d3fc8876b1669f59c0f47bb
|
|
4
|
+
data.tar.gz: 7d7993715434586564f1b91ee3e186ca95a638e331794362a992865b6650eb14
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9f57908a81e4eb68d7643f75253dabbcae45de9f8386169301914d15743d8f25d6d5ff89562d1e1bfe09874c8c453cbc48b3a56f1b7974c5427e35e09e97cade
|
|
7
|
+
data.tar.gz: 1dfb4adc41610b08ddf958a58e64e044352a0833aff09cb265aea4d7cd8c7f6a68047992a33e6adb3d74cbd125273a7a87380c81a79fbe56367469528fd769cc
|
data/lib/mnet/version.rb
CHANGED
data/lib/mnet.rb
CHANGED
|
@@ -26,8 +26,8 @@ require "mnet/version"
|
|
|
26
26
|
require "kcp"
|
|
27
27
|
|
|
28
28
|
module Mnet
|
|
29
|
-
MAGIC = "
|
|
30
|
-
MAGIC_LEN =
|
|
29
|
+
MAGIC = "\x12\xE9\x97".b
|
|
30
|
+
MAGIC_LEN = 3
|
|
31
31
|
SESSION_ID_LEN = 16
|
|
32
32
|
|
|
33
33
|
# Conservative MTU for mobile networks / VPN tunnels (mosh uses 1280).
|
|
@@ -75,12 +75,12 @@ module Mnet
|
|
|
75
75
|
|
|
76
76
|
def pack(session_id, seq, ack, type, flags, window, payload = "".b)
|
|
77
77
|
[MAGIC, session_id, seq, ack, type, flags, window, payload]
|
|
78
|
-
.pack("
|
|
78
|
+
.pack("a3a16Q>Q>CCNa*")
|
|
79
79
|
end
|
|
80
80
|
|
|
81
81
|
def unpack(data)
|
|
82
82
|
return nil if data.bytesize < HEADER_LEN
|
|
83
|
-
magic, sid, seq, ack, type, flags, window = data.unpack("
|
|
83
|
+
magic, sid, seq, ack, type, flags, window = data.unpack("a3a16Q>Q>CCN")
|
|
84
84
|
return nil unless magic == MAGIC
|
|
85
85
|
Packet.new(sid, seq, ack, type, flags, window,
|
|
86
86
|
data.byteslice(HEADER_LEN, data.bytesize - HEADER_LEN) || "".b)
|
|
@@ -140,6 +140,15 @@ module Mnet
|
|
|
140
140
|
def sync=(_value)
|
|
141
141
|
end
|
|
142
142
|
|
|
143
|
+
# 返回对端真实地址(Addrinfo)。Session/KcpSession 没有内核 socket,远端地址
|
|
144
|
+
# 由 @peer_addr 跟踪(含切网迁移后的新地址),供 LSocket#io.remote_address 等使用。
|
|
145
|
+
def remote_address
|
|
146
|
+
return nil unless @peer_addr
|
|
147
|
+
Addrinfo.udp(@peer_addr[0], @peer_addr[1])
|
|
148
|
+
rescue SocketError
|
|
149
|
+
nil
|
|
150
|
+
end
|
|
151
|
+
|
|
143
152
|
# Hook overridden by KcpSession to pull decoded bytes out of the engine.
|
|
144
153
|
def pump_recv
|
|
145
154
|
end
|
|
@@ -274,6 +283,11 @@ module Mnet
|
|
|
274
283
|
end
|
|
275
284
|
end
|
|
276
285
|
|
|
286
|
+
# 桥接 socketpair 本身拿不到远端地址,把 remote_address 委托回 session,
|
|
287
|
+
# 这样 SSLServer#io.remote_address 等仍能取到对端真实 ip:port。
|
|
288
|
+
session = self
|
|
289
|
+
app.define_singleton_method(:remote_address) { session.remote_address }
|
|
290
|
+
|
|
277
291
|
@bridge_io = app
|
|
278
292
|
end
|
|
279
293
|
end
|
|
@@ -667,6 +681,10 @@ module Mnet
|
|
|
667
681
|
|
|
668
682
|
@conv = id.unpack1("N") # KCP conv derived from the session id
|
|
669
683
|
@engine = Kcp::Engine.new(@conv)
|
|
684
|
+
# KCP 默认 MTU 1400,但外层还要加 mnet header(42) + GCM nonce/tag(28)。
|
|
685
|
+
# 按 IP_MTU(1280) 反推,KCP 包最多 1280 - 42 - 28 = 1210,留点余量取 1200,
|
|
686
|
+
# 保证「KCP 包 + 封装」不超路径 MTU,避免被 IP 分片(分片常被 NAT/防火墙丢)。
|
|
687
|
+
@engine.mtu = 1200
|
|
670
688
|
|
|
671
689
|
@m = Monitor.new
|
|
672
690
|
@cv = @m.new_cond
|