HTTP 多线程下载同一个文件,是从不同的客户端口发出的请求吗?

2021-04-19 06:05:29 +08:00
 hanguofu
如果使用多线程从同一个服务器上下载同一个文件,假设该服务器支持 获取文件的部分内容 ( range & content-range ) , 客户端如果同时发出 10 个并发请求的话,这些请求是从 客户端 的 同一个端口 发出去的吗 ?
2873 次点击
所在节点    Go 编程语言
18 条回复
missdeer
2021-04-19 07:18:49 +08:00
客户端侧不同连接不同端口
AngryPanda
2021-04-19 09:02:07 +08:00
开启多线程下载:

```
axel -n 20 https://mirrors.163.com/ubuntu-releases/20.10/ubuntu-20.10-live-server-amd64.iso
```

另外开个终端看端口 `netstat -antp | grep axel`, 输出类似于:

```
tcp 0 0 192.168.0.101:50326 125.77.20.37:80 ESTABLISHED 18142/axel
tcp 0 0 192.168.0.101:48718 183.146.17.167:80 ESTABLISHED 18142/axel
tcp 0 0 192.168.0.101:56402 106.225.229.135:80 ESTABLISHED 18142/axel
tcp 0 0 192.168.0.101:48720 183.146.17.167:80 ESTABLISHED 18142/axel
tcp 0 0 192.168.0.101:52922 60.174.42.166:80 ESTABLISHED 18142/axel
tcp 0 0 192.168.0.101:58068 183.146.17.165:80 ESTABLISHED 18142/axel
tcp 0 0 192.168.0.101:50356 125.77.20.37:80 ESTABLISHED 18142/axel
tcp 0 0 192.168.0.101:48712 183.146.17.167:80 ESTABLISHED 18142/axel
tcp 0 0 192.168.0.101:58060 183.146.17.165:80 ESTABLISHED 18142/axel
tcp 0 0 192.168.0.101:58094 183.146.17.165:80 ESTABLISHED 18142/axel
tcp 0 0 192.168.0.101:50340 125.77.20.37:80 ESTABLISHED 18142/axel
tcp 0 0 192.168.0.101:36068 183.146.17.166:80 ESTABLISHED 18142/axel
tcp 0 0 192.168.0.101:33660 106.225.229.134:80 ESTABLISHED 18142/axel
tcp 0 0 192.168.0.101:48234 125.77.20.38:80 ESTABLISHED 18142/axel
tcp 0 0 192.168.0.101:50324 125.77.20.37:80 ESTABLISHED 18142/axel
tcp 0 0 192.168.0.101:44112 60.174.42.167:80 ESTABLISHED 18142/axel
tcp 0 0 192.168.0.101:53444 60.174.42.165:80 ESTABLISHED 18142/axel
tcp 0 0 192.168.0.101:52910 60.174.42.166:80 ESTABLISHED 18142/axel
tcp 0 0 192.168.0.101:33686 106.225.229.134:80 ESTABLISHED 18142/axel
tcp 0 0 192.168.0.101:48242 125.77.20.38:80 ESTABLISHED 18142/axel
```
ebingtel
2021-04-19 09:02:30 +08:00
取决于用了几个连接……多连接的话,客户端是从多个端口发出请求
zongren
2021-04-19 09:18:50 +08:00
http 无状态,取决于你的 header 里有没有设备唯一标识
no1xsyzy
2021-04-19 09:25:19 +08:00
客户端用同一个端口能算是并发请求吗?
五元组唯一确定一个连接
jorneyr
2021-04-19 09:40:51 +08:00
每个连接在客户端都有自己独立的、唯一的、不冲突端口
abersheeran
2021-04-19 09:42:13 +08:00
多线程下载能提高速度的原因就是用了多个 TCP 信道。
ericls
2021-04-19 10:20:10 +08:00
看客户端的具体实现
ch2
2021-04-19 10:24:21 +08:00
多连接就是多端口,不开多连接就只有一个端口
caola
2021-04-19 10:25:12 +08:00
http2 应该是一个端口通道吧
est
2021-04-19 10:33:44 +08:00
这个情况可以讨论的

1. 如果客户端有多个 IP,一般不会来自同一个端口。但是可以做到
2. 如果服务器端有多个 IP,可以做到客户端来自同一个端口
3. 传输协议如果是 h2 之类的支持复用的,那么多半是来自同一个端口
zhengxiaowai
2021-04-19 13:42:16 +08:00
HTTP/1.1 只能是 ping-pong 模式,所以只能是多个链接。。。
newmlp
2021-04-19 13:48:11 +08:00
http1.1 肯定是多个端口,因为每个 tcp 链接算一个会话
ysc3839
2021-04-19 19:40:34 +08:00
一般口头上说的“多线程下载”其实指的是多连接下载,在这个语境下是从不同端口发出去的。
css3
2021-04-19 19:44:57 +08:00
顺着再请教下这个问题,多个线程下载同一个文件,是要把一个文件拆成多份吗?最后再合并成一个吗?
lc1450
2021-04-19 20:28:06 +08:00
@css3 不需要,多线程下载之前就知道了文件多大.然后创建个等大小的空文件,下载时根据 range 参数填空就行
css3
2021-04-20 08:24:48 +08:00
@lc1450 那下载完不是也还是多个吗
iminto
2021-04-20 08:37:13 +08:00
@css3 下载时根据 range 参数填空...怎么就变成多个文件了

一个大房间,开了四个门,走进来四组人,按顺序就位,不还是一个房间么。。。

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

https://tanronggui.xyz/t/771533

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

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

© 2021 V2EX