端口数据如何写入到进程中

BullJordan23 2017-07-19 02:28:39
网卡负责网络数据的解析,假如计算机A 向计算机B同行(tcp连接) ,端口号是10000 。计算机上面有个进程B再监听10000端口,A发送数据的时候,网卡会解析出数据的目标地址,源地址,机器目标端口号,这个时候,发现有个10000的端口,这个层面是操作系统就会查找10000对应的哪个进程。 因为有socker ,所以socker也是一个文件,对应有文件句柄。因为是监听10000哪个进程拥有该句柄,所以写入的数据,肯定是在该进程的堆栈上,现在有个问题, 因为操作系统所有的进程到时独立,都不会感知其它进程的存在,那么网卡是如何把数据写入到其它进程中的,当然在写入数据的时候,网卡肯定要获取该进程的中对应的socker 句柄。它怎么能拿到其它进程中的数据呢? 这不破坏进程数据bao'h
...全文
520 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
jklinux 2017-08-02
  • 打赏
  • 举报
回复
引用 楼主 BullJordan23 的回复:
网卡负责网络数据的解析,假如计算机A 向计算机B同行(tcp连接) ,端口号是10000 。计算机上面有个进程B再监听10000端口,A发送数据的时候,网卡会解析出数据的目标地址,源地址,机器目标端口号,这个时候,发现有个10000的端口,这个层面是操作系统就会查找10000对应的哪个进程。 因为有socker ,所以socker也是一个文件,对应有文件句柄。因为是监听10000哪个进程拥有该句柄,所以写入的数据,肯定是在该进程的堆栈上,现在有个问题, 因为操作系统所有的进程到时独立,都不会感知其它进程的存在,那么网卡是如何把数据写入到其它进程中的,当然在写入数据的时候,网卡肯定要获取该进程的中对应的socker 句柄。它怎么能拿到其它进程中的数据呢? 这不破坏进程数据bao'h
首先每个进程都是独立的,这没错。但所有的进程都是系统里的资源分配单位而已,也就是说所有进程都是共一个系统(内核)里功能. 用户进程是不可以直接调用网卡驱动, socket套接字调用的内核里的网络协议栈, 协议栈里才会调用网卡驱动。当进程需要发出数据时, 通过socket把数据包提交到内核里协议栈,协议栈加上相应的包头信息后再调用相应的网卡驱动发出数据。 当网卡驱动接收到网络数据时会提交到网络协议栈,网络协议栈里会根据数据包头里的端口号信息再提交到相应的用户进程(一个端口号只能由一个进程绑定,反过来说就是通过绑定的端口号可以找到这个进程).
codingMozart 2017-07-20
  • 打赏
  • 举报
回复
写入的是内核数据区,写到socket部分

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧