V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
RE
V2EX  ›  问与答

想请教各位,有关 UDP / NAT 穿透的一些疑惑

  •  1
     
  •   RE · 2017-02-08 19:03:18 +08:00 · 2620 次点击
    这是一个创建于 2874 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这两天一直在看 NAT 穿透,想让两个客户端建立连接,网上有很多文章都是关于 UDP 穿透的,实现起来也简单。但我有几个疑惑,想请教大家。

    1. 网上说每个 UDP 包的大小,不能超过 xx KB (说法不一),如果想发送一个较大的文件应该在业务层面自己处理分包和合并的问题。那互联网上常见的基于 UDP 通讯的软件(例如 BT 下载,视频通话等),对于 UDP 包的校验及处理,岂不是很麻烦?

    2. 如果说单个 UDP 包不能太大,那把大文件拆分成小包之后,每个包还要加入序位信息等,岂不是能使用的“空间”就更小了?
    12 条回复    2017-02-15 16:19:02 +08:00
    kokutou
        1
    kokutou  
       2017-02-08 19:08:38 +08:00
    UnisandK
        2
    UnisandK  
       2017-02-08 19:38:55 +08:00
    所以有了 TCP 嘛。。你要打洞只能用 UDP 这些要实现肯定是绕不过去的
    buckethead1
        3
    buckethead1  
       2017-02-08 20:22:46 +08:00
    除非设置了 don't fragment flag, 否则协议会自动帮你分包,接到的时候会自动合并

    but 你需要自行判断超时,重传,一个类似滑动窗口之类的东西 balabala 之类的
    buckethead1
        4
    buckethead1  
       2017-02-08 20:23:40 +08:00
    @buckethead1 接受之后自动合并这个描述不对 上层来看都一样
    RE
        5
    RE  
    OP
       2017-02-08 21:06:58 +08:00
    @UnisandK 其实我是更偏向用 TCP 来建立两个客户端的连接的,但是 TCP 打洞要稍微再复杂一些…
    gamexg
        6
    gamexg  
       2017-02-09 09:32:40 +08:00 via Android
    udp 包超过 mtu 尺寸会自动分包,然后自动合并,但是如果中间丢失了一个子包那么会造成都重传,所以不建议。
    bintianbaihua
        8
    bintianbaihua  
       2017-02-09 09:41:52 +08:00
    skylancer
        9
    skylancer  
       2017-02-09 11:04:57 +08:00
    我会建议不要超过 512 ,因为你不能确保你的所有路径都是经过正常的现代路由器,几百年前的破烂玩意 512 就 GG 了
    RE
        10
    RE  
    OP
       2017-02-09 14:33:53 +08:00 via iPhone
    @skylancer 是 512B 还是 512K ……
    nneedd
        11
    nneedd  
       2017-02-15 15:51:01 +08:00
    RE
        12
    RE  
    OP
       2017-02-15 16:19:02 +08:00
    @nneedd 你真的看帖子了吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3600 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:54 · PVG 12:54 · LAX 20:54 · JFK 23:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.