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

2018-07-13 15:30:46 +08:00
 Registering

突然有个疑问。

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

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

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

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

而窗口大小是由内核决定也可以修改比如:net.ipv4.tcp_rmem:这个参数定义了 TCP 接收缓冲(用于 TCP 接收滑动窗口)的最小值、默认值、最大值

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/470623

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX