gpt4 book ai didi

java - 如何演示所有 TCP 套接字状态

转载 作者:可可西里 更新时间:2023-11-01 02:51:39 28 4
gpt4 key购买 nike

我试图在笔记本电脑上使用 Ubuntu 操作系统在运行时观察一个简单的 java echo 服务器和客户端程序。为了了解幕后发生的事情,我运行了服务器客户端并使用了这个命令

   sudo netstat -pant 10007

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

tcp6 0 0 :::10007 :::* LISTEN 3551/java
tcp6 0 0 127.0.0.1:35459 127.0.0.1:10007 ESTABLISHED 3570/java
tcp6 0 0 127.0.0.1:10007 127.0.0.1:35459 ESTABLISHED 3551/java

因此,我们可以看到被动服务器(环回)处于 LISTEN 状态,并且在接受客户端(127.0.0.1.35459)套接字后,在 ESTABLISHED 中创建与主动服务器(127.0.0.1.10007)的新 TCP 连接状态。但是,我们知道有几种TCP Socket状态如:SYN_SEND, SYN_RECEIVED, ESTABLISHED, LISTEN, FIN_WAIT_1, TIMED_WAIT, CLOSE_WAIT, FIN_WAIT_2, LAST_ACK, CLOSED等。所以,我对其他状态感到困惑,是否程序正在跳过这些套接字状态与否。

我想查看所有 TCP 套接字状态以了解整个套接字状态转换场景。那么我哪里做错了?我给错命令了吗?或缺少任何代码修改?我缺少任何网络工具吗?我的逐步过程出了什么问题?

那么,如何演示所有 TCP 套接字状态?

这是服务器代码:

import java.net.*; 
import java.io.*;

public class EchoServer
{
public static void main(String[] args) throws IOException
{
ServerSocket serverSocket = null;

try {
serverSocket = new ServerSocket(10007);
}
catch (IOException e)
{
System.err.println("Could not listen on port: 10007.");
System.exit(1);
}

Socket clientSocket = null;
System.out.println ("Waiting for connection.....");

try {
clientSocket = serverSocket.accept();
}
catch (IOException e)
{
System.err.println("Accept failed.");
System.exit(1);
}

System.out.println ("Connection successful");
System.out.println ("Waiting for input.....");

PrintWriter out = new PrintWriter(clientSocket.getOutputStream(),
true);
BufferedReader in = new BufferedReader(
new InputStreamReader( clientSocket.getInputStream()));

String inputLine;

while ((inputLine = in.readLine()) != null)
{
System.out.println ("Server: " + inputLine);
out.println(inputLine);

if (inputLine.equals("Bye."))
break;
}

out.close();
in.close();
clientSocket.close();
serverSocket.close();
}
}

这是客户端代码:

import java.io.*;
import java.net.*;

public class EchoClient {
public static void main(String[] args) throws IOException {

String serverHostname = new String ("127.0.0.1");

if (args.length > 0)
serverHostname = args[0];
System.out.println ("Attemping to connect to host " +
serverHostname + " on port 10007.");

Socket echoSocket = null;
PrintWriter out = null;
BufferedReader in = null;

try {

echoSocket = new Socket(serverHostname, 10007);
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(
echoSocket.getInputStream()));
} catch (UnknownHostException e) {
System.err.println("Don't know about host: " + serverHostname);
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for "
+ "the connection to: " + serverHostname);
System.exit(1);
}

BufferedReader stdIn = new BufferedReader(
new InputStreamReader(System.in));
String userInput;

System.out.print ("input: ");
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("echo: " + in.readLine());
System.out.print ("input: ");
}

out.close();
in.close();
stdIn.close();
echoSocket.close();
}
}

最佳答案

这里的问题是,操作系统会处理状态。您不能简单地从 Java 控制 L4 协议(protocol)。如果你想这样做,你必须在 linux RAW 套接字上实现你自己的 TCP 堆栈(也许已经有一个实现,没看过)。

因此,让操作系统处理状态并使用环回进行测试,您的状态将有几微秒的生命周期。 (实际上,我相信当两端在同一台机器上并且不涉及实际网络时,现代 linux 甚至会跳过其中一些。)我想说的是,试图通过 netstat 查看状态对于理解 TCP 如何运行几乎没有值(value)。有效。

我建议你看看Wikipedia TCP page反而。它很好地描述了所有状态,并且有很好的图表来描述状态转换。

如果你想看看“线上”发生了什么,我建议你试试 tcpdump。 tcpdump -n -i lo port 10007(有关更多用法、更详细的输出等,请参阅联机帮助页)或 GUI 应用程序 Wireshark。 Wireshark 对您来说可能是更好的选择,因为它可以很好地剖析数据包并解释几乎每一点。

(其实tcpdump可以用来抓包到文件——使用-w file标志,稍后在Wireshark中打开。)

关于java - 如何演示所有 TCP 套接字状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30817273/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com