网络模子

OSI 网络模子 VS TCP/IP 模子

Linux 现实根据 TCP/IP 模子,实现了网络协议栈。

Linux 网络栈

网络包在每一层的处置逻辑,都取决于各层接纳的网络协议。处置历程就是不停拆包,封包的历程。

Linux 通用 IP 网络栈

我们从上到下来看这个网络栈,你可以发现,

  • 最上层的应用程序,需要通过系统挪用,来跟套接字接口举行交互;
  • 套接字的下面,就是我们前面提到的传输层、网络层和网络接口层;
  • 最底层,则是网卡驱动程序以及物理网卡装备。

Linux 网络收发流程

当一个网络帧到达网卡后,网卡会通过 DMA方式,把这个网络包放到收包行列中;然后通过硬中止,告诉中止处置程序已经收到了网络包。接着,网卡中止处置程序会为网络帧分配内核数据结构(sk_buff),并将其拷贝到 sk_buff 缓冲区中;然后再通过软中止,通知内核收到了新的网络帧。

接下来,内核协议栈从缓冲区中取出网络帧,并通过网络协议栈,从下到上逐层处置这个网络帧。

网络包的发送流程领会网络包的吸收流程后,就很容易明白网络包的发送流程。网络包的发送流程就是上图的右半部门,很容易发现,网络包的发送偏向,正好跟吸收偏向相反。

  • 首先,应用程序挪用 Socket API(好比 sendmsg)发送网络包。

  • 由于这是一个系统挪用,所以会陷入到内核态的套接字层中。套接字层会把数据包放到 Socket 发送缓冲区中。

  • 接下来,网络协议栈从 Socket 发送缓冲区中,取出数据包;再根据 TCP/IP 栈,从上到下逐层处置。好比,传输层和网络层,分别为其增添 TCP 头和 IP 头,执行路由查找确认下一跳的 IP,并根据 MTU 巨细举行分片。

  • 分片后的网络包,再送到网络接口层,举行物理地址寻址,以找到下一跳的 MAC 地址。然后添加帧头和帧尾,放到发包行列中。这一切完成后,会有软中止通知驱动程序:发包行列中有新的网络帧需要发送。

  • 最后,驱动程序通过 DMA ,从发包行列中读出网络帧,并通过物理网卡把它发送出去。

性能指标

  • 带宽,示意链路的最大传输速率,单元通常为 b/s (比特 / 秒)。

  • 吞吐量,示意单元时间内乐成传输的数据量,单元通常为 b/s(比特 / 秒)或者 B/s(字节 / 秒)。吞吐量受带宽限制,而吞吐量 / 带宽,也就是该网络的使用率。

  • 延时,示意从网络请求发出后,一直到收到远端响应,所需要的时间延迟。在差别场景中,这一指标可能会有差别寄义。好比,它可以示意,确立毗邻需要的时间(好比 TCP 握手延时),或一个数据包往返所需的时间(好比 RTT)。

  • PPS,是 Packet Per Second(包 / 秒)的缩写,示意以网络包为单元的传输速率。PPS 通常用来评估网络的转发能力,好比硬件交换机,通常可以到达线性转发(即 PPS 可以到达或者靠近理论最大值)。而基于 Linux 服务器的转发,则容易受网络包巨细的影响。

除了这些指标,网络的可用性(网络能否正常通讯)、并发毗邻数(TCP 毗邻数目)、丢包率(丢包百分比)、重传率(重新传输的网络包比例)等也是常用的性能指标。