在我的网络课程中,我研究了11个tcp状态,它们如下:
我不确切知道在Linux内核网络架构中实际实现了多少这些状态。
我想用系统调用编写一个程序,它可以捕获Linux内核中实现的所有这些状态。
实际上我想使用套接字编程和系统调用来捕获这些状态,如:
每当我做netstat -taupen | grep tcp,我想在State列中看到所有这些连接的状态,以便在不同的时间使用相同的tcp连接。
有人就如何编写这样的代码给我一些想法。
答案 0 :(得分:2)
它们都已实现,但您只能使用套接字API调用来观察它们:
答案 1 :(得分:2)
首先,您需要同时实现连接的客户端和服务器端,并且您可能需要从外部脚本运行它们,以便它们可以传递适当的参数和/或在需要时间以netstat可见的方式演示各种状态。对于做这样的事情的细节的最佳参考将是史蒂文的Unix Network Programming。如果您浏览本书和源代码(which can be downloaded here),您将看到以可观察的方式故意导致各种TCP连接状态的方法示例。您需要注意的一件事是非阻塞连接的代码,还要查找SO_REUSEADDR,SO_LINGER,time-wait assassination。当谈到像这样的主题时,没有什么可以替代阅读史蒂文的。
答案 2 :(得分:1)
如果您不满意从外部观察(数据包跟踪)推断状态,那么您将必须检测内核代码:在转换代码中添加一些日志语句,重新编译内核..
/usr/src/linux-source-2.6.32/net/ipv4# head -n 250 tcp.c | grep -n“^ [^ a-zA-Z0-9] * TCP_”| sed“s | ^。*(TCP_ [A-Z0-9 _] )。 | \ 1 |” |读S;做echo -e“\ n $ S:”; grep -l $ S ./* | tr'\ n''';完成回声
TCP_SYN_SENT: ./af_inet.c ./tcp.c ./tcp_input.c ./tcp_ipv4.c ./tcp_output.c
TCP_SYN_RECV: ./inet_connection_sock.c ./inet_diag.c ./tcp.c ./tcp_input.c ./tcp_ipv4.c ./tcp_minisocks.c
TCP_ESTABLISHED: ./datagram.c ./raw.c ./tcp.c ./tcp_input.c ./tcp_ipv4.c ./udp.c
TCP_FIN_WAIT1: ./tcp.c ./tcp_input.c
TCP_FIN_WAIT2: ./tcp.c ./tcp_input.c ./tcp_minisocks.c ./tcp_timer.c
TCP_CLOSING: ./tcp.c ./tcp_input.c
TCP_TIME_WAIT: ./inet_diag.c ./inet_timewait_sock.c ./tcp.c ./tcp_input.c ./tcp_ipv4.c ./tcp_minisocks.c
TCP_CLOSE_WAIT: ./tcp.c ./tcp_input.c
TCP_LAST_ACK: ./tcp.c ./tcp_input.c
TCP_CLOSE: ./af_inet.c ./inet_connection_sock.c ./inet_hashtables.c ./raw.c ./tcp.c ./tcp_cong.c ./tcp_input.c ./tcp_ipv4.c ./tcp_output.c ./tcp_timer.c ./udp.c