计算机网络——IP篇,零拷贝,网络模型(学习笔记)

前言

  本文章为网络编程IP篇的学习笔记,文章中的图片,文字部分引用小林coding,阿秀的学习笔记,知识星球如有侵权,请联系删除。

网络模型

  当前存在三种网络模型划分的方式,分别是OSI七层模型,TCP/IP四层模型,五层模型。OSI七层网络模型的建立主要就是帮助不同类型的主机实现数据传输,优点就是将服务、接口和协议三个概念明确的区分,通过七层结构使不同的网络之间实现可靠的通讯。
计算机网络——IP篇,零拷贝,网络模型(学习笔记)_第1张图片
1、物理层:是最底层或是第一层,包括物理连网媒介,比如电缆连线连接器,物理层协议产生并检测电压以发送和接收携带数据的信号(0和1的电信号),能够设定数据传输速率并监测数据出错率。
2、数据链路层:主要负责对物理层传入的01信号进行帧包装,帧传输,帧同步,确定了01分组的方式,还能对物理层传输过程中受环境干扰产生的错误进行差错监测并采用重传的方法进行帧的差错恢复,主要工造在这层的设备和组件有交换机,在这里加上了MAC的头部也就是以太网使用的头部,包括了接收方和发送方的MAC地址等信息。
3、网络层:主要功能是将网络地址翻译成物理地址,并决定如何将数据从发送方路由到接收方。就是在源机器和目标机器之间建立所使用的路由,这一层本身没有任何错误检测和修正机制(IP属于这层)。
4、传输层:OSI模型中最重要的一层,这里会定义传输数据的协议端口号(能够实现端口到端口的通信,相比之下网络层是实现了主机到主机的通信)同时进行流量控制或是拥塞控制,主要的协议就是TCP和UDP。
5、会话层:负责在网络中的两节点之间建立、维持和终止通信。 会话层的功能包括:建立通信链接,保持会话过程通信链接的畅通,同步两个节点之间的对话,决定通信是否被中断以及通信中断时决定从何处重新发送。 例如:DNS,SSL,TLS。
6、表示层:将设备固有的格式和网络标准数据格式之间转换,比如加密解密,转换翻译,压缩解压,他的格式有JPEG,ASCII,加密格式等。
7、应用层:网络服务和最终用户的一个接口,只需要专注于为用户提供应用功能,针对特定应用协议进行处理,有各种应用程序的协议包括HTTP,FTP。
  五层模型就是将七层模型中的应用层,表示层,会话层都合并到了一层中,而TCP/IP四层模型是在五层模型的基础上把数据链路层和物理层合并成了网络接口层(也有叫数据链路层的)。
计算机网络——IP篇,零拷贝,网络模型(学习笔记)_第2张图片
  在web服务器中从输入网址到显示网页这期间经历的过程:首先浏览器先对输入的URL(包含了访问数据的协议,服务器的名称,数据源的路径名,所以URL里面包含了请求服务器里面的文件资源)进行解析生成发送给web服务器的请求信息(比如HTTP请求报文),之后再查询服务器域名对应的IP地址,主要是通过DNS服务器(保存了web服务器域名和IP的对应关系,域名层级关系类似一个树状结构包含根DNS服务器.,顶级域DNS服务器.com,权威DNS服务器xxx.com),通过DNS解析出IP之后就把HTTP的传输工作交给操作系中的协议栈,在协议栈中先经过收发数据的TCP或是UDP协议(如果是TCP就建立三次握手,产生TCP报文头部)再通过IP协议控制网络包收发操作(IP协议中填入了源地址IP和目标地址IP,多个IP地址通过路由表判断哪个网卡作为源地址IP,生成IP报文头部),然后IP下面的网卡驱动程序负责控制网卡硬件(会在IP头部前面加上MAC地址包含发送方MAC地址和接收方MAC地址,然后网卡会将数字信号转换为电信号),实现对网线中信号执行发送和接收操作。然后电信号到达网线接口,交换机(基于以太网设计的俗称二层网络设备)里的模块进行接收,交换机里的模块将电信号转换为数字信号,然后交换机再根据MAC地址表查到MAC地址,将信号发送给对应的端口。之后到达路由器(基于IP设计的俗称三层网络设备),路由器根据IP头部的内容进行包的转发会到达服务器,服务器再根据上层的协议进行接收(TCP),再根据应用层的程序解析HTTP报文。

IP的分类

  IP是位与TCP/IP参考模型中的第三层——网络层,网络层的主要功能是实现主机与主机之间的通信,也叫点对点的通信。它与MAC(数据链路层)的区别是IP是负责在没有直连的两个网络之间通信传输,而MAC是在两个实现直连的设备之间通信.
  IP地址总共分为5类,A类(第一位是0),B类(第二位是0),C类(第三位是0),D(第四位是0)类,E类。ABC类分为两个部分有网络号和主机号。主机号全为1,用于广播,主机号全为0,用于指定某一个网络。广播地址用于在同一个链路中相互连接的主机之间发送数据包。而DE没有主机号,D类常被用于多播,E类没有被使用,多播用于将包发送给特定组内的所有主机.
  IP分类的缺点:同一网络下没有地址层次,ABC不能与现实网络匹配,C类主机数量太少,B类太多。
  无分类地址CIDR:IP分为两部分,表示形式 a.b.c.d/x,其中 /x 表示前 x 位属于网络号,前面是网络号,后面是主机号。
  子网掩码划分网络号与主机号:将子网掩码和IP地址按位计算AND,就可以得到网络号,子网掩码还将主机号划分为子网网络地址和子网主机地址。
划分网络号和主机号的作用:网络号是为了判断两台设备是否处于同一个广播域内,即网络地址是否相同,相同就可以把数据包直接发送到目标主机,路由器寻址工作中就是通过这样的方式去找到对应的网络号。路由控制表中记录着网络地址与下一步应该发送至路由器的地址。发送IP包时,从路由控制表中找到与该地址具有相同网络地址的记录,如果路由控制表中存在多条相同网络地址的记录,就选择相同位数最多的网络地址,也就是最长匹配。

IP相关技术协议

  DNS:DNS是域名解析技术,可以将域名网站自动转换为具体IP,DNS中的域名用句点来分割,域名中越靠右,层级越高。
  解析流程:浏览器首先看一下缓存里有没有,如果没有就向操作系统的缓存查询,还没有就检查本机域名解析文件 hosts,如果还是没有,就会 DNS 服务器进行查询,查询的过程如下:
  1、客户端先发出DNS请求,并发给本地DNS服务器。
  2、本地域名服务器收到请求,如果缓存里有就直接返回IP地址,没有就去查询根域名服务器。
  3、根域名服务器(根域名服务器是最高层次的,它不直接用于域名解析,但能指出一条查询方向)收到本地DNS请求后,如过是.com就指向顶级域名服务器地址。
  4、本地DNS收到顶级域名服务器地址后发起请求,获得权威DNS服务器地址。
  5、本地再向权威DNS服务器发起请求,权威 DNS 服务器查询后将对应的 IP 地址 X.X.X.X 告诉本地 DNS,本地DNS再将IP地址返回客户端,客户端和目标建立连接。
  ARP协议:在传输IP数据报的时候,通过主机的路由表可以找到下一跳的IP地址,再通过ARP协议可以找到下一跳的MAC地址。ARP通过ARP请求和ARP响应两种方式确定MAC地址。
  主机通过广播发送ARP请求,包中包含了想要知道MAC地址的主机IP,收到包的设备去与自己的IP地址匹配,如果相同就发送自身的MAC地址。
  RAPR协议:这是已知MAC地址求IP地址,与ARP协议相反。
  DHCP:电脑通常都是通过DHCP动态获取IP地址的,DHCP 客户端进程监听的是 68 端口号,DHCP 服务端进程监听的是 67 端口号,主要有下面四个步骤:
  1、客户端发起DHCP发现报文的IP数据报,使用UDP广播通信,通信的目标端口是67,原端口是68,DHCP客户端将IP数据报传给链路层,链路层将广播传到所有的网络设备中。
  2、DHCP服务器收到发现报文后,用DHCP提供报文向客户端做出响应,该报文使用的广播地址不变,并且携带了IP地址,子网掩码,默认网关,DNS服务器和IP地址的租用期。
  3、客户端收到后从报文中选择一个服务器,发送DHCP请求报文,进行响应,回显配置的参数。
  4、最后服务端用DHCP ACK报文回应,应答所有的参数。
交互中全程都是用UDP广播。所以为了解决不在同一个局域网内的问题,出现了DHCP终极代理,对不同网段的IP也可以由一个DHCP服务器统一管理。DHCP中继代理收到广播包后用单播的形式发给DHCP服务器。
  NAT:网络地址转换技术为了解决IPv4地址紧缺的问题。
  ICMP:互联网控制报文协议(平时用的ping是基于这个协议工作的),主要功能是确认IP包是否成功送达目标地址,报告发送过程中 IP 包被废弃的原因和改善网络设置等。
  ICMP分类:查询报文类型,差错报文类型。
  查询报文类型:可以回送消息,用于进行通信的主机或路由器之间,判断所发送的数据包是否已经成功到达对端的一种消息,ping 命令就是利用这个消息实现的。可以回送应答(类型0),也可以回送请求(类型8).
  差错报文类型:有目标不可达消息,IP 路由器无法将 IP 数据包发送给目标地址时,会给发送端主机返回一个目标不可达的 ICMP 消息,并在这个消息中显示不可达的具体原因,原因记录在 ICMP 包头的代码字段。还有原点抑制消息,当路由器向低速线路发送数据时,其发送队列的缓存变为零而无法发送出去时,可以向 IP 包的源地址发送一个 ICMP 原点抑制消息。还有重定向消息,和超时消息。
  IGMP:是因特网组管理协议,工作在主机(组播成员)和最后一跳路由之间。

零拷贝

  磁盘是计算机系统最慢的硬件之一,读写速度相差内存的十倍以上,所以就有了零拷贝还有一些直接IO,异步IO的方法都是为了优化磁盘,提高系统的吞吐量,另外针对操作系统内核中的磁盘高速缓存区,可以有效的减少磁盘的访问次数。
  DMA技术(直接内存访问技术),在进行IO设备和内存的数据传输的时候,数据搬运的工作全部交给DMA控制器,而CPU不再参与任何与数据搬运相关的事情,这样CPU就可以去处理别的事务。具体的过程是,用户进程调用read方法,向操作系统发出IO请求,请求读取数据到自己的内存缓冲区中,进程进入阻塞状态,操作系统收到请求后,进一步将IO请求发送DMA,然后让CPU执行其他任务。DMA进一步将IO请求发送给磁盘,磁盘收到DMA的IO请求,把数据从磁盘读取到磁盘控制器的缓冲区中,当磁盘控制器的缓冲区被读满后,向DMA发起中断请求,告知自己缓冲区已满,DMA收到磁盘的信号,将磁盘控制器缓冲区中的数据拷贝到内核缓冲区中,此时不占用CPU,当DMA读取了足够多的数据,就会发送中断信号给CPU,CPU收到了DMA信号,知道数据已经准备好了就将数据从内核拷贝到用户空间,系统调用返回。CPU不再参与将数据从磁盘控制器缓冲区搬运到内核空间的工作,这部分工作由DMA完成。
一般传统的文件传输过程如下所示:
计算机网络——IP篇,零拷贝,网络模型(学习笔记)_第3张图片
  总共需要经历4次用户态和内核态的上下文切换,因为发生了两次系统调用,一次是read(),一次是write(),每次系统调用都是先从用户态切换到内核态,等内核完成任务后,再从内核态切换回用户态。还发生了4次数据拷贝,分别是从磁盘上的数据拷贝到操作系统内核的缓冲区(通过DMA搬运),把内核缓冲区的数据拷贝到用户的缓冲区(通过CPU完成),把用户缓冲区的数据拷贝到内核的socket缓冲区(由CPU完成),把内核socket缓冲区里的数据拷贝到网卡缓冲区(由DMA搬运)上述的四次切换,四次拷贝会严重影响性能。
  所以为了优化就有两种途径分别是减少上下文切换次数(减少系统调用次数),不使用户缓冲区。零拷贝是优化的常用方法,一般零拷贝有两种实现方式1、mmap+write,2、senfile。第一种方式使用mmap替换了read,buf = mmap(file,len); write(sockfd, buf, len); mmap()系统调用函数会直接把内核缓冲区里的数据映射到用户空间,这样操作系统内核与用户空间之间就不需要进行任何的数据拷贝操作。具体过程如下,应用进程调用mmap()之后,DMA会把磁盘的数据拷贝到内核的缓冲区里,接着应用进程和操作系统内核共享这个缓冲区,应用进程调用write()操作系统直接将内核缓冲区的数据拷贝到socket缓冲区(这一切都是内核态发生的,由CPU搬运数据),最后把内核态的socket缓冲区的数据拷贝到网卡缓冲区这个过程由DMA完成,所以还是需要两次上系统调用总共需要4次上下文切换,这个好处就是减少了一次数据拷贝的过程。第二种方法是sendfile在linux内核中提供了专门发送文件的系统调用函数sendfile(),ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);前两个参数是目的端和源端的文件描述符,后两个参数是源端的偏移量和复制数据的长度,返回的是实际复制数据的长度。这个函数可以替代read和write可以减少2次上下文切换因为减少了系统调用,并且这个调用可以直接将内核缓冲区(磁盘高速缓存)里的数据拷贝到socket中去,不用再拷贝到用户态,也减少了一次数据拷贝,共有两次上下文切换和三次数据拷贝。此外如果网卡支持SG-DMA技术(和一般的DMA不同)可以进一步减少通过CPU把内核缓冲区里的数据拷贝到socket缓冲区的过程。具体过程如下,通过DMA将磁盘上的数据拷贝到内核缓冲区里,缓冲区描述符和数据长度传到socket缓冲区,这样网卡的 SG-DMA 控制器就可以直接将内核缓存中的数据拷贝到网卡的缓冲区里,此过程不需要将数据从操作系统内核缓冲区拷贝到 socket 缓冲区中,这样就减少了一次数据拷贝,所以只进行了2次拷贝。这是所谓的零拷贝技术,因为我们没有在内存层面去拷贝数据,也就是说全程没有通过 CPU 来搬运数据,所有的数据都是通过 DMA 来进行传输的。零拷贝技术只需要2次上下文切换只需要2次数据拷贝,不需要通过CPU来实现都是有DMA搬运的,所以零拷贝技术可以把文件传输的性能再提升一倍以上。Kafka中就大量使用了零拷贝技术。
  如果是传输大文件,一般会使用read方法读取文件,这时进程会阻塞在read调用因为要等待磁盘的数据返回,这是缓存IO的方式,他的具体过程是先调用read方法然后会一直阻塞着,这时内核会向磁盘发起IO请求,磁盘收到请求后会寻址,当磁盘数据准备好后,就会向内核发起IO中断,告诉内核磁盘数据准备好了,内核收到IO后将数据从磁盘控制器缓冲区拷贝到内和缓冲区(pagecache),最后内核再把pagecache里的数据拷贝到用户缓冲区,然后read调用正常返回。然后对于阻塞的问题可以用异步IO的方式去解决,这主要分为两个部分前半部分内核向磁盘发起读请求,但是可以不等待数据就位就可以返回,进程可以处理其他任务,后半部分,当内核将磁盘中的数据拷贝到进程缓冲区后,进程会接受到内核的通知,再去处理,异步IO没有涉及到内核缓冲区(磁盘高速缓冲区),不涉及PageCache的IO叫做直接IO,使用PageCache的IO叫做缓存IO,通常对于磁盘,异步IO只支持直接IO。

你可能感兴趣的:(tcp/ip,计算机网络,学习)