用实际案例来理解netstat -nao中的Recv-Q和Send-Q

2024-02-06 12:18

本文主要是介绍用实际案例来理解netstat -nao中的Recv-Q和Send-Q,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       我们先来看看:

 

xxxxxx$ netstat -ano | head             
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       Timer
tcp        0      0 127.0.0.1:42222         0.0.0.0:*               LISTEN      off (0.00/0/0)
tcp        0      0 10.100.70.140:48369     0.0.0.0:*               LISTEN      off (0.00/0/0)
tcp        0      0 10.100.70.140:13942     0.0.0.0:*               LISTEN      off (0.00/0/0)
tcp        0      0 10.100.70.140:10586     0.0.0.0:*               LISTEN      off (0.00/0/0)
tcp        0      0 10.100.70.140:63227     0.0.0.0:*               LISTEN      off (0.00/0/0)
tcp        0      0 0.0.0.0:8765            0.0.0.0:*               LISTEN      off (0.00/0/0)
tcp        0      0 10.100.70.140:20126     0.0.0.0:*               LISTEN      off (0.00/0/0)
tcp        0      0 10.100.70.140:23456     0.0.0.0:*               LISTEN      off (0.00/0/0)

       第二列表内核recv缓冲区中的字节数(接收缓冲区), 第三列表示内核send缓冲区中的字节数(发送缓冲区)。 所以, 对于一个tcp连接的两端而言, 有四个内核缓冲区。

 

 

       来看程序, 服务端:

 

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>int main()
{int sockSrv = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in addrSrv;addrSrv.sin_family = AF_INET;addrSrv.sin_addr.s_addr = INADDR_ANY; addrSrv.sin_port = htons(8765);bind(sockSrv, (const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in));listen(sockSrv, 5);struct sockaddr_in addrClient;int len = sizeof(struct sockaddr_in);int sockConn = accept(sockSrv, (struct sockaddr *)&addrClient, (socklen_t*)&len);while(1)    {    getchar();    char szRecvBuf[1001] = {0};    int iRet = recv(sockConn, szRecvBuf, sizeof(szRecvBuf) - 1, 0);    printf("iRet is %d\n", iRet);     }getchar();close(sockConn);close(sockSrv);return 0;
}

       客户端:

 

 

#include <unistd.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>int main()
{int sockClient = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in addrSrv;addrSrv.sin_addr.s_addr = inet_addr("10.100.70.140");addrSrv.sin_family = AF_INET;addrSrv.sin_port = htons(8765);connect(sockClient, ( const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in));#define N 2000char szSendBuf[N] = {0};for(unsigned int i = 0; i < N; i++) //×Ö·ûÊý×é×îºóÒ»¸ö×Ö·û²»ÒªÇóÊÇ¡®\0¡¯{szSendBuf[i] = 'a';	}int total = 0;while(1){int iRet = send(sockClient, szSendBuf, sizeof(szSendBuf) , 0); total += iRet;printf("iRet is %d, total send is %d\n", iRet, total);getchar();}close(sockClient);return 0;
}

       我们先开启服务端, 再看起客户端, 此时客户端给服务端发送了2000字节, 但服务端没有去取出这2000字节, 我们来看看服务端的情况:

 

 

xxxxxx$ netstat -ano | grep 8765
tcp        0      0 0.0.0.0:8765            0.0.0.0:*               LISTEN      off (0.00/0/0)
tcp     2000      0 10.100.70.140:8765      10.100.70.139:43634     ESTABLISHED off (0.00/0/0)

       再看看客户端, 客户端都发送完了, 没有字节积压, 所以发送缓冲区中么有字节, 如下:

 

xxxxxx$ netstat -ano | grep 8765
tcp        0      0 10.100.70.139:43634     10.100.70.140:8765      ESTABLISHED off (0.00/0/0)

       
        此时, 如果我们在服务端用recv函数取出1000字节, 会怎样呢?  显然, 内核缓冲区中还剩100字节, 如下:

 

xxxxxx$ netstat -ano | grep 8765
tcp        0      0 0.0.0.0:8765            0.0.0.0:*               LISTEN      off (0.00/0/0)
tcp     1000      0 10.100.70.140:8765      10.100.70.139:43634     ESTABLISHED off (0.00/0/0)

 


        如何才能在客户端上看到内核缓冲区中的数据呢? 很简单, 让客户端一只发发发, 服务端的内核缓冲区数据塞满后, 自然开始在客户端的内核缓冲区积压了。 有兴趣的朋友可以试试, 这对理解tcp很有帮助。

 

 

       

 


 

这篇关于用实际案例来理解netstat -nao中的Recv-Q和Send-Q的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/684282

相关文章

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

客户案例:安全海外中继助力知名家电企业化解海外通邮困境

1、客户背景 广东格兰仕集团有限公司(以下简称“格兰仕”),成立于1978年,是中国家电行业的领军企业之一。作为全球最大的微波炉生产基地,格兰仕拥有多项国际领先的家电制造技术,连续多年位列中国家电出口前列。格兰仕不仅注重业务的全球拓展,更重视业务流程的高效与顺畅,以确保在国际舞台上的竞争力。 2、需求痛点 随着格兰仕全球化战略的深入实施,其海外业务快速增长,电子邮件成为了关键的沟通工具。

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。