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

TCP 基础连接中, sendall 和 send 是否无本质区别?

  •  
  •   LeeReamond · 2021-03-06 13:18:33 +08:00 · 771 次点击
    这是一个创建于 1350 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,在做一些 TCP 的小实验,但是本地环境网络太快了,很难模拟封包丢失之类的情况,所以来 v2 问一下老哥。

    我的问题是,

    一、

    假如一个客户端连接到了服务端,中间经过三次握手之后开始正式传递内容。假设客户端想要发送一个长度为 40K 的图片,调用 socket.sendall(picture)这种感觉的命令,由于较长被拆成 10 个封包发送。在发送完毕后恰好客户端电脑断电,且恰好 10 个封包中第五个丢失了,那么理论上服务端的应用层是否只能读出来前四个封包?

    二、

    如果第一问成立,将上述问题改为,10 次 send 的过程,并非由系统内核拆分,而是由应用层主动拆分,调用十次 socket.send 命令发送,最终表现出来的行为是否一致?

    三、

    假设我有一个应用场景,需要在两个进程之间建立 RPC 连接,基于 TCP 层设计,那么出于效率考量,最好复用同一个 TCP 连接,即不同反复重复握手、分手的过程。每次 A 端生成若干请求封包,发送至 B 端,这些都发生在同一个连接内部,比如发送两次请求,是否意味着如果第一个请求挂了,第二个请求永远收不到。还是连接内部也有区分,比如按一次 send 区分,前一个 sendall 的排序不影响新的 sendall 的排序?

    如果同一连接内部按 sendall 划分排序的话,保证两次请求之间的隔离性似乎只能靠重新建立一次 TCP 连接来实现了?

    6 条回复    2021-03-07 09:43:06 +08:00
    ryd994
        1
    ryd994  
       2021-03-06 14:39:51 +08:00 via Android
    问问题之前能不能 ask the fking Google ?
    https://stackoverflow.com/questions/34252273/what-is-the-difference-between-socket-send-and-socket-sendall

    还有,TCP 是字节流,你为什么要关心几个包?
    bowser1701
        2
    bowser1701  
       2021-03-06 19:14:00 +08:00 via iPhone
    @ryd994 请教一下 想知道 TCP 是字节流,但是 IP 层要分包,TCP 为了可靠要分段,为什么不关心几个包呀。
    LeeReamond
        3
    LeeReamond  
    OP
       2021-03-07 00:48:12 +08:00
    @ryd994 那大佬 google 到答案了,能回答我一楼中假设环境的 fking 问题了么?
    LeeReamond
        4
    LeeReamond  
    OP
       2021-03-07 00:57:58 +08:00
    @bowser1701 学习都是这样的,学校老师肯定是讲不明白的,你要面向谷歌编程,然后提个自己困惑的问题就会有人出来嘲讽你基础不牢写个 X 的代码,并且嘲讽的同时又不告诉你正确是什么样的。真较真起来他们又问你你写的是应用层搞这么细的有什么意义,反正我也不知道全网谁懂这些东西,看起来人人都懂,可就是问谁都不告诉我┓( ´∀` )┏
    ryd994
        5
    ryd994  
       2021-03-07 03:58:49 +08:00
    @bowser1701 因为你不应该关心。OSI 分层就是为了隔离实现细节。底层实现可以自由选择分几个包。我写个内核模块。一个包一字节,或者一个包发三次,应用层都不应该有正确性的问题,因为无论底层分几个包发几次,对应用层来说,只要提供了“可靠的字节流”这一功能,就是正确的协议。

    上层关心底层实现的情况通常是性能调优。

    @LeeReamond 问题一二已在 1 楼的链接给出。
    问题三的答案就是“TCP 是字节流”
    LeeReamond
        6
    LeeReamond  
    OP
       2021-03-07 09:43:06 +08:00 via Android
    @ryd994 感谢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4949 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 09:41 · PVG 17:41 · LAX 01:41 · JFK 04:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.