linux udp传输收不到_你必须知道的linux网络

你必须知道的linux网络


linux网络模型

谈到网络模型,大部分都应该知道的是OSI七层网络模型,在linux下一般说的是四层网络模型,也就是TCP/IP模型这两种我们都应该知道;

七层网络模型

OSI参考模型分为物理层、数据链路层、网络层、传输层、会话层、表示层、应用层

8ba5a5ca527efb0329d1359e789b1509.png

四层网络模型

1deb4b53a2d9d25a2ccf93c6ab414de6.png
  • 应用层:负责向用户提供一组应用程序,比如 HTTP、FTP、DNS 等。
  • 传输层:负责端到端的通信,比如 TCP、UDP 等。
  • 网络层:负责网络包的封装、寻址和路由,比如 IP、ICMP 等。
  • 数据链路层:负责网络包在物理网络中的传输,比如 MAC 寻址、错误侦测以及通过网卡传输网络帧等。

这张图也许可以更好的理解:

252df9fda156fa2ee88ab9633caeaab2.png

Linux 网络包传输过程

接收发送流程示意图:

d326ac4a5da046183f968f4926fd73dd.png

接收流程:

  • 数据链路层:在数据链路层检查报文的合法性,找出上层协议的类型,去掉帧头、帧尾,然后交给上一层网络层。
  • 网络层:网络层取出 IP 头,判断网络包下一步的走向,比如是交给上层处理还是转发。当网络层确认这个包是要发送到本机后,就会取出上层协议的类型(比如 TCP 还是 UDP),去掉 IP 头,再交给传输层处理。
  • 传输层:传输层取出 TCP 头或者 UDP 头后,根据 源 IP、源端口、目的 IP、目的端口 四元组作为标识,找出对应的 Socket,并把数据拷贝到 Socket 的接收缓存中。
  • 应用层:应用程序就可以使用 Socket 接口,读取到新接收到的数据了。

发送流程:

  • 应用层:应用程序调用 Socket API发送网络包。套接字层会把数据包放到 Socket 发送缓冲区中。
  • 网络协议栈从 Socket 发送缓冲区中,取出数据包;再按照 TCP/IP 栈,从上到下逐层处理。
  • 传输层:增加 TCP 头;
  • 网络层:增加IP 头和执行路由查找确认下一跳的 IP,并按照 MTU 大小进行分片。
  • 数据链路层:分片后的网络包,再送到数据链路层,进行物理地址寻址,以找到下一跳的 MAC 地址,并且添加帧头和帧尾,放到发包队列中。
  • 驱动程序通过 DMA ,从发包队列中读出网络帧,并通过物理网卡把它发送出去。

性能指标

我们通常用带宽、吞吐量、延时、PPS(Packet Per Second)等指标衡量网络的性能。

  • 带宽,表示链路的最大传输速率,单位通常为 b/s (比特 / 秒)。
  • 吞吐量,表示单位时间内成功传输的数据量,单位通常为 b/s(比特 / 秒)或者 B/s(字节 / 秒)。吞吐量受带宽限制,而吞吐量 / 带宽,也就是该网络的使用率。
  • 延时,表示从网络请求发出后,一直到收到远端响应,所需要的时间延迟。在不同场景中,这一指标可能会有不同含义。比如,它可以表示,建立连接需要的时间(比如 TCP 握手延时),或一个数据包往返所需的时间(比如 RTT)。
  • PPS,是 Packet Per Second(包 / 秒)的缩写,表示以网络包为单位的传输速率。PPS 通常用来评估网络的转发能力,比如硬件交换机,通常可以达到线性转发(即 PPS 可以达到或者接近理论最大值)。而基于 Linux 服务器的转发,则容易受网络包大小的影响。
  • 网络的可用性:网络正常通信
  • 并发连接数:TCP可以连接多少
  • 丢包率:丢包占总包的比重

网络常用命令

先看一下head这个命令,这个可以帮助我们看到具体的IP地址和端口;

head参数:

  • -l 表示只显示监听套接字
  • -n 表示显示数字地址和端口
  • -p 表示显示进程信息

netstat

  • 命令说明
    Linux netstat命令用于显示网络状态
  • 语法
    netstat [-acCeFghilMnNoprstuvVwx][-A<网络类型>][--ip]
  • 常用参数
    • -a或--all 显示所有连线中的Socket。
    • -p或--programs 显示正在使用Socket的程序识别码和程序名称
    • -t或--tcp 显示TCP传输协议的连线状况
    • -u或--udp 显示UDP传输协议的连线状况
    • -l或--listening 显示监控中的服务器的Socket
    • -n或--numeric 直接使用IP地址,而不通过域名服务器
  • 实践

78629cfbed8c3eae1138e7ed6697bc17.png

看下这些代表的意思:

  • Proto:代表的是协议,这里是TCP协议
  • State:代表的是状态

Recv-Q和Send-Q和状态(State)有关系:

State为ESTABLISHED的时候:

  • Recv-Q:也及时recv-queue,接收队列,表示套接字缓冲还没有被应用程序取走的字节数,也就是接收队列长度;
  • Send-Q:也及时send-queue,发送队列,表示还没有被远端主机确认的字节数

State为LISTENING的时候:

  • Recv-Q 表示 syn backlog 的当前值。
  • Send-Q 表示最大的 syn backlog 值.

注:syn backlog 是 TCP 协议栈中的半连接队列长度;

**半连接:**没有完成 TCP 三次握手的连接,连接只进行了一半,而服务器收到了客户端的 SYN 包后,就会把这个连接放到半连接队列中,然后再向客户端发送 SYN+ACK 包;

**全连接:**指服务器收到了客户端的 ACK,完成了 TCP 三次握手,然后就会把这个连接挪到全连接队列中。这些全连接中的套接字,还需要再被 accept() 系统调用取走。才能开始处理请求


sar命令:

  • 命令说明
    sar(System ActivityReporter系统活动情况报告)是目前Linux上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等;
  • 命令格式
    sar [ 选项 ] [ <时间间隔> [ <次数> ] ]
  • 参数(以网络为例)
    sar -n #统计网络信息
    DEV:显示网络接口信息
    EDEV:显示关于网络错误的统计数据
  • 案例

2cc41ce6856a22b6c5af6b1687fd7c3f.png

具体说一下指标:

  • rxpck/s 和 txpck/s 分别是接收和发送的 PPS,单位为包 / 秒
  • rxkB/s 和 txkB/s 分别是接收和发送的吞吐量,单位是 KB/ 秒
  • rxcmp/s 和 txcmp/s 分别是接收和发送的压缩数据包数,单位是包 / 秒。
  • %ifutil 是网络接口的使用率,即半双工模式下为 (rxkB/s+txkB/s)/Bandwidth,而全双工模式下为 max(rxkB/s, txkB/s)/Bandwidth。

想了解学习更多C++后台服务器方面的知识,请关注: 微信公众号:====CPP后台服务器开发====


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值