【问题标题】:Some TCP states not showing in the terminal某些 TCP 状态未显示在终端中
【发布时间】:2016-06-27 15:21:30
【问题描述】:

我编写了一个基本的客户端服务器代码来理解 TCP 状态。 客户端代码:

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>

int main(){
int clientSocket;
char buffer[1024];
struct sockaddr_in serverAddr;
socklen_t addr_size;

/*---- Create the socket. The three arguments are: ----*/
/* 1) Internet domain 2) Stream socket 3) Default protocol (TCP in this case) */
clientSocket = socket(PF_INET, SOCK_STREAM, 0);

/*---- Configure settings of the server address struct ----*/
/* Address family = Internet */
serverAddr.sin_family = AF_INET;
/* Set port number, using htons function to use proper byte order */
serverAddr.sin_port = htons(7891);
/* Set IP address to localhost */
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
/* Set all bits of the padding field to 0 */
memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero);  

/*---- Connect the socket to the server using the address struct ----*/
addr_size = sizeof serverAddr;
connect(clientSocket, (struct sockaddr *) &serverAddr, addr_size);

/*---- Read the message from the server into the buffer ----*/
recv(clientSocket, buffer, 1024, 0);

/*---- Print the received message ----*/
printf("Data received: %s",buffer);   

return 0;
}

服务器代码:

/****************** SERVER CODE ****************/

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>

int main(){
int welcomeSocket, newSocket;
char buffer[1024];
struct sockaddr_in serverAddr;
struct sockaddr_storage serverStorage;
socklen_t addr_size;
welcomeSocket = socket(PF_INET, SOCK_STREAM, 0);
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(7891);
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero);  

bind(welcomeSocket, (struct sockaddr *) &serverAddr, sizeof(serverAddr));

if(listen(welcomeSocket,5)==0)
printf("Listening\n");
else
  printf("Error\n");

addr_size = sizeof serverStorage;
newSocket = accept(welcomeSocket, (struct sockaddr *) &serverStorage, &addr_size);

strcpy(buffer,"Hello World\n");
send(newSocket,buffer,13,0);

return 0;
}

我正在运行命令netstat -an | grep 7891,所以在不同的时间点,我得到了 ESTABLISHED、LISTENING、FINWAIT2、CLOSE_WAIT 和 TIME_WAIT 的状态。 如何获取 SYN_RECV、SYN_SENT、FINWAIT1、CLOSING 和 LAST ACK 等其他状态。

我尝试了各种 netstat 选项和 ss 选项,但没有白费。

【问题讨论】:

  • wireshark 是您学习数据包传输序列的最佳朋友。仅为 TCP 捕获主机和客户端之间的流量,您可以在闲暇时观察整个握手、传输和关闭序列。

标签: linux sockets networking tcp


【解决方案1】:

你看不到SYN_RECV、SYN_SENT等,因为这些阶段太短了。例如,在服务器端成功accept() 后,您已建立 ESTABLISHED,所有先前的状态将由 TCP 堆栈快速执行。 所以,你看到的只是长的 tcp 连接状态。

您可以通过模拟 SYN-flood 来实现 SYN_* 状态:在服务器端为 listen(...,1) 使用 backlog 参数,并在 return 0 之前休眠。并尝试启动几个单独的客户端。结果,您将获得:ETSABLISHED 中的 1 个和 SYN_* 状态中的几个。

关于完成状态。您应该调用shutdown() 和close() 并在它们之间设置睡眠。我建议你使用fork() 来创建子进程并使用同步原语来理解 TCP 状态

【讨论】:

    猜你喜欢
    • 2015-05-08
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 2011-08-09
    • 2015-10-03
    • 2019-10-29
    • 2021-09-05
    • 1970-01-01
    相关资源
    最近更新 更多