java一个端口建立多个连接,多个客户端如何同时连接到服务器上的一个端口,比如80? [重复]...

TCP / HTTP侦听端口:许多用户如何共享同一端口

那么,当服务器侦听TCP端口上的传入连接时会发生什么?例如,假设您在端口80上有一个Web服务器 . 假设您的计算机的公共IP地址为24.14.181.229,并且尝试连接到您的人的IP地址为10.1.2.3 . 此人可以通过打开到24.14.181.229:80的TCP套接字连接到您 . 很简单 .

直觉(和错误地),大多数人认为它看起来像这样:

Local Computer | Remote Computer

--------------------------------

:80 | :80

^^ not actually what happens, but this is the conceptual model a lot of people have in mind.

这很直观,因为从客户端的角度来看,他有一个IP地址,并连接到IP:PORT的服务器 . 由于客户端连接到端口80,那么他的端口也必须是80?这是一个明智的想法,但实际上不会发生什么 . 如果这是正确的,我们只能为每个外部IP地址服务一个用户 . 一旦远程计算机连接,他就会将端口80占用端口80连接,而其他任何人都无法连接 .

必须要理解三件事:

1.)在服务器上,进程正在侦听端口 . 一旦获得连接,它就会将其交给另一个线程 . 通信永远不会占用监听端口 .

2.)操作系统通过以下5元组唯一标识连接:(本地IP,本地端口,远程IP,远程端口,协议) . 如果元组中的任何元素不同,那么这是一个完全独立的连接 .

3.)当客户端连接到服务器时,它会选择一个随机的,未使用的高阶源端口 . 这样,单个客户端可以为同一目标端口提供最多约64k的服务器连接 .

因此,这实际上是客户端连接到服务器时创建的内容:

Local Computer | Remote Computer | Role

-----------------------------------------------------------

0.0.0.0:80 | | LISTENING

127.0.0.1:80 | 10.1.2.3: | ESTABLISHED

看看实际发生了什么

首先,让我们使用netstat来查看这台计算机上发生了什么 . 我们将使用端口500而不是80(因为端口80上发生了大量的东西,因为它是一个公共端口,但在功能上它并没有什么区别) .

netstat -atnp | grep -i ":500 "

正如预期的那样,输出是空白的 . 现在让我们开始一个Web服务器:

sudo python3 -m http.server 500

现在,这是再次运行netstat的输出:

Proto Recv-Q Send-Q Local Address Foreign Address State

tcp 0 0 0.0.0.0:500 0.0.0.0:* LISTEN -

所以现在有一个进程在端口500上主动侦听(状态:LISTEN) . 本地地址是0.0.0.0,这是“全部监听”的代码 . 一个容易犯的错误是侦听地址127.0.0.1,它只接受来自当前计算机的连接 . 所以这不是连接,这只是意味着请求绑定()到端口IP的进程,并且该进程负责处理到该端口的所有连接 . 这暗示了每个计算机只能在一个端口上监听一个进程的限制(有多种方法可以使用多路复用来解决这个问题,但这是一个更复杂的主题) . 如果Web服务器正在侦听端口80,则它无法与其他Web服务器共享该端口 .

现在,让我们将用户连接到我们的机器:

quicknet -m tcp -t localhost:500 -p Test payload.

这是一个简单的脚本(https://github.com/grokit/dcore/tree/master/apps/quicknet),它打开TCP套接字,发送有效负载(在这种情况下为"Test payload."),等待几秒钟并断开连接 . 发生这种情况时再次执行netstat会显示以下内容:

Proto Recv-Q Send-Q Local Address Foreign Address State

tcp 0 0 0.0.0.0:500 0.0.0.0:* LISTEN -

tcp 0 0 192.168.1.10:500 192.168.1.13:54240 ESTABLISHED -

如果您与另一个客户端连接并再次执行netstat,您将看到以下内容:

Proto Recv-Q Send-Q Local Address Foreign Address State

tcp 0 0 0.0.0.0:500 0.0.0.0:* LISTEN -

tcp 0 0 192.168.1.10:500 192.168.1.13:26813 ESTABLISHED -

...也就是说,客户端使用另一个随机端口进行连接 . 因此,IP地址之间永远不会混淆 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值