楼主你把我们知道的、不知道的全说出来了,我们无话可说了…
这是我目前看到解释端口最好、最合理的,没有人云亦云,独立思考,给你100个赞!
来了总要说点自己的理解,各位多指正:
以太网上封装了很多种协议
IPv4: 0x0800
ARP:0x0806
802.1q: 0x8100
PPPoE : 0x8863 0x8864
IPv6: 0x86DD
等等协议,以太网卡需要这个协议号来区分是哪个栈的,网卡也只会读取以太网头14个字节,然后根据协议信息来做辨别,如果他需要读取TCP端口号的信息,那也就没有TCP/IP协议栈什么事了,网卡直接提供接口函数给应用程序,个人认为网络分层的概念,就是数据链路层做自己份内的事,网络层的事还是留给IP来做比较合理。
所以个人认为,网卡不会和应用层直接打交道,不会解释端口号信息。
IPv4 或IPv6在启动的时候,应该通过一个注册机制,以IPv4为例,告诉网卡0x0800是我IPv4的,有包来了请通知我,通过我注册时的回调函数 callback 来执行,包到达IPv4,通过IP头的协议号来分辨是哪个上层协议,和刚才的方式类似,通过回调函数到达上层,比如TCP;TCP读取端口号,这个端口号就是创建socket时注册的,socket创建成功应该有一个process ID,这应该是操作系统来完成的,TCP于是就把[ 端口号 Process ID] 联系了起来,于是就和这个Process ID进程交换,完成数据的发送和接收。