Linux 实际按照 TCP/IP 模型,实现了网络协议栈。服务器
网络包在每一层的处理逻辑,都取决于各层采用的网络协议。处理过程就是不断拆包,封包的过程。网络
咱们从上到下来看这个网络栈,你能够发现,数据结构
当一个网络帧到达网卡后,网卡会经过 DMA
方式,把这个网络包放到收包队列中;而后经过硬中断
,告诉中断处理程序已经收到了网络包。接着,网卡中断处理程序会为网络帧分配内核数据结构(sk_buff),并将其拷贝到 sk_buff 缓冲区中;而后再经过软中断,通知内核收到了新的网络帧。并发
接下来,内核协议栈从缓冲区中取出网络帧,并经过网络协议栈,从下到上逐层处理这个网络帧。ide
网络包的发送流程了解网络包的接收流程后,就很容易理解网络包的发送流程。网络包的发送流程就是上图的右半部分,很容易发现,网络包的发送方向,正好跟接收方向相反。性能
首先,应用程序调用 Socket API(好比 sendmsg)发送网络包。code
因为这是一个系统调用,因此会陷入到内核态的套接字层中。套接字层会把数据包放到 Socket 发送缓冲区中。blog
接下来,网络协议栈从 Socket 发送缓冲区中,取出数据包;再按照 TCP/IP 栈,从上到下逐层处理。好比,传输层和网络层,分别为其增长 TCP 头和 IP 头,执行路由查找确认下一跳的 IP,并按照 MTU 大小进行分片。接口
分片后的网络包,再送到网络接口层,进行物理地址寻址,以找到下一跳的 MAC 地址。而后添加帧头和帧尾,放到发包队列中。这一切完成后,会有软中断通知驱动程序:发包队列中有新的网络帧须要发送。队列
带宽,表示链路的最大传输速率,单位一般为 b/s (比特 / 秒)。
吞吐量,表示单位时间内成功传输的数据量,单位一般为 b/s(比特 / 秒)或者 B/s(字节 / 秒)。吞吐量受带宽限制,而吞吐量 / 带宽,也就是该网络的使用率。
延时,表示从网络请求发出后,一直到收到远端响应,所须要的时间延迟。在不一样场景中,这一指标可能会有不一样含义。好比,它能够表示,创建链接须要的时间(好比 TCP 握手延时),或一个数据包往返所需的时间(好比 RTT)。
除了这些指标,网络的可用性(网络可否正常通讯)、并发链接数(TCP 链接数量)、丢包率(丢包百分比)、重传率(从新传输的网络包比例)等也是经常使用的性能指标。