Linux内核中的TCP调用流程

3
我正在尝试获取Linux内核版本3.8中与不同用户空间API(例如connect、bind、listen和accept)相关的TCP调用流程。是否有人能为我提供调用流程的流程图?我已经能够找到使用send和recv API的数据流程。
另一个问题是,当客户端连接到服务器时,服务器会为该特定连接创建一个由accept API返回的新套接字。我的问题是,Linux内核是否在某个哈希绑定表中维护监听套接字与其派生套接字之间的关系?

这是一个很好的问题,我也对答案很感兴趣。 - Devarsh Desai
1
关于你的第二个问题,没有理由会这样。一旦被接受,套接字就是独立的。 - user207421
2
如果您对调用流程非常感兴趣,我建议使用一些工具,如systemtap、ftrace来了解代码流程。关于ftrace的更多信息,请参考http://linuxseekernel.blogspot.com/2014/05/ftrace-kernel-function-tracer.html。 - Jeyaram
2个回答

2
第一个问题:

http://www.danzig.jct.ac.il/tcp-ip-lab/ibm-tutorial/3376c210.html

在Haifux的所有讲座都是经典的:

http://www.haifux.org/lectures/172/netLec.pdf

http://www.haifux.org/lectures/217/netLec5.pdf

这是来自 Linux 网络的原始作者/维护者的话:

http://vger.kernel.org/~davem/skb.html

http://vger.kernel.org/~davem/tcp_output.html

http://vger.kernel.org/~davem/tcp_skbcb.html

第二个问题:是的,所有现有连接都保存在一个关键表中:tcp_hashinfo。它的内存地址可以从/proc/kallsyms中读取。“关键”是因为从中读取需要锁定,所以即使你有地址,也不要尝试遍历该表。使用全局导出符号如“inet_lookup_listener”或“inet_lookup_established”来代替遍历该表。

更多信息请参见:

如何识别用户空间和内核空间之间的特定套接字?


0
流程图?流程图表?没门。我们很想有它们,但它们不存在,不过你可以查看代码;我们乐意审查补丁。
套接字返回文件描述符;进程文件描述符表维护套接字与其他内核数据结构之间的关联。文件描述符使得这成为一个简单的数组索引操作,不需要哈希。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接