分类: 虚拟化
这2天上网看了下资料,被吓到了。LINUX的源代码行数超过千万行!属于网络的就有近38万行。就是网络编程的中文介绍资料也眼花缭乱,近千行的砖头也不少。看来难度不小,这章用于学习与探讨。主攻MAC,TCP,IPV6,UDP,WSNP,其它协议相对简单以后再说。
一、网络通信协议:
1、网络接口层(Network Interface Layer)负责和网络的直接通讯。MAC协议:
BU48 | BU48 | BU16 | 数据包(IP) | BU32 |
目的地址 | 源地址 | 类型 | 23――750字符Z | CRC |
类型0X0800 IP数据报。
2、网际层负责和网络接口层之间的直接通讯。IP协议,网际信报控制(ICMP)
网际组管理协议(IGMP)及地址解析协议(ARP),简单网络对象通信协议(WSNP)。IGMP是Internet组管理协议。它用来把一个U D P数据报多播到多个主机。IP层用ICMP来与其他主机或路由器交换错误报文和其他重要信息。IPV6包头格式:
BU4 | BU8 | BU20 | BU16 | BU8 | BU8 | BU128 | BU128 |
版本号6 | 优先级 | 流标识 | 净荷长度 | 下一报头 | HOP限制 | 源IP地址 | 目的IP地址 |
4bit版本号IPv6协议中规定该字段值为6。 8bit优先级,值越大优先级越高。20bit流标识路由器根据流标识的值在连接前采取不同的策略(QoS服务质量控制)。净荷长度(16bit) 指扣除报头后的净负载字节长度。下一报头,如果该数据有附加的扩展头,则该字段标识紧跟的下一个扩展头;若无,则标识传输层协议种类,如UDP(17),TCP(6),WSNP(7)。HOP限制(8bit),跳的限制(Hop limit) 即转发上限(生存时间),该字段是防止数据报传输过程中无休止的循环下去而设定的。该项首先被初始化,然后每经过一个路由器该值就减一,当减为零时仍未到达目的端时就丢弃该数据报。源IP地址(128bit),目的IP地址(128bit)。后面是负载,至少1280字节长,或者在可变MTU(最大传输单元)大小环境中这个值为1500字节。负载在标准模式下最大可为64K字
节,或者在扩展包头的"jumbo payload"选项进行设置。
IPV6规范建议在发送任意长度的包之前,必须检查由源节点到目的节点的路径,计算出可以无需中间节点分片而发送的最大包长度,也就是获得路径最大传输单元。当需要传输的数据包长度超过路径最大传输单元时,源节点就实施分片操作,而目的节点将两个或者多个分片包重组成分片包前的数据包。从而可以避免在中间节点进行分片处理。
一台典型的IPv6主机至少有两个地址:1、接收本地链路信息的链路本地地址
2、可路由的站点本地地址或全球地址。
此外,每台主机还需要时刻保持收听以下多点传送地址上的信息流:
● 节点本地范围内所有节点组播地址(FF01::1)
● 链路本地范围内所有节点组播地址(FF02::1)
● 请求节点组播地址(如果主机的某接口加入请求节点组)
● 组播组多点传送地址(如果主机的某个接口加入任何组播组)
不管地址是采用何种方式确定的,节点都必须确认其可能地址对于本地链路是唯一的。这是通过将邻居请求消息发送到可能的地址来实现的。如果节点接收到任何响应,它就知道该地址已在使用中并且必须确定其他地址。
链路本地地址用在单链路上,站点本地地址用在单站点上。链路本地地址格式表示如下:
BU10 | BU54 | BU64 |
1111111010 | 0 | 接 口 号 |
设计链路本地地址的目的是为了用于自动地址配置、邻居发现或无路由器存在的单链路的寻址。路由器不能将带有链路本地源地址或目的地址的任何包转发到其他链路上去。站点本地地址具有下面的地址格式:
BU10 | BU38 | BU16 | BU64 |
1111111011 | 0 | 子 网 号 | 接 口 号 |
站点本地地址的设计目的是为了用于无需全球前缀的站点内部寻址。路由器不应转发站点外具有站点本地源或目的地址的任何包。
3、 运输层主要为两台主机上的应用程序提供端到端的通信。在T C P / I P协议族中,有3个互不相同的传输协议: T C P(传输控制协议)和U D P(用户数据报协议)。简单网络对象通信协议(WSNP)
4、 应用层负责处理特定的应用程序细节。如Telnet 远程登录。FTP 文件传输协议。SMTP 简 单邮件传送协议。SNMP 简单网络管理协议。
二、协议的实现探讨
流动的数据包:
对于网络管理者来说,它要处理的是双向流动的数据包。先按常规的将网络管理者的代码分成3层:
插口层:是一个到下面协议相关层的协议无关接口。
协议层:
包括协议(TCP/IP/UDP/WSNP)的实现。IP是最低层,TCP和UDP和WSNP在IP的上面。
接口层:包括同网络设备通信的设备驱动程序。
输出处理:应用进程的函数调用控制从插口层到协议层输出子程序,到IP输出子程序,然后到以太网输出子程序。每个函数调用传递一个指向要输出的数据包链表指针。在最低层,设备驱动程序层,链表被放置到设备输出队列并启动设备。函数调用按调用的相反顺序返回,最后系统调用返回给进程。
输入处理:因为输入是异步的,它是通过一个接收完成中断驱动以太网设备驱动程序来接收一个输入分组,而不是通过进程的系统调用。内核处理这个设备中断,并调度设备驱动程序进入运行状态。以太网设备驱动程序处理这个中断,假定它表示一个正常的接收已完成,数据从设备读到一个链表中。设备驱动程序把链表指针传给一个通用以太网输入例程,它通过以太网帧中的类型字段来确定哪个协议层来接收此分组。类型字段标识一个IP数据报或是其它,当是IP数据包时会产生一个软中断来执行IP输入子程序。这样,这个设备中断处理就完成了。IP输入是异步的,IP输入子程序处理每个接收到的IP数据报。它验证IP首部检验和,处理IP选项,验证数据报被传递到正确的主机(通过比较数据报的目标IP地址与主机IP地址),并当系统被配置为一个路由器,且数据报被表注为其他的IP地址时,转发此数据报。如果IP数据报到达它的最终目标,调用IP首部中标识的协议的输入子程:ICMP,IGMP,TCP或UDP,WSNP等。
上述的这些都是网络管理者需具有的基本功能。简单的说网络管理者要实现以下功能:
1、对进来的一个个数据包流要进行分类与分流,把数据包交到相应的网络进程去处理。
2、把来自各个网络进程的分支数据包流进行相应的打包后从以太网设备发出去。
“分门别类”的方法主要是“连接”与“绑定”。
三、数据包缓存
数据包的重组与分段,数据包的交接,不定长的数据包都需要一种可变长的存储结构。内核中的存储器管理直接关系到联网协议的性能。数据包缓存主要用途是保存在进程和网络接口间互相传递的用户数据。
我们先来看下APO的存储结构:
1. 256TZ(512TB)的统一地址空间:有1TZ DDR内存空间,1GZ信胞核空间,其它是并行电子硬盘空间。
2. 进程的虚拟4GZ空间中最高的2GZ为共享空间,映射到DDR内存的最低2GZ空间中。就是说一个进程对高2GZ空间的访问实际是访问到DDR内存的最低2GZ空间。
APO是一个千核架构,每核GPU与CPU合一。研制的目的是使有些性能要比现用的普通4核电脑要好千万倍。网络性能是其中之一。这只能是简单的估算,不要过于较真。假如有1K个分组的IP数据包(32KZ一个包)同时从1K个以太网卡进来。现有的电脑是从网卡复制数据包到缓存链表,这一下就用了32K条指令。还要通过多层多次复制后才到进程,还不算麻烦的协议实现。在这一环节,APO就要快10K倍以上。APO是并行硬件实现的,10多条指令搞定。10K×1K/4核= 2.5M。APO的优良内核软件架构随便都比现有操作系统快10倍以上。有如DDR内存中的1GZ要复制到256的单元中,APO是几条指令搞定;现有的电脑?
APO的一个重要目标是减少现有操作系统的复杂性和代码量。LINUX的源代码行数属于网络的就有近38万行。我们要把属于网络的源代码行数减少为不到200行。这必须有些是硬件来实现,如MAC包的CRC效验等。当然协议是由软件完成的,没太多必要的功能也是放到进程实现。
数据包缓存有3种格式:128Z(256B),256Z(512B),768Z(1536B)。
共享空间其中有:32K×2KZ = 64 MZ = 1K DY;是用于网络数据包缓存。共有:64K个1536B的缓存;64K个512B的缓存;128K个256B的缓存。IP数据包小于250B的用一个小缓存,大于250B小于506B的用中缓存,大于506B的则用大缓存。IP包是不会大于1500B的。属于同一个进程A的IP包流由网络管理者分配缓存并将其形成链表提交给进程A。