V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
LeeReamond
V2EX  ›  问与答

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

  •  
  •   LeeReamond · Mar 6, 2021 · 1091 views
    This topic created in 1878 days ago, the information mentioned may be changed or developed.

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

    我的问题是,

    一、

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

    二、

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

    三、

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

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

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

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

    @LeeReamond 问题一二已在 1 楼的链接给出。
    问题三的答案就是“TCP 是字节流”
    LeeReamond
        6
    LeeReamond  
    OP
       Mar 7, 2021 via Android
    @ryd994 感谢!
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5573 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 03:45 · PVG 11:45 · LAX 20:45 · JFK 23:45
    ♥ Do have faith in what you're doing.