套接字之相关系统调用的调用流程

最近一直在读内核网络协议栈源码,这里以ipv4/tcp为例对socket相关系统调用的流程做一个简要整理,这些相关系统调用的内部细节虽然各有不同,但其调用流程则基本一致;

调用流程:

(1)系统调用 –> (2)查找socket –> (3)执行socket的对应操作函数  –> (4)执行传输层协议的对应操作函数;

中间核心数据结构为inetws_array[],位于af_inet.c,以第一个元素type=SOCK_STREAM,protocol=IPPROTO_TCP为例,该类型适用与tcp协议,当创建tcp socket时,其操作socket->ops赋值为&inet_stream_ops,对应的传输控制块操作sock->sk_prot赋值为&tcp_prot;

 

查看inet_stream_ops结构会发现,其中包含了各种socket系统调用的对应的处理函数;

 

具体实例,以tcp bind系统调用为例:

上面的sock->ops->bind操作实际是调用了inet_stream_ops.bind

上面的sk->sk_prot->bind以及sk->sk_prot->get_port为具体传输层实现的对应操作函数,其中只有raw socket实现了bind操作,我们不关注,而以tcp的get_port操作为例,实际上也就是调用了tcp_prot.get_port,具体tcp实现为inet_csk_get_port;(该函数尚未分析,后续补充)

 

本文链接:套接字之相关系统调用的调用流程

转载声明:转载请注明来源:Linux TCP/IP Stack,谢谢!


发表评论

电子邮件地址不会被公开。 必填项已用*标注