对TCP端口和连接数的一点思考

原文地址:https://blog.csdn.net/tanxiaxuan/article/details/52723009

先来看看一些约定俗成的内容。

  • 一个网卡对应一个IP地址
  • 一个IP地址对应65535个端口
  • 一个socket(addr, port)可以接受多个socket连接(accept)
  • 一个端口只能被一个socket监听(listen)

我在面试的时候,被问到过这么一个问题:ipv4协议下,假如主机的资源是无限的,理论上一个网卡能够接受多少个tcp连接?这个问题一开始很容易有个naive的想法,连接数就和端口数一样,65535。但这样显然是错误的,原因可以参考上面。

实际上这道题要文档本质是,一个tcp连接,必定有一个唯一区分这个链接的关键字。这显然不是端口,而是(svr_addr, svr_port, cli_addr, cli_port, protocol)这么一个五元组。理论上只要这五个值不完全一样,就不是一个相同的连接。所以答案的数量级非常庞大。

那什么是端口呢?我引用知乎的一个问题: 
http://www.zhihu.com/question/22577025

ip能锁定一台物理机器,对应着一张网卡,外界发来的数据包网卡都会接收。但是问题来了,网卡给程序提供了接口,你监听一下我,要是有消息来了,我就转发给你。这样应用程序就能收到数据了。但是问题来了,程序A和程序B都需要监听网卡接发数据,网卡说那我把接到的数据都发给你两,你们自己看着办吧。好,小A小B都接受了。但是又来了CDEF……,不行了,每个包都被发到了所有应用程序,每个应用程序都累得不行,最终垮了。
好,那网卡说我给你们加个表示吧,我们之间可以用一个号码来作为标识,我和小A之间就用1来标识,如果外界发给1号标识的数据我就转发给你,你监听我的时候得告诉我你监听的时1,我就转发1的数据包给你。好了其他的BCD…都自己弄一个标识号,只要不重复就行。这样大家都省事了。
最后涉及到安全,一个标识号只能被一个应用程序监听,因为如果小A程序和小B同时监听一个标识号号,那就坏了,我传的数据都被AB接到,这样数据安全性就没办法保证了。
这个标识号就是端口,最初设计网络数据交换的设计者不知道是怎么想的。这是我的理解。
其实网卡都是被系统层封装了,端口和进程之间的关系也是系统封装好的。我们只需要用socket就行,给定一个端口号就行了。其他的事都交给操作系统去做。

也就是说,假如没有端口这么一个东西,应用层的程序就只能够直接监听网卡,这样会造成资源的浪费和很大的负荷,所以才划分这么多端口,并且一个端口只能被监听一次。

实际上,端口的信息只有到了TCP层才会被读取(而不是在网卡、或者数据链路层等其他地方),所以在TCP层记录了(port, pid)这么一个二元组,表示某个port被pid监听,从而让数据段准确传输到正确的位置。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值