免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3809 | 回复: 11
打印 上一主题 下一主题

[函数] Socket中的并发到底是如何实现的呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-18 16:09 |只看该作者 |倒序浏览
Socket中的并发到底是如何实现的呢?

最近心里一直较劲,想像HTTP服务器那样的程序怎么能够实现用一个80端口来同时就收不同Client的连接操作的呢?。
我现在比较确信的是在OS层面暴露出来的网络编程接口就是SOCKET(大多数情况下,当然也存在一些别的编程接口)并且在SOCKET中的每一个连接的唯一标示是一个(IP+Port)。可是如果我用这个思路去想并发连接就有点晕了……

比如:
c1客户端(ip:192.168.0.1 port:3000)连接到了服务器S(ip:192.168.0.10 port:80)
之后c2客户端(ip:192.168.0.2 port:3000)也连接到了服务器S(ip:192.168.0.10 port:80)

那么在之后的c1和c2同时向S附送数据的时候S如何来分辨这些数据时那个客户端发来的呢?并且保证经过处理的数据能够返还给正确的客户端呢?

我用抓包工具试验过,在服务器S端的所有的连接都是通过80端口进行接收的也是通过80端口进行回发的,可是不知道对于端口这么一个OS中的资源来说如何来保证不能进程或者线程操作时候既是公用的又是并发的呢?

我现在猜测是不是SOCKET是这么实现的,即:服务器S在监听80端口的时候,对于每一个accept创建的线程都会生成一个进程ID-客户端Socket的对应表,之后通过这个对应表来将每次客户端发来的数据发给正确的Socket线程来做处理并且之后输出的时候都是用那个监听端口(即80)进行回发呢?



我没有看过Socket的源代码,现在也找不到什么好的资料,希望大家能给些帮助,谢谢大家啦

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2010-04-18 16:13 |只看该作者
TCP 连接是五元组

论坛徽章:
0
3 [报告]
发表于 2010-04-18 16:18 |只看该作者
回复 2# flw


    自己IP 自己端口 协议 对方IP 对方端口么?

您这个意思是说在Socket内部是会维护这个五元组的标志么?
Socket是这么实现并行数据操作的么?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2010-04-18 16:19 |只看该作者
回复  flw


    自己IP 自己端口 协议 对方IP 对方端口么?

您这个意思是说在Socket内部是会维护这 ...
art_codes 发表于 2010-04-18 16:18

对。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2010-04-18 16:22 |只看该作者
顺便说一句,你这里应该用“并发(concurrent)”,而非“并行(parallel)”。

论坛徽章:
0
6 [报告]
发表于 2010-04-18 16:23 |只看该作者
回复 4# flw


    那就是说我帖子中说的那个想法应该是对的对吧 会有一个维护网络五元组到操作线程关系的数据结构存在 是么?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2010-04-18 16:24 |只看该作者
回复  flw


    那就是说我帖子中说的那个想法应该是对的对吧 会有一个维护网络五元组到操作线程关系的 ...
art_codes 发表于 2010-04-18 16:23

论坛徽章:
0
8 [报告]
发表于 2010-04-18 16:27 |只看该作者
回复 7# flw


    非常感谢 谢谢你

论坛徽章:
0
9 [报告]
发表于 2010-04-18 16:29 |只看该作者
回复 7# flw


    对了 我还想问您一下,您知道这些东西 是因为看过Scoket的源代码么? 或者说您能推荐一些Socket的相关教程么?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2010-04-18 21:36 |只看该作者
其实这些东西和 socket API 底层如何实现一点儿关系都没有,
大家都是按照标准和接口做事。
不过我能理解你好奇的心理,
以 Linux 为例,要想了解这一块的全部细节,可以看看《Linux 内核情景分析》,
或者到本坛 Linux 论坛(linux.chinaunix.net)的内核源码版找一下精华区,
那里有几本电子书也讲的很好。

但是显然在这之前你得先读懂 TCP 协议规范,
以及了解一下 Linux 内核的一般性常识。
所以建议先读《TCP/IP 详解》以及 LKD《Linux 内核开发》(robert love 著)。

其实还有一种速成的办法,
就是读懂《用 TCP/IP 实现网际互联》第一、二卷中有关 TCP 的章节。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP