网络交互

289 阅读9分钟

1.网络接入

网络接入方式常用的有两种:

 1、宽带接入,也就是需要进行PPPOE拨号接入的网络。在这种接入方式中,无论如何都需要首先进行PPPOE拨号的,只是在设置了路由器,由路由器运行PPPOE拨号之后,用户电脑端及其他无线终端就可以通过动态获取IP地址或者静态设置IP地址进行上网。

 2、专线接入,由运营商分配固定的公网IP地址,用户可使用该IP地址接入网络。在这种接入方式中,不需要运行PPPOE拨号。只需要将IP地址设置为运营商分配的地址并设置正确子网掩码、网关、DNS等信息即可。

2.网络传输

两台计算机通过 TCP/IP 协议通讯的过程如下所示:

数据包的封装分用

不同网络环境中,网络数据传输流程

(1)网络互联:

① ARP 缓存表中 可以找到 目的主机MAC\n\n\n1、主机1查找本机ARP缓存表,根据ARP协议,找到MAC数据报由主机1,发送到集线器(数据报中:源MAC(主机1),目的MAC(主机3))(真实的数据报)集线器 直接转发 数据到除主机1的其他所有相连主机(主机2,主机3)主机2接收:数据报中,目的MAC不是我,丢弃主机3接收:数据报中,目的MAC是我,接收。 目的IP是我,交给对应端口进程处理

② ARP 缓存表中 找不到 目的主机MAC:主机1查找本机ARP缓存表,发现找不到目的主机MAC主机1发送广播数据报(非真实数据,只是要求对应主机返回MAC数据)广播数据报通过集线器转发到主机2、主机3主机2接收:要求的IP不是,丢弃主机3接收:要求的IP是我,返回我的MAC主机1收到主机3的返回数据(IP、MAC),更新自己的ARP缓存表,主机1发送真实的数据到主机3,(真实的数据 ,源MAC/源IP:主机1的MAC/IP , 目的MAC/目的IP :主机3的MAC/IP)

③ 使用集线器的缺陷: 网络冲突(比如,你想知道张三的qq号,你开群聊发消息,就会对群聊里其他成员造成不必要的麻烦)

(2)局域网:

① 局域网 交换机 组网方式:(路由器(方式2)和它一样),主机1查找本机ARP缓存表,如果找不到,发送广播数据报,让IP为主机3的告诉我它的MAC,交换机转发到其他所有端口(广播),主机2丢弃,主机3返回自己的MAC,交换机知道主机3的MAC,然后主机1也就知道了主机3的MAC(更新ARP缓存表),主机1发真实的数据给交换机(源MAC:主机1 , 目的MAC:主机3),交换机查找自己的MAC地址转化表,通过MAC找端口,发送到对应端口,主机3接收:目的MAC是我,目的IP也是我,局域网 与 网络互联 数据传输的区别在于:局域网方式是定向传输,而网络互联是广播式传输,(先问张三手机号,在打电话给张三,不影响李四)

② 局域网 交换机 + 路由器 的方式:通过目的 IP+子网掩码,计算出是否目的主机和本机在同一网段(IP和子网掩码位与操作,得到网络号,如果是,和之前交换机组局域网流程一致,如果不是,表示我主机1处理不了,要发给网关转发(路由器),数据报发给路由器,(源IP:192.168.1.x 源MAC:主机1的),(目的IP:192.168.2.y 目的MAC:路由器网卡1的MAC)125、路由器接收到数据报,分用:物理层到网络层,所以可以获取到目的IP,路由器查找自己的ARP缓存表(IP找MAC),找不到,路由器发广播,主机2你在哪?告诉我你的MAC,有了MAC,直接发送到主机,局域网方式是只使用 LAN 口,而广域网 LAN口和WAN都使用

(3)广域网:

主机1:发送 www.baidu.com 网络数据报,DNS协议:域名 转 IP,源IP:主机1的IP 源MAC:主机1的MAC,目的IP:百度服务器的IP 目的MAC:根据目的IP计算是否和主机1在同一网段,不是同一个网段:发送数据报到网关(路由器),交换机转发(没有封装分用):在MAC地址转换表,通过目的MAC找端口,路由器接收、分用、修改数据报,路途中的设备:百度服务器:(接收数据并响应),路由器1接收 百度服务器的响应数据(分用、修改、封装),主机接收数据报(分用)

3,网络提速

当用户需要向网络发送数据的时候,用户实际上是通过应用程序来完成这项工作。应用程序向一个描述了对端连接的文件描述符(File Description)写数据。之后位于操作系统内核的TCP/IP协议栈,从文件描述符收到数据,完成TCP分段(如果是TCP连接的话),加TCP,IP,Ethernet Header。在加这些Header的时候,也涉及到一些内容的计算,例如校验和,序列号。最后,操作系统内核通过网卡的驱动,告知网卡需要发送的数据,这里的数据是长度合适,并且封装了各种协议头的网络数据。网卡会再加一些其他数据确保传输的可靠性。最后,网络数据由网卡从网线(如果是有线连接的话)发出去,经过各个网络转发设备送到对端。对端,也就是网络数据的接收端,有个类似的过程,不过方向是反的。网卡从网线接收到数据,通知系统内核来取数据,位于系统内核的TCP/IP协议栈完成校验,剥离TCP、IP、Ethernet头部,拼接数据。最后将完整的数据传递给应用程序,或者说最终用户。用户程序仍然是通过一个文件描述符读取数据。所以,可以将网络传输在操作系统内的整个过程分为三个部分:

User area:应用程序发送和接收数据

Kernel area:TCP/IP协议栈和系统内核对用户数据的封装解封装

Device area:网卡实际的发送并接收网络数据

从前面的描述可以看出,User area和Device area的工作都相对简单,而对于复杂的网络协议的处理主要在Kernel area。Kernel area的任何处理都是需要CPU完成的。很显然,如果单位时间要传递的数据越多,CPU需要进行的运算就越多。网络带宽这些年有了很大的提升,以太网从最开始的10M到现在100G,提升了一万倍。虽然CPU这些年也有很大的发展,但是单核CPU的频率并没有提升这么多。有人可能会说CPU的核数增加了很多,但是把一个网络数据流交给多个CPU核心去处理本身有一定的挑战,另一方面计算机的需要处理的任务越来越复杂,尤其是引入了虚拟化之后,计算机上不仅跑应用程序,还需要跑容器,虚拟机,CPU本身的负荷可能就已经很重。以太网速度的提升大于CPU的计算速度的提升,使得CPU能够用来处理单个网络包的时间变少了。如果CPU不能及时处理网络数据,那必然会影响网络传输的延时(latency)和吞吐量(throughput)。因此需要一些技术/方案来降低CPU处理单个网络包的时间。这次就过一下现在计算机系统中常见的网络加速技术。

DMA全称是Direct Memory Access。DMA可以同时应用于网络数据的发送和接收。DMA本身是一个通用的技术,它有一个独立于CPU的DMA控制器。在数据拷贝的时候,CPU只需要告诉DMA控制器,拷贝数据的起始地址,数据长度,之后将总线控制权交给DMA控制器,就可以不需要CPU的介入,完成数据拷贝。使用DMA,在网卡从内存拷贝数据(发送),和网卡向内存拷贝数据(接收)时,只需要很少的CPU介入。

RSS全称是Receive Side Scaling,从名字上可以看出,这项加速技术只在网络数据接收时有效。具备RSS能力的网卡,有多个接收队列,网卡可以用不同的接收队列来接收不同的网络流,再将这些队列分配到不同的CPU核上进行处理,充分利用多核处理器的能力,将网络数据接收的负荷分散开,从而提高网络传输的效率。RSS虽然能更好的利用多核CPU,但是一方面,网络数据的分发需要考虑TCP连接,NUMA等因素,本身较为复杂。另一方面,它增加了网络传输对CPU的影响,前面说过计算机本身有计算任务,不可能只用来收发网络数据。在实际使用的时候,通常会将RSS限定在有限的几个CPU核上,以隔离网络传输带来的CPU影响。

NAPI全称是New API,这是Linux系统针对网络接收的优化。硬件I/O与CPU的交互一般有中断和轮询两种方式。中断的CPU代价较大,但是实时性好,且不需要CPU一直值守,而轮询需要CPU定期查询I/O,需要CPU一直值守,并且不是真正的实时。对于网卡来说,一个繁忙的网络,每次网络数据包到达,如果都采用中断,这样频繁的中断会影响系统的整体效率。而对于一个流量小的网络,如果采用轮询,一个是实时性差,会导致延时(Latency)上升,另一方面CPU需要一直值守,CPU效率低。NAPI根据不同的场景,采用不同的方式作为CPU和网卡的交互方法,在大网络流量的时候,采用轮询的方式,读取网卡数据,小网络流量的时候则采用中断的方式,从而提高CPU的效率。