Linux——netstat

本文深入探讨了TCP粘包现象,通过一个服务器接收字符、客户端发送数据的例子,展示了如何使用netstat命令观察网络连接状态。在示例中,服务器每次接收到一个字符便发送一个'OK'响应,但由于粘包,客户端并未按预期收到所有回应。netstat命令揭示了接收缓冲区中的未读数据,解释了粘包的原因。通过对网络缓冲区的理解,有助于解决网络通信中的数据同步问题。

netstat是一个功能很强大的网络信息统计工具。它可以打印本地网卡接口上的全部连接、路由表信息、网卡接口信息等。我们主要利用的是上述功能中的第一个,即显示TCP连接及其状态信息。毕竟,要获得路由表信息和网卡接口信息,我们可以使用输出内容更丰富的route和ifconfig命令。

netstat命令常用的选项如下:
在这里插入图片描述

为了深入学习这一命令,也为了演示上一节存在的粘包问题,我们继续使用之前的代码:服务器循环接收数据,客户端循环发送数据:
在这里插入图片描述
在这里插入图片描述

我们将服务器端的代码修改为,一次只接收一个字符的数据:

    while(1)  // 循环接收不同客户端的链接    
    {        
    	int len = sizeof(saddr);
    	int c = accept(sockfd,(syruct sockaddr*)&caddr,&len);
            
    	if(c == -1)        
    	{            
    		printf("Get one client link fail\n");        
    		continue;
	    }
	     
        while(1) //循环和一个客户端通讯        
        {            
        	char buff[128] = {0};  
        	///////////////////////////////////         
        	int n = recv(c, buff, 1, 0); 
        	///////////////////////////////////
        	if(n <= 0)            
        	{                
        		printf("client will unlink\n");                	
        		break;            
        	}
        	
            printf("buff = :%s\n", buff);            
            send(c, "OK", 2, 0);        //也可以用write
        }

在这里插入图片描述
因此,我们可以理解为:服务器端的代码,每收一次数据就给客户端发哦送一个ok,但是为什么我们只收到了一个ok呢,不是应该收到6个ok吗?

这时候,我们通过这个命令netstat查看
在这里插入图片描述

其中,Recv-Q是接收缓冲区,Send-Q是发送缓冲区, Local是本地IP和端口,Foregn是对方的IP和端口
我们刚才说:服务器应该给客户端回复6个ok,我们看到图中cli的接收缓冲区,有10字节,就是剩下的5个ok。
如果我们现在再给服务器发送数据,就会把此时缓冲区的5个ok读出来
在这里插入图片描述
然后a和\n到达服务器后,服务器发送2个ok,这2个ok在客户端的接收缓冲区中。

请添加图片描述

这就是粘包问题,对方send好几次,客户端一次性读到。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值