TCP国家实施

时间:2011-03-05 17:54:34

标签: networking tcp sockets

在我的网络课程中,我研究了11个tcp状态,它们如下:

  1. 已关闭
  2. Syn_Sent
  3. Syn_Rcvd
  4. 已成立
  5. Fin_Wait_1
  6. FIN_WAIT_2
  7. 结束
  8. Time_Wait
  9. Last_Ack
  10. Close_Wait
  11. 我不确切知道在Linux内核网络架构中实际实现了多少这些状态。

    我想用系统调用编写一个程序,它可以捕获Linux内核中实现的所有这些状态。

    实际上我想使用套接字编程和系统调用来捕获这些状态,如:

    每当我做netstat -taupen | grep tcp,我想在State列中看到所有这些连接的状态,以便在不同的时间使用相同的tcp连接。

    有人就如何编写这样的代码给我一些想法。

3 个答案:

答案 0 :(得分:2)

它们都已实现,但您只能使用套接字API调用来观察它们:

  1. 收听
  2. Syn_Sent(仅限非阻止)
  3. 成立
  4. Fin_Wait_1(隐含)
  5. Fin_Wait_2(仅通过尝试阅读和获取EOF)
  6. 结束(仅限非阻止)
  7. 上次确认(仅通过尝试重用端口)

答案 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