【问题标题】:TCP States ImplementationTCP 状态实施
【发布时间】:2011-07-09 12:05:41
【问题描述】:

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

  1. 关闭
  2. 听着
  3. Syn_Sent
  4. Syn_Rcvd
  5. 成立
  6. Fin_Wait_1
  7. Fin_Wait_2
  8. 结束
  9. Time_Wait
  10. Last_Ack
  11. Close_Wait

我不知道在 Linux 内核网络架构中实际实现了多少这些状态。

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

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

每当我做 netstat -taupen | grep tcp ,我想在 State 列中查看同一 tcp 连接在不同时间的所有这些连接状态。

有人告诉我如何编写这样的代码。

【问题讨论】:

  • (我想他们都必须被实现以获得有用的 TCP 堆栈?问题有点模糊。)
  • 您是在问如何能够从套接字文件描述符中找到状态?这个问题很不清楚。
  • 我实际上想为同一个 tcp 连接捕获这些状态

标签: networking tcp sockets


【解决方案1】:

首先,您需要实现连接的客户端和服务器端,并且您可能需要从外部脚本运行它们,以便可以传递正确的参数和/或终止它们需要时间以从 netstat 可见的方式展示各种状态。有关执行此类操作的详细信息的最佳参考是 Steven 的Unix Network Programming。如果您浏览本书和源代码 (which can be downloaded here),您将看到以可观察的方式故意导致各种 TCP 连接状态的示例。您需要查看的一件事是非阻塞连接的代码,还可以查看 SO_REUSEADDR、SO_LINGER、time-wait assassination。当涉及到这样的主题时,没有什么可以替代阅读 Steven 的。

【讨论】:

    【解决方案2】:

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

    1. 关闭
    2. 听着
    3. Syn_Sent(仅限非阻塞)
    4. 成立
    5. Fin_Wait_1(隐式)
    6. Fin_Wait_2(仅通过尝试读取和获取 EOF)
    7. 关闭(仅限非阻塞)
    8. 最后一个 ACK​​(仅通过尝试重用端口)

    【讨论】:

    • 是的,我实际上想为同一个 tcp 连接捕获这些状态
    • 使用像 ethereal/wireshark(和/或 libpcap 或诸如此类)这样的工具怎么样——它在 Linux 上是否有相同的限制/限制? (我已经好几年没用过它了,也没有用过 Linux)。
    • @pst:这些工具仅用于数据包捕获,而不用于捕获连接状态。
    • @Josua:你能告诉我如何捕捉这些状态吗?
    • 尝试查看 netstat 的源代码。
    【解决方案3】:

    如果您不满意从外部观察(数据包跟踪)推断状态,那么您将不得不检测内核代码:在转换代码中添加一些日志语句,重新编译内核..

    /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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-22
      • 2012-02-08
      • 1970-01-01
      相关资源
      最近更新 更多