先来看看一些约定俗成的内容。
- 一个网卡对应一个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……,不行了