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

android ( Linux )系统中,多线程的 socket,各个 socket 的带宽是怎么分配的

  •  
  •   Registering · 2018-07-13 15:30:46 +08:00 · 1201 次点击
    这是一个创建于 2333 天前的主题,其中的信息可能已经有所发展或是发生改变。

    突然有个疑问。

    如果多个并发线程下载资源(当然不考虑极限情况,我们当做只有 50 线程并发吧),那么这个时候,不同线程之间会不会影响彼此的带宽,甚至导致新的 socket 建立失败。

    直觉告诉我是不会相互影响的,不同 TCP 连接,接收端都会给服务器端一个接收窗口大小(滑动窗口协议),只是这个接收窗口大小是怎么定义的呢?是不是整个机器的接收窗口大小,要平均分摊给当前连接中的所有 TCP 连接。

    感觉自己的这个猜测是对的,但是暂时找不到资料论证

    linyinma
        1
    linyinma  
       2018-07-13 17:34:54 +08:00
    神逻辑,你将协议 与 内核协议栈实现混这说,你的描述说错也没错,但就是不是那么回事,比如你说整个机器接受窗口,是否是平群分配.... 首先网卡接收到的数据存放到内核缓冲区内(的却也只有一个),然后内核缓冲区存放的数据根据 TCP 信息将数据移动到具体的某一个 TCP 连接上的接收缓冲区内,也就是接收滑动窗口内, 滑动窗口也不可能向你说的什么平均分配,socket 频繁的创建,按照你的思路内核一直在做平群工作...

    而窗口大小是由内核决定也可以修改比如:net.ipv4.tcp_rmem:这个参数定义了 TCP 接收缓冲(用于 TCP 接收滑动窗口)的最小值、默认值、最大值
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6228 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:35 · PVG 10:35 · LAX 18:35 · JFK 21:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.