Networking TCP状态实现

Networking TCP状态实现,networking,tcp,sockets,Networking,Tcp,Sockets,在我的网络课程中,我研究了11种tcp状态,它们如下所示: 关闭 听 同步发送 综合无线电通信 确立 Fin_Wait_1 Fin_Wait_2 结束 等一下 最后确认 关门,等等 我不知道这些状态中有多少是在Linux内核网络体系结构中实际实现的 我想用系统调用编写一个程序,它可以捕获Linux内核中实现的所有这些状态 实际上,我想使用套接字编程和系统调用来捕获这些状态,如: 每当我执行netstat-taupen | greptcp时,我都希望在不同的时间在同一个tcp连接的State列中查

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

关闭 听 同步发送 综合无线电通信 确立 Fin_Wait_1 Fin_Wait_2 结束 等一下 最后确认 关门,等等 我不知道这些状态中有多少是在Linux内核网络体系结构中实际实现的

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

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

每当我执行netstat-taupen | greptcp时,我都希望在不同的时间在同一个tcp连接的State列中查看所有这些连接的状态


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

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

关闭 听 Syn_仅发送非阻塞 确立 Fin_Wait_1隐式 Fin_Wait_2仅通过尝试读取并获取EOF 仅关闭非阻塞 仅通过尝试重用端口进行最后确认
它们都已实现,但您只能通过套接字API调用来观察:

关闭 听 Syn_仅发送非阻塞 确立 Fin_Wait_1隐式 Fin_Wait_2仅通过尝试读取并获取EOF 仅关闭非阻塞 仅通过尝试重用端口进行最后确认
首先,您需要实现连接的客户端和服务器端,并且可能需要从外部脚本运行它们,以便可以在需要的时候传递适当的参数和/或终止它们,以从netstat查看的方式演示各种状态。关于这样做的细节,最好的参考是史蒂文的。如果您浏览本书和源代码,您将看到以可观察的方式故意导致各种TCP连接状态的示例。您需要查看的一件事是非阻塞连接的代码,还需要查找SO_REUSEADDR,SO_LINGER。谈到这样一个话题,没有什么能代替阅读史蒂文的书。

首先,您需要实现连接的客户端和服务器端,并且可能需要从外部脚本运行它们,以便可以在需要的时候传递适当的参数和/或终止它们,以从netstat查看的方式演示各种状态。关于这样做的细节,最好的参考是史蒂文的。如果您浏览本书和源代码,您将看到以可观察的方式故意导致各种TCP连接状态的示例。您需要查看的一件事是非阻塞连接的代码,还需要查找SO_REUSEADDR,SO_LINGER。对于这样一个主题,没有什么可以代替阅读Steven的。

如果你不喜欢从外部观察数据包跟踪推断状态,那么你必须插入内核代码:在转换代码中添加一些日志语句,重新编译内核

/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;do echo-e\n$S:;grep-l$S./*|tr'\n';完成;回音

已发送TCP\u SYN\u: ./af_inet.c./tcp.c./tcp_input.c./tcp_ipv4.c./tcp_output.c

TCP_SYN_RECV: ./inet\u connection\u sock.c./inet\u diag.c./tcp.c./tcp\u input.c./tcp\u ipv4.c./tcp\u minisocks.c

TCP_已建立: ./datagram.c./raw.c./tcp.c./tcp_input.c./tcp_ipv4.c./udp.c

TCP_FIN_WAIT1: ./tcp.c./tcp\u input.c

TCP_FIN_WAIT2: ./tcp.c./tcp_input.c./tcp_minisocks.c./tcp_timer.c

TCP_关闭: ./tcp.c./tcp\u input.c

TCP\u时间\u等待: ./inet_diag.c./inet_timewait_sock.c./tcp.c./tcp_input.c./tcp_ipv4.c./tcp_minisocks.c

TCP\u关闭\u等待: ./tcp.c./tcp\u input.c

TCP\u上次确认: ./tcp.c./tcp\u input.c

TCP_关闭:
./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

如果您不喜欢从外部观察数据包跟踪中推断状态,那么您必须对内核代码进行检测:在转换代码中添加一些日志语句,重新编译内核

/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;do echo-e\n$S:;grep-l$S./*|tr'\n';完成;回音

已发送TCP\u SYN\u: ./af_inet.c./tcp.c./tcp_input.c./tcp_ipv4.c./tcp_output.c

TCP_SYN_RECV: ./inet\u connection\u sock.c./inet\u diag.c./tcp.c./tcp\u input.c./tcp\u ipv4.c./tcp\u minisocks.c

TCP_已建立: ./datagram.c./raw.c./tcp.c./tcp_input.c./tcp_ipv4.c./udp.c

TCP_FIN_WAIT1: ./tcp.c./tcp\u input.c

TCP_FIN_WAIT2: ./tcp.c./tcp_input.c./tcp_minisocks.c./tcp_timer.c

TCP_关闭: ./tcp.c./tcp\u input.c

TCP\u时间\u等待: . /inet_diag.c./inet_timewait_sock.c./tcp.c./tcp_input.c./tcp_ipv4.c./tcp_minisocks.c

TCP\u关闭\u等待: ./tcp.c./tcp\u input.c

TCP\u上次确认: ./tcp.c./tcp\u input.c

TCP_关闭:
./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>我想它们都必须实现才能得到一个有用的tcp堆栈?这个问题有点模糊。您是在问如何从套接字文件描述符中找到状态吗?问题很不清楚。我实际上想为同一个tcp连接捕获这些状态。我会想象它们都必须实现才能得到一个有用的tcp堆栈?这个问题有点模糊。您是在问如何从套接字文件描述符中找到状态吗?问题很不清楚。我实际上想要为相同的tcp连接捕获这些状态。我实际上想要为相同的tcp连接捕获这些状态。使用诸如ethereal/wireshark和/或libpcap之类的工具怎么样?它在Linux上有相同的限制/限制吗?我没有用过它,或者Linux,年。@pst:这些工具只用于捕获数据包,不用于捕获连接的状态。@Josua:您能告诉我如何捕获这些状态吗?请查看netstat的源代码。是的,我确实想捕获相同tcp连接的这些状态。使用ethereal/wireshark和/或libpcap之类的工具怎么样-它在Linux上有相同的限制吗?我已经好几年没有使用它或Linux了。@pst:这些工具只用于捕获数据包,不用于捕获连接状态。@Josua:你能告诉我如何捕获这些状态吗?请查看netstat的源代码。