通信管理员(一)居于MAC地址的网络通信

通信管理员(一)居于MAC地址的网络通信


前言

没有办法,这将是一场持久战,要劳逸结合、到处游玩(这次参加“玉林荔枝狗肉节”、游玩了八处市县镇),我也开始晚上抽时间去“学习唱歌”。

网络通信是很复杂的,编写相应代码打算分2步走:这只是初步方案。
a、实现“自己想象”的居于MAC的简化网络通信代码,去除IP地址、合拼TCP和UDP,TCP/IP四层协议体系改为NTCP/MAC三层协议体系。
b、兼容现有的TCP/IP四层协议体系的实现代码,做些简化,支持IPV6。

1)、“通信”就意味着A和B双方存在一种“连接”,如何去描述各种类型的“连接”呢?我们将“连接”看作一种特殊的“内存文件”,那么、对“连接”的操作就可以等效视作对文件的操作了。其实用户进程对文件的操作也可以视为用户进程与文件之间的一种半双工通信模式。在应用程序的操作下:A方机器的数据流从文件A流入内存流容器(或说缓冲区),之后“通信协议”作用下到达另一台机器B方的内存流容器(或说缓冲区),再到文件B。这是一种单工通信或说半双工通信过程,全双工则需要两套。流(stream)就是指很大的数据流、甚至无限的数据流;通常的文件数据、我们就看作是一个数据流。因为内存空间有限,不可能完全装入一个大的数据流;所以、通常是使用窗口,操作(读、写)数据流中的一部分;要操作另一部分时、则通过移动窗口、或移动流。而这种窗口、就称为数据流的位容器、简称流容器,或说“内存缓冲区”。

2)、一个进程最大可以打开64K个文件(或连接),文件对象file数组的下标是文件描述符fd(File Descriptor)(fd只是一个小整数,最大64K)
,在open时产生。fd起到一个索引的作用,进程通过PCB(Process Control Block)中的文件描述符表fdt( file descriptor table )找到该fd所指向的文件对象file(或说file_struct文件结构体)。Linux操作系统下的PCB是:task_struct,文件对象file包含有字段:磁盘空间中的当前文件偏移量(current file offset),文件相对应的内存流容器(或说缓冲区)指针和大小,文件相应的属性记录FAR指针(也就是到v节点的指针。对文件属性的描述,也称为文件索引节点对象(inode(information node 或index node) object),在内存中打开的inode称为vnode(v节点、128字节)或称fnode(file_node ),而描述“通信连接”的v节点称为connect_node节点或cnode节点),访问模式(file status flags)等等。

3)、描述“通信连接”的文件描述符是cfd(connect_fd),其相应的“通信连接”文件对象file所对应的内存文件(也可以是磁盘文件)是一个“连接信息统计日志”文件、对应的内存流容器是“信令帧和统计信息”;而相应的cnode节点包含可以关联2个文件描述符fd号、或说可以关联2个打开文件及双缓冲机制,可以一个文件流收、另一个发等等。是故,一个“通信连接”在一端就可以关联1–3个文件及相应内存流容器,实现半或全双工文件流通信。内存流容器(或说缓冲区)、文件号分配等等的空间分配算法为公用的“四方兽空间分配算法,青龙粒、白虎骨,朱雀来、玄武出。”

4)、协议端口号(protocol port number,简称端口号pn),用于标识通信的应用进程。内核需要一个端口表pnt(port number table)使之与应用进程描述符pd(Process Descriptor或说进程号)关联。端口号的分配是一个重要问题。有两种基本分配方式:第一种叫全局分配,这是一种集中控制方式,由一个公认的中央机构根据用户需要进行统一分配,并将结果公布于众。第二种是本地分配,又称动态连接,即进程需要访问传输层服务时,向本地操作系统提出申请,操作系统返回一个本地唯一的端口,进程再通过合适的系统调用将自己与该端口号联系起来(绑扎)。TCP/IP 端口号的分配中综合了上述两种方式。TCP/IP 将端口号分为两部分,少量的作为保留端口,以全局方式分配给服务进程。因此,每一个标准服务器都拥有一个全局公认的端口(即周知口,well-known port),即使在不同机器上,其端口号也相同。剩余的为自由端口,以本地方式进行分配。TCP 和 UDP 均规定,小于 256的端口号才能作保留端口。如果去除端口号pn,直接用进程号pd来取代、就可去除端口表pnt及相关代码不更好吗?呵呵,习惯成自然。

5)、Socket “插口”的英文原意就是“孔”或“插座”,一个A方进程可以与另一个B方进程有一个或多个“通信连接”,两个进程间的一个通信链路称为一个“通信连接”。描述A方或B方进程、需要一个端口表pnt使得端口号pn与进程号pd关联,也需要一个Socket “插口”号Sockfd = cfd来表述进程下的一个“通信连接”;一个完整的 Socket 则用一个五元相关描述:{ 协议,本地地址,本地端口 + 本地cfd,远程地址,远程端口 + 远地cfd },全网唯一的本地或远端地址(类比于电话号码)可以是MAC地址或IP地址,现在的TCP/IP同时使用了MAC地址 + IP地址,有重复之嫌、使得代码与协议复杂化。而(端口号 + cfd)类比于电话机。任何用户在通话之前,首先要占有一部电话机,相当于申请一个 (端口号 + Socket 号);同时要知道对方的电话机与号码,相当于对方有一个 (远程地址,端口号 + Socket 号)。然后向对方拨号呼叫,相当于发出连接请求(相当于给出网络地址)。对方假如在场并空闲(相当于通信的另一主机开机且可以接受连接请求),拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是向电话机发出信号和从电话机接受信号的过程,相当于向 Socket 发送数据和从 Socket 接受数据。通话结束后,一方挂起电话机,相当于关闭 Socket,撤消连接。现在的TCP/IP协议头格式中没有包含Socket号cfd,那么接收到一个MAC帧时、就算解开TCP头得到本地端口号pn,之后从端口表得知进程号pd,再从pd的PCB的文件描述符表fdt中、一个一个地查询file_struct内容中指向的cnode节点内容的(远程地址,远程端口)、再比较,最后才得知该数据包的Socket号cfd;效率也太低了、代码量巨增,少量连接时还勉强,成千上万个连接时、只能呵呵。应用进程在open()一个连接时,返回了Socket号cfd;其它网络API操作都是有cfd定位了,直接定位操作自然是无此问题。
完整的 Socket 五元相关的其它描述方案(居于MAC地址的网络通信):
a、{ 协议,本地MAC地址,本地端口 + 本地cfd,远程MAC地址,远程端口 + 远程cfd },简化网络通信代码。
b、{ 协议,本地MAC地址,本地进程号pd + 本地cfd,远端MAC地址,远端进程号pd + 远端cfd },去除端口表,简化网络通信代码。
c、{ 协议,本地MAC地址,本地cnode节点号cnd,远端MAC地址,远端cnode节点号cnd },cnode节点包含fd、cfd,简化网络通信代码。

6)、自定I/O函数库有最多32个函数(常用16个)。fopen() 函数返回文件对象file(或说file_struct文件结构体)的指针,file_struct文件结构包含:用于实际I/O的文件号fd,磁盘空间中的当前文件偏移量(current file offset),文件相对应的内存流容器(或说缓冲区)指针和大小,状态标志等等。文件流最常用的函数有:fopen()、fclose()、fread()、fwrite()、fseek()、printf()、fscanf()、fflush()、fcntl()、fioctl()。简易AOS中一切皆文件,网络编程也不例外;应用程序的编程接口API(Application Program Interface)或者是使用I/O函数库、又或者使用“消息”机制。应用程序常用的是操作:文件流容器、内存vnode(v节点)、file_struct。设备也是一种内存文件目录系统,有各种各样的内存vnode(v节点)去描述不同种类的文件目录系统(fnode)、不同种类的硬件设备(dnode)、不同种类的通信连接(cnode);即使是“通信连接”也会有硬件部分实现了的,如单线协议主接口 (SWPMI)、管理数据输入/ 输出 (MDIOS)、安全数字输入/ 输出多媒体卡接口 (SDMMC)、FD 控制器局域网络 (FDCAN )、USB on-the-go 高速(OTG_HS)、以太网 (ETH) :通过 DMA 控制器进行介质访问控制 (MAC)、SPDIF 接收器接口 (SPDIFRX)、串行音频接口 (SAI)、串行外设接口 (SPI)、低功耗通用异步接收器 (LPUART)、通用同步异步收发器 (USART)、内部集成电路 (I2C) 接口、数字摄像头接口 (DCMI)、QuadSPI 接口(QUADSPI )、灵活存储控制器(FMC )、直接存储器访问控制器(DMA1 、DMA2 )、等等,一个种类Class的设备可以有多个设备对象、如SPI1、SPI2等,而设备都应连接到总线(Bus)上,因而构成了设备文件目录树状结构。不同种类的设备或文件目录系统最终反映到统一的I/O函数库会有不同的实现代码。当应用程序基于MAC_vnode节点编程时,是以MAC帧结构的底层通信编程;基于TCP/IP_vnode或UDP/IP_vnode或NTCP_vnode节点编程时,是以数据包(Packet)结构的通信编程。至于那些:bind()、socket()、listen()、accept()、connect()、write()、read()、recvfrom()、upds_respon()、recv()、send()、recvmsg()、sendmsg()、shutdoen()、sigio、select()等等API函数通通清除,它们是内核实现、用户不必理会,对于用户而言一切(文件或设备或通信)操作只用I/O函数库或者使用“消息”机制。当你弄明白这节所说的,编写简易AOS已经无障碍。

7)、网络协议通常分不同层次进行开发,每一层分别负责不同的通信功能。国际互联网标准化组织ISO(International Standards Organizations)定义的网络7分层开放互联模型ISO/OSI(Open System Interconnection Reference Model),但在实际中TCP/IP四层协议栈更为广泛。
物理层(Physical Layer)1:设备(网线、网卡)之间的比特流的传输、接口、电气特性等。IEEE 802.2、Ethernet v.2、Internetwork、RJ-45。
数据链路层(Data Link Layer)2:MAC帧(frame)数据流,MAC地址访问媒介,差错校验。SDLC、HDLC、PPP、STP、帧中继。
网络层(NetWork Layer)3:提供逻辑地址(ip地址)、选路(选择传输路径)。IPv4/v6、IPX、ICMP、SLIP、E/G GP、IGRP、RIP、OSPF。
传输层(Transport Layer)4:可靠与不可靠性的传输(TCP、UDP、确定端口号)、传输前的错误检测、流控。包(Packet)数据流。
会话层(Session Layer)5:建立、管理、终止会话。NFS、SQL、SSL、RPC 、X-WINDOWS、ASP(APPTALK会话协议)、等。报文。
表示层(Presentation Layer)6:数据表示、安全、压缩。文本:ASCII、EBCDIC。图形:JPEG、GIF等,视音:MPEG等。报文(message)
应用层(Application Layer)7:用户提供服务的接口。TELNET、FTP、TFTP、SMTP、SNMP、HTTP、BOOTP、DHCP、DNS。报文。

TCP/IP四层协议栈:
链路层MAC(介质访问控制 Media access control):也称作数据链路层或网络接口层,对应OSI的1、2层。
网络层(NetWork Layer):也称互联网层,处理分组在网络中的活动,例如分组的选路。IPv4/v6、ICMP、IGMP、OSPF、等,对应OSI的3层。
传输层(Transport Layer):TCP、UDP,对应OSI的4层。
应用层(Application Layer):负责处理特定的应用程序细节。对应OSI的5、6、7层。
附录:
IP(因特网协议 Internet Protocol)处理实际上传输数据。
TCP(Transmission Control Protocol)协议。
ICMP(因特网控制信息协议 Internet Control Message Protocol)处理 IP 的状态信息,比如能影响路由决策的数据错误或改变。
RIP(路由信息协议 Routing Information Protocol)它是几个决定信息传输的最佳路由路线协议中的一个。
OSPF(Open Shortest Path First)一个用来决定路由的协议。网络地址协议决定了命名电脑地址的方法:使用一个唯一的数字和一个字母名字。
ARP(地址决定协议 Address Resolution Protocol)确定网络上一台电脑的数字地址。
RARP(反向地址决定协议 Reverse Address Resolution Protocol)确定网络上一台计算机的地址,和 ARP正好相反。
EGP(外部网关协议Exterior Gateway Protocol)为外网传输路由信息。
GGP(网关到网关协议 Gateway-to-Gateway Protocol)在网关和网关之间传输路由协议。
IGP(内部网关协议 Interior Gateway Protocol)在内网传输路由信息。
DNS(域名系统 Domain Name System)从机器的名字确定一个机器的数字地址。
BOOTP(启动协议 Boot Protocol) 由网络服务器上取得启动信息,然后将本地的网络计算机启动。
FTP(文件传输协议 File Transfer Protocol)通过国际互连网从一台计算机上传输一个或多个文件到另外一台计算机。
TFTP ( Trivial File Transfer Protocol)简单文件传输协议。
TELNET(telecommunication network protocol)远程登陆(Remote Login)网络上一台机器,就像使用者直接在本地操作一样。
NFS(网络文件系统 Network File System)一台机器的目录被另一台机器上的用户安装(Mount)到自己的机器上,就像是对本地文件系统操作。
NIS(网络信息服务 Network Information Service)对整个网络用户的用户名、密码统一管理,简化NIS 服务下整个网络登陆的用户名/密码检查。
RPC(远程过程调用 Remote Procedure Call)通过它可以允许远程的应用程序通过简单的、有效的手段联系本地的应用程序,反之也是。
SMTP(简单邮件传输协议 Simple Mail Transfer Protocol)电子邮件在多台机器中传输的协议,发邮件的SMTP服务器提供的服务。TCP 25端口。
SNMP(简单网络管理协议 Simple Network Management Protocol)是一项为超级用户准备的服务,超级用户可以通过它来进行简单的网络管理。
HTTP (Hyper Text Transfer Protocol)超文本传输协议,TCP80端口。
S-HTTP (Safe Hyper Text Transfer Protocol)安全超文本传输协议。
NNTP(Network News Transfer Protocol)网络新闻传输协议。
POP3 ------邮局协议第三版 TCP的110端口,用于收邮件。
Finger------ 用户信息协议
IMAP4------- 因特网信息访问协议第四版
LPR --------UNIX 远程打印协议
Rwho ------UNIX 远程 Who协议
Rexec -------UNIX远程执行协议
Login------- UNIX 远程登陆协议
RSH------ UNIX 远程Shell协议
NTF HP------网络文件传输协议
RDA HP------ 远程数据库访问协议
VT ------虚拟终端仿真协议
RFA HP -------远程文件访问协议
GDP-------网关发现协议
CMOT -------基于TCP/IP的CMIP协议
SOCKS -------安全套接字协议
FANP------流属性通知协议
SLP-------服务定位协议
MSN--------微软网络服务
Radius------- 远程用户拨号认证服务协议
R-STAT -----SUN远程状态协议
NSM --------SUN 网络状态监测协议
PMAP -------SUN 端口映射协议
LPR ---------UNIX远程打印协议
DHCP-------动态主机配套协议
NTP--------网络时间协议
STP(Spanning Tree Protocol)。
中继器(Repeater),集线器(Hub),网卡(NIC - Network Interface Card),交换机(Switch),网桥(Bridge)。

一、居于MAC的网络通信的互联网物理地址PA分配

互联网上的每个接口必须有一个唯一的 Internet物理地址PA(也称作MAC地址、简称MA(Media Access Control Address),也称为局域网地址、简称LA(LAN Address),也称为以太网地址EA(Ethernet Address)或物理地址PA(Physical Address))。现有的物理地址大小是48bit(比特位),前24位是厂商编号,后24位为网卡编号。以太网地址管理机构(IEEE)将以太网地址,也就是48比特的不同组合,分为若干独立的连续地址组,生产以太网网卡的厂家就购买其中一组,具体生产时,逐个将唯一地址赋予以太网卡。MAC地址就如同我们身份证上的身份证号码,具有全球唯一性。有了MAC地址或说物理地址PA,再去整上IP地址、岂非是多余?4字节的IPv4地址不够用时,现在又弄一个16字节的IPv6地址协议;我只能呵呵,IP地址除了增加协议的复杂度和代码量的巨增及实现复杂外,带来的是啰嗦、低效率、低速,我真没看到有好处的地方。

1、互联网物理地址PA为6字节,表示为:A.B.C.D.E.F。一个字节表示的数值范围:0–255。单播和广播地址:
a)、A字节、国家级地址聚集编号。A为0、联合国及全球通用地址聚集,为1–233、197个国家+36个地区,为234–254、人口大国的第二地址,为255、全球广播地址。
b)、B字节、省(州)级地址聚集编号。以中国为例的一种分配方案:B为255、中国范围内的广播地址,中央政府机构0和1、外交2、军事3、省级政府机构4,六大通信部门(广电、联通、移动、电信、电力、铁通,或合拼成32)636个省区(省23、自治区5、行政区2、直辖市6(以后扩充)) = 216个(5–220),备用的地址聚集编号为221–254(可用于人口大省的第二地址)。
c)、C.D双字节:市(直辖市区)/市辖区/街道/园区(居民小区、大企业)、市/县/乡镇/村、地址聚集编号。C.D为255.255、省区范围内的广播地址,C.D.E为X.X.255、市区/小区(乡镇村)(X.X看作十六位二进制数,多大的广播范围取决于连续低位1的数量)范围内的广播地址,具体分配由六大通信部门去规划,所有的地址聚集编号、骨干交换机、基础无线路由器(集线器、交换机)等网络设备,都必须有GPS位置定位、周边100米范围的“环境3D视音频、图片”,必须与用户“邮政地址”、或说用户“网购地址”一一对应。
d)、E字节:基础无线路由器(集线器、交换机)级地址聚集编号。数量最大的、安装时也需要国家管控和地理认证的网络设备。为实现其周边100米范围内的移动设备(如手机等)无线接入、或许是好几台互联成组。A.B.C.D.E.0为基础无线路由器(集线器、交换机)自身设备地址(C.D级的交换机自身地址为A.B.C.D.0.X,同理B级的交换机自身地址为A.B.0.0.X.X),A.B.C.D.E.255为基础无线路由器的本地广播地址,F字节的1–254编号为基础无线路由器下辖的运行主机或无线接入wifi移动接入设备(如手机等)、之动态地址编号,由基础无线路由器自动分配;也可以设置主机为静态固定地址编号,而不管主机是否运行,但无线wifi移动接入设备(如手机)必定是动态分配地址编号。通常1–99为静态手动分配地址、100–254为动态分配地址。

2、组播地址: 用户组播功能从路由器、交换机中剔除,用户组播应该是应用层的事情,而路由器、交换机只是数据包交换或转发。用户组播功能是由某个服务器、或用户主机来实现,组播地址本质上还是多个组成员的单播地址,但其内容为同一份数据报。这种用户组播功能是相当灵活、强大的,表大小不受限、可以构建许多个组;易于实现权限,组成员管理,轻松构建全球性的VLAN。但组播服务器的带宽要高些,这需要在NLA、或TLA上建立组播服务器才合理。

3、全球通用地址:主机或移动终端的端口开机宣告地址::0,源和目的地址都是::0,通过MAC端口请求基础无线路由器分配终端地址、并得知上级基础无线路由器地址。当源地址为静态地址::X、目的地址是::0时,通过MAC端口请求基础无线路由器地址前缀。基础无线路由器开机宣告地址::0.255,通过到上级交换机的MAC端口请求为基础无线路由器分配地址、并得知上级地址前缀。全球通用端口环回地址为::1。

对互联网物理地址PA的聚集分配模式,使得对运行主机或无线接入wifi移动接入设备(如手机等)的“定位”易于实现,网络安全系数大大提高,互联网的“黑鸭(黑客)”也将变成“白鸭”;网络设备和主机的代码编写变得简单、清晰,代码量也大幅降低;容易提升网络设备的性能、如支持最大载荷为64KB的帧。例子:如果一个C.D级交换机有96个光纤千兆下级出口、最少有6个光纤万兆同级口、2个光纤万兆上级口,连接六大通信部门则需要6台组网,可以有6254254个(387096)单播PA地址;如果每个光纤千兆下级出口再连接一台24口集线光纤交换机、则可以连接69622 = 12672台基础无线路由器,平均每台基础无线路由器可以分配约30个PA地址。这种情形、相当于一个用户数约1.2万户的小区,每户有一个光纤千兆口、占30个PA地址。

二、路由器和终端设备(主机)

交换机、集线器、无线路由器等设备统一视同为路由器,固定终端设备(如电脑等)、无线wifi移动接入终端设备(如手机等)统一视同为主机,网络上任一台主机或路由器及其所处网络位置称为网络节点设备、简称节点。这样就有四种通信模式:源主机–目标主机、源主机–目标路由器、源路由器–目标主机、源路由器–目标路由器。MAC帧分为信令帧ICMP和NTCP数据报文帧,为简化代码和协议、
MAC帧 = MAC帧头14字节 + NTCP头20字节 + ICMP头10字节 +【数据Data】+MAC帧尾4字节,最小数据(Data) = 16字节;只有主机到主机的通信模式、才会同时具备信令帧ICMP和NTCP数据报文帧,其它通信模式只有ICMP信令帧。
NTCP/PA三层协议栈:
链路层MAC(介质访问控制 Media access control):也称作数据链路层或网络接口层,互联网物理地址PA,对应OSI的1、2层。
网络传输层(NetWork Transport Layer):NTCP、ICMP,对应OSI的3、4层。
应用层(Application Layer):处理应用细节。对应OSI的5、6、7层。

1、MAC帧结构
因为取消重复的IP地址,合拼TCP和UDP,TCP/IP四层协议系统改为NTCP/MAC三层协议体系;网络传输控制协议NTCP(NetWork Transmission Control Protocol)也作了很大的改进和简化、去除大部分的现有网络协议,实现代码量大幅减少。
MAC帧分为信令帧ICMP(因特网控制信息协议 Internet Control Message Protocol)和数据帧DF(Data Frame)。
帧头( Preamble )14字节【不包含前置同步码字段7字节(0和1交替的56位(55-55-55-55-55-55-55))和帧的1字节起始定界标志SFD( Start of Frame Delimiter 固定为10101011 )以及内容数据、 EOF (End of Frame)帧结束字段】= 目的物理地址DPA( Destination Physical Address ) 6字节 + 源物理地址SPA( Source Physical Address )6字节 + 类型/长度(type/lenth)2字节。
帧尾 = 帧校验序列FCS(Frame check sequence)字段4字节(也称循环冗余校验CRC字段(Cyclic Redundancy Check))。
NTCP头20字节(NTCP首部结构) = 1字节TTL跳数限制 + 1字节TOS传输优先级、流量类型(或说业务流类别Traffic Class)+2字节PLL载荷长度Payload Length(本帧的有效载荷长度值)+6位FNPP数据包的帧数(一个数据包可分为多个帧最大64帧,0表示ICMP信令帧、1为数据包不分帧)+6位FNP数据包的帧号(或信令帧ICMP时为6位信令连接标志)+20位DFL数据流标识Date Flow Label(标识不同的数据报)+48位源信息(16位源端口号+16位源Socket 连接文件号cfd+16位源进程号SPD)+48位目标信息。
ICMP头10字节 = 1字节Type 类型+1字节Code代码+2字节Checksum+1字节ICMP信令标志+1字节ICMP信令帧segnum附带数据项印记指针(项数n、每项16字节)+1字节源设备状态机和1字节状态标志+1字节目标设备状态机和1字节状态标志。
16字节segnum附带数据项印记(沿途路由器设备标识)= 12位设备类型标识(级数层数路由器或交换机或主机)低4位设备PMTU+6字节设备聚集地址+8字节发送时间戳( xmit)ns。16字节segnum附带数据项也可以是如时间戳或路由表数据、等等的数据项,取决于ICMP信令帧的类型和代码字段。
MAC帧头的类型/长度(type/lenth)2字节:
IPv4:0x0800
ARP:0x0806
PPPoE:0x8864
802.1Q tag:0x8100
IPV6:0x86DD
MPLS Label:0x8847
NTCP:0x999Y,Y为帧有效载荷最大传输单元长度值PMTU(Payload Max Transmission Unit), Y = 0–128、1–256、2–512、3–1024、
4–1280、5–1440、6–2KB、7–4KB、8–8KB、9–16KB、A(10)–32KB、B(11)–64KB、C(12)–128KB、D(13)–256KB、
E(14)–512KB、F(15)–1MB。
实际帧长度 = 帧头尾18字节 + NTCP包头长度20字节 + ICMP头10字节+ 帧载荷长度。
一个NTCP数据包DP(Date Packet)最大可分为64个数据帧,当前最大数据帧(或信令帧)为64KB、故最大数据包为64*64KB = 4MB,最小数据包(或最小信令帧:16字节icmpdata附带数据第0项(发送ICMP信令帧的源设备标识))为1包 = 1帧 = 16B。

2、路由器ICMP信令帧处理程序:
路由器简单说是对于MAC帧选择“路由”转发或交换的设备,路由器有三种以太网 (ETH) Ethernet接口:上级接口、同级接口、下级接口。
a)、路由器据MAC帧地址前缀集来判断目标选路是到往上级、同级、下级路由器的转发(下级过来的可以往上级或同级(通常是往上级),同级过来的可以往上级或下级(通常是往下级),上级过来的可以往下级或同级(通常是往下级))。节点路由器除了对探查与建立连接帧烙上本路由器印记外(有探查与建立连接帧的标志位),其它类型的帧只是转发与差错判断(如有错产生ICMP差错信令帧并烙上本路由器印记到0数据项后回发)。除目标地址为本路由器的情形外(有目标为路由器或主机的标志位),只有E级基础无线路由器和主机可以产生“超时”外的ICMP差错信令帧。路由器先对TTL减1、判断是否超时,没有超时、则判断是否目标PA为本路由器、如是则进入ICMP信令帧接收处理,否则进入转发阶段(ICMP差错信令帧或数据帧或目标它方的ICMP信令帧或广播帧(对每个下级ETH接口进行)都是转发)。
b)、E级基础无线路由器可以对其下属某台终端设备进行封禁与解封(封禁后该主机无法对外收发数据包,如接收到对该主机的帧、则回发“目的不可达”ICMP差错信令帧),对节点路由器也有类似封禁与解封功能、相关服务器通过对邻居路由器的请求帧NS实现。
c)、TTL(Time to Live)超时或超期,当转发一个MAC帧会对TTL减1,减到0时就不再转发这个MAC帧,进行丢弃,同时会向源主机发送超期报文。
d)、大数量的E级基础无线路由器通常只有上级和下级ETH接口,上级过来的MAC帧:如果目标地址PA前缀A.B.C.D.E相合,F=0时的ICMP信令帧则作相应的路由器ICMP信令帧处理,F非0的MAC帧、如果相应主机没有封禁且在开机状态则往下级主机转发、否则产生“目标主机不可达ICMP差错信令帧”。如果目标地址PA前缀A.B.C.D.E不相合,则产生“无路由到达主机ICMP差错信令帧”。
e)、我个人感觉“源抑制”没多少用、应该去除,从而简化编程以及减少网络ICMP信令帧的数量。“参数问题”应是由主机(或目标地址为本路由器时)判断。重定向为主机到路由器的ICMP信令帧,更新路由表。
f)、路由表:简单的每个ETH接口的地址前缀聚集表。E级基础无线路由器还有主机表。

3、ICMP信令帧:分为查询帧和差错帧
ICMP信令帧类型:宣告(主机开机宣告、路由器开机宣告),路由器请求(主机到路由器、路由器到路由器),探查与请求建立连接及控制(主机到主机),选路 OSPFRIP。ICMP信令帧通过ETH接口的DMA进行。
ICMP(因特网控制信息协议 Internet Control Message Protocol)由3类协议帧构成:
a)、NDP(Neighbor Discovery Protocol,邻居发现协议):前缀发现、E级路由器判断目标不可达检测、重复地址监测、地址自动配置、等功能,邻居路由器请求通告ICMP信令帧。
b)、NTCP信令协议(NetWork Transport Layer ICMP):探查与建立连接、连接控制的ICMP信令帧。
c)、OSPFRIP开放最短路径优先动态选路和选路信息协议 (Open Shortest Path First Routing Information Protocol):据地址前缀集来判断目标选路是到往上级、同级、下级路由器的转发。节点路由器除了对探查与建立连接帧烙上本路由器印记外,其它类型的帧只是差错判断(如有错产生ICMP差错信令帧并烙上本路由器印记到0项后回发)与转发。每个路由器有多个路由表:同级、上级、下级接口的地址前缀集路由表。

1)、PA地址配置:
NDP中特有的地址自动配置机制,包括一些列相关功能,如路由器发现、接口ID自动生成、重复地址监测等。通过无状态自动配置机制,链路上的节点可以自动获得全球单播物理地址PA。不使用周期广播模式,而是点对点信令请求(或广播通知)-应答模式。
a)路由器发现:主机通过ETH接口的开机宣告ICMP信令帧,在其上级E路由器获取全球单播PA地址前缀A.B.C.D.E及自动分配的F字段(1–254编号)构成的PA地址、默认路由、链路参数(链路PMTU)、网关等。E级基础无线路由器为实现其周边100米范围内的移动设备(如手机等)无线接入、或许是好几台互联成组,是需要指定其中的主E级基础无线路由器。同理,节点路由器开机宣告ICMP信令帧,在其上级路由器获取全球单播PA地址前缀(也即是节点路由器的地址)、默认路由、链路参数(链路PMTU)、网关等。终端设备PA地址基本上算为认证确定、不能轻易更改。
b)重复地址监测(DAD):如果终端的PA地址F字段(1–254编号)是用户静态固定设置,为保证该地址的唯一性,E级路由器、在其可使用之前,需检验它是否已被链路上的其他终端所使用。路由器的地址也类似,静态固定设置时、需由其上级路由器检验它是否已被链路上的其他节点路由器所使用。
c)前缀重新编址:当网络前缀变化时,路由器在与其相连的链路上发布新的网络参数信息,节点设备捕获这些新信息后,重新配置地址前缀、链路PMTU等地址相关信息。例如E级路由器收到上级路由器通知、更改了PA地址前缀,则会对其下级接口的终端们做广播通知“新的网络参数信息”;C.D级或B级等路由器如收到上级路由器通知、更改了PA地址前缀,则会对其下级或同级接口的它方路由器做“点对点信令帧”通知。
路由重定向:当在本地链路上存在一个更好的到达目的网络的路由器时,路由器需要通告节点来进行相应配置改变。使用地址聚集路由表、取消该功能。
e)PTP(Precision Time Protocol)精确时间协议:是一种时间同步的协议,用于设备之间的高精度时间同步、频率同步。通常设备开机宣告后,向上级请求时间同步。

2)、类型10路由器请求RS(Router Solicitation Message)、类型9路由器通告帧RA(Router Advertisement Message):
节点设备启动后,通过RS消息向路由器发出请求,期望上级路由器立即发送RA消息响应。相同类型的代码字段其它值备用、用于将来扩充。
RS开机宣告ICMP查询信令帧Code代码字段0,NS路由器邻居请求查询帧(Router Neighbor Solicitationh)Code代码字段2。
路由器通告查询帧RA的Code代码字段0,E级路由器广播通告查询帧EBRA(E Broadcast Router Advertisement Message)Code代码字段2,路由器邻居通告查询帧NA (Router Neighbor Advertisement Message) Code代码字段4。
类型138终端设备(主机)探查与连接控制查询帧PCCF(Terminal Device probe and connection control frame):终端设备探查与建立连接查询帧PCF(Terminal Device probe and connection frame)Code代码字段0,终端设备连接控制查询帧CCF(Terminal Device connection control frame)Code代码字段2。
类型3的ICMP“无路由到达主机”差错帧Code代码字段0–15,参考IPV4的ICMP协议。同样、参考IPV4的ICMP协议的有:类型0代码字段0的ICMP查询帧回显应答(Ping应答), 类型4代码字段0的ICMP“源端被关闭”差错帧,类型5代码字段0–3的ICMP“重定向”差错帧,类型8代码字段0的ICMP查询帧回显请求( Ping请求),类型11代码字段0–1的ICMP“超时”差错帧,类型12代码字段0–1的ICMP“参数问题”差错帧,类型13代码字段0的ICMP查询帧时间戳请求,类型14代码字段0的ICMP查询帧时间戳应答。
下面各种情况都不会导致产生ICMP差错报文:
a) ICMP差错报文(但是,ICMP查询报文可能会产生ICMP差错报文)。
b) 目的地址是广播地址的MCA帧。
c) 源地址不是单个主机的MCA帧。这就是说,源地址不能为零地址、环回地址、广播地址。

3)、主机ICMP信令帧处理程序:
a)、开机宣告ICMP信令帧,发送到E级路由器的请求帧ERS,E级路由器应答或通告帧ERA。也接收E级路由器对下级终端设备广播通告帧EBRA。
b)、通过通信部门认证的E级或C.D级路由器进行的主机对邻居路由器的请求帧NS,邻居路由器应答或通告帧NA。普通线路主机无此功能。
c)、广播服务器主机需要认证,普通线路主机被禁止对外广播,但可通过到广播服务器主机的点对点通信实现本地广播(需要服务器对其认证)。作为组播服务器的主机则无限制。
d)、广播帧的接收:除了EBRA,还可设置对广播报文的接收标志,标志1接收、0放弃;16位标志:E级本地广播、C.D级五层邻居本地广播(如市或县级、市辖区或镇级、街道或大企业或大乡、园区(居民小区、大公司)或乡、宾馆(公司等)或村)、B省级广播、A国家级广播、全球广播、所有广播禁止。
e)、终端设备探查与连接控制帧的收发:NTCP.PI.FNPP = 0 AND与: NTCP.PI.FNP.ACK = 1、确认应答帧(ACK + RST或SYN或FIN),NTCP.PI.FNP.RST = 1、复位连接请求帧,NTCP.PI.FNP.SYN = 1、探查与请求建立连接帧(源端发起SYN,正向沿途路由器烙印节点印记、目标端打上烙印建立Sockfd连接和ACK + SYN、反向沿途路由器烙印节点印记、源端经2次握手ICMP信令帧最终确认了双方的Sockfd连接),NTCP.FN.FNP.FIN = 1、释放连接请求帧(2次握手ICMP信令帧.FIN、.FIN+ACK释放连接)。
f)、一个NTCP数据包的收发:拆分数据包到帧、或合拼分帧到数据包缓冲区,丢帧按位图重发(.NBT、.PAFR),流量控制。
g)、ICMP差错信令帧接收:如果1字节ICMP信令标识的差错标志位非0,则表示该帧(信令或数据帧)有错误是差错信令帧,进入相应的差错帧处理。如果接收帧的“参数问题”或因过滤、屏蔽、等,则回发ICMP差错信令帧到源端。

4、MAC帧结构表示

typedef struct_NTCP
{
	u8   TTL;    // 生存时间(Time to Live),跳数限制。
	u8   TOS;   // 服务类型(Type of Service)。8位传输优先级、流量类型,或说业务流类别Traffic Class。
	u16 PLL;    // 载荷长度Payload Length,本帧的有效载荷长度值。
	u32 PI;	// 数据包标识packet identification,包含下列字段:
/*
PI[31:26] = PI.FNPP。数据包的帧数The frames number of per packet,一个数据包可分为多个帧,最大64帧。0为ICMP信令帧,1为数据包不分帧。
PI[25:20] = PI.FNP。数据包的帧号The frame number of the packet。ICMP信令帧时为6位信令连接标志。
PI.FNP.PAFR; 为1、NTCP数据包所有帧接收完成标志Packet all frames received。
PI.FNP.NBT; 为1、NTCP数据包的帧位图传输标志。
PI.FNP.ACK; 为1、确认应答。
PI.FNP.RST; 为1、复位连接。
PI.FNP.SYN; 为1、请求建立连接。
PI.FNP.FIN; 为1、释放连接。
PI[19:0] = DFL;    20位数据流标识字段Date Flow Label,标识不同的数据报。
*/
	u16 SPORT; // 16位源端口号。
	u16 SCFD;   // 16位源Socket 连接文件号cfd。
	u16 SPD;    // 16位源Socket 进程号fd。
	u16 DPORT; // 16位目标端口号。
	u16 DCFD;   // 16位目标Socket 连接文件号cfd。
	u16 DPD;     // 16位目标Socket 进程号fd。
}NTCP;

typedef struct_ICMP
{
	u8   Type;    // ICMP信令帧类型。
	u8   Code;   // ICMP信令帧代码字段。
	u16 Checksum;  // ICMP信令帧校验和字段。
	u8 segnum; // ICMP信令帧segnum附带数据项印记指针(项数n、每项16字节)。
	u8 conflag;        // ICMP信令帧标志字节,包含下列标志:
/*
conflag.RM;   为1、保留标志Reserved Mark。
conflag.BF;    为1、广播帧Broadcast Frame。
conflag.EF;    为1、ICMP差错帧Error Frame。
conflag.PCF;  为1、探查与连接控制帧Probe and connection control frame。
conflag.TRF;  为1、目标PA为路由器的帧Target router Frame。
conflag.SRF;  为1、源PA为路由器的帧Source router Frame。
conflag.ICMP;  为1、ICMP信令帧。
conflag.TLAF;  为1、目标PA为环回地址的帧Target loopback address Frame。
*/
	u16 SSFT;   // 16位源Source stale flag type,8位源状态机、8位源设备状态标志(客户/服务端、静/动PA、移动/固定、地理位置、等)
	u16 DSFT;   // 16位目标 stale flag type,8位目标状态机、8位目标设备状态标志(客户/服务端、静/动PA、移动/固定、地理位置、等)
}ICMP;

5、以太网 (ETH) Ethernet接口
待续。。。。


总结

写这篇文章分心太多,将就看看,以后再修改补充。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值