文章目录
TCP/IP协议族
见上篇 【HarmonyOS学习日志(12)】计算机网络之TCP/IP协议族(一)-CSDN博客
ARP
实现任意网络层地址到任意物理层地址的转换。
主机向自己所在网络广播一个ARP请求,请求中包含目标机器网络地址,这个网络上的其他所有机器都会收到这个请求,但只有被请求的目标机器会应答一个ARP应答,其中包含自己的物理网址。
在该流程中,硬件类型定义物理地址类型,协议类型要表示要映射的协议的地址的类型,两个长度为硬件地址长度字段和协议地址长度字段。
操作则有四种:ARP的请求、ARP的应答,RARP请求和RARP的应答,分别对应的值为1234。
发送端填充除了目的端的以太网地址外的其他三个字段构建ARP请求并发送,而接收端发现该请求目的端的IP地址就是自己,所以就把自己的以太网地址填进去,然后交换这个目的端地址和两个发送端的地址,构建了ARP的应答然后返回,并且把操作的这个字段设置为2,ARP应答。
ARP维护者一个高速的缓存,包含着经常访问和最近访问的机器的IP地址到物理地址的映射。
DNS
域名服务,将机器域名转换成IP地址
DNS是一套分布式的域名服务系统。每个DNS服务器上存在大量的机器域名和IP地址的映射,并且是动态更新的
16位问题个数,16位应答资源记录个数,16位授权资源记录数目,16位额外资源记录数目这四个部分表示资源的记录数目。
标志字段:协商具体的通信方式和反馈通信状态
- QR:查询/应答标志。查询报文(0),应答报文(1)
- Opcode:定义查询和应答的类型。标准查询(0),反向查询(1),请求服务器状态(2)
- AA:授权应答标志,仅由应答报文使用。授权服务器(1)
- TC:截断标志,仅当DNS报文使用UDP服务时使用
- RD:递归查询标志。迭代查询(0),递归查询(1)
- RA:允许递归标志,仅由应答报文使用。DNS服务器支持递归查询(1)
- Zero:未用,置0
- Rcode:应答状态。无错误(0),域名不存在(3)
DNS查询问题的格式
32位的查询名包含16位的查询类型和16位的查询类
-
查询名:以一定格式封装了要查询的主机域名。
-
查询类型:表示如何执行查询操作。
- A(1):获取目标主机的IP地址
- CNAME(5):获得目标主机的别名。
- PTR(12):反向查询。
-
查询类:表示获取因特网地址(IP地址)
资源记录(Resource Record, RR)格式:被用于应答字段、授权字段和额外信息字段
- 32位域名:该记录中与资源对应的名字。
- 16位类型:含义与DNS查询问题中对应字段相同。
- ·16位类:含义与DNS查询问题中对应字段相同。
- 32位生存时间:该查询记录结果可被本地客户端程序缓存多长时间。
IP协议
IP服务的特点
IP协议是TCP/IP协议族的动力,它为上层协议提供无状态、无连接、不可靠的服务。
无状态
IP通信双方不同步传输数据的状态信息,因此所有IP数据报的发送、传输和接受都是相互独立、没有上下文关系的。
这种服务最大的缺点就是无法处理乱序和重复的IP数据报,比如发送端发送出的第N个IP数据报可能比第N+1个IP数据报后到达这个接收端,在这两种情况下IP模块就无法检测到乱序和重重复,因为没有任何的上下文关系。接收端的IP数据模块只要接收到了完整的数据报就会将其数据部分交给上层协议。
上层协议看来是乱序的、重复的。面向连接的协议,比如TCP协议就能够自己处理乱序、重复的报文段。
无状态的服务优点也十分明显:简单、高效。
我们无需为保证通信的状态而分配一些内核资源,也无需每次传输数据的时候携带一些状态的信息。
无连接
IP通信双方都不长久地维持对方的任何信息,每次发送数据时都必须指定对方IP地址。
不可靠
IP协议不能保证IP数据报准确地到达接收端,只是承诺尽最大努力(best effort)
IP头部结构
IP头部信息出现在每个IP数据报中,用于指定IP通信的源端IP地址、目的端IP地址,指导IP分片和重组,以及指定部分通信行为。
IPv4头部结构
4位的版本号指定IP协议的版本(IPv4中的4)
4位头部长度是标识IP头部有多少个32位字也就是四字节
8位服务类型(TOS)包括一个3位的优先权字段,4位的TOS字段和一个保留的字段,保留字段必须要置0。4位的TOS字段分别表示最小延迟、最大吞吐量、最高可靠性和最小费用。
16位总长度是整个IP数据报的长度,因此IP数据报最大的长度单位是65535字节。但由于MTU的限制,数据报都会被分片传输。接下来的3个字段来标识如何进行分片。
- 16位的标识字段是标识主机发送的每个数据报,初始值由系统随机生成,每发送一个数据报,值就+1
- 3位的标志字段的第一位保留,第二位DF表示禁止分片,如果设置了这个位的话IP的这个模块就不会对数据报进行分片,在这种情况下如果IP数据报长度超过了MTU的话将会丢弃数据报并返回一个差错报文。
- 13位片偏移是分片相对原始IP数据报开始处的偏移,实际的偏移值是该值左移三位也就是乘8之后得到的
8位的生存时间(TTL)是指数据包到达目的地址前允许经过的路由器的跳数。常见的数值是64,没经过一个路由就会被路由器减1,到0就会丢弃并返回一个差错报文,这样可以防止陷入路由循环.
8位协议用来区分上层的协议,其中ICMP是1,TCP是6,UDP是17。
16位头部校验和由发送端填充,接收端对其使用CRC的算法以检验头部是否损坏(仅检验头部)
32位的源端IP地址和目的端IP地址用来标识发送端和接收端。
选项字段是可变长的可选信息,最多包含4字节的可选选项包括:
- 记录路由(record route):告诉数据报途径的所有路由器都将自己的IP地址填入头部的选项部分,这样就可以跟踪传输路径。
- 时间戳(timestamp):告诉每个路由器都将数据报被转发的时间填入选项部分,以测量传输时间。
- 松散源路由选择(loose source routing):制定一个路由器的IP地址列表,数据报发送过程中必须严格经过所有的路由器。
- 严格源路由选择(strict source routing):与松散源路由选择相似,不过是数据报只能经过指定的路由器
IPv6头部结构
4位的版本号(version)指定了协议的版本,对于IPv6来说,其值是6。
8位的通讯类型(traffic class)指示数据流通讯类型或优先级
20位的流标签(flow label)是IPv6新增加的字段,对于某些对连接服务质量有特殊要求的通信,比如音频和视频的实时传输数据。
16位的净荷长度(payload length)是指IPv6扩展头部和应用程序之间的和,不包括固定的头部长度。
8位的下一位包头(next header):指出紧跟这个固定头部的头部类型,比如扩展头部或者某个上层协议头部。
8位的跳数限制(hop limit):与TTL相同。
IPv4地址一般使用点分十进制来表示的,而这个IPv6的这个地址是用16进制来表示的
IPv6扩展头部
可变长的扩展头部使得IPv6能支持更多的选项,并且很便于将来的扩展需要。它的长度可以是0,表示数据报没有使用任何扩展头部。一个数据报可以包含多个扩展头部,每个扩展头部的类型由前一个头部(固定头部或扩展头部)中的下一个字段指定。
IP分片
当IP数据报的长度超过帧的MTU时,它将被分片传输。
头部信息
头部中有三个字段提供了足够多的信息:数据报的标识、标志和片偏移。除了最后一个分片之外,其余分片都要置MF标志。此外每个分片的IP的头部的总长度字段都将设置为该分片的长度
例子:携带ICMP报文的IP数据报被分片
在这个例子里面长度是1501字节的IP数据报被拆分成了两个IP分片,其中一个IP分片的长度为1500字节,第二个IP分片的长度为21字节。那么每个IP分片都包含自己的IP的头部20字节,且第一个IP分片的IP头部被设置了MF标志,而第二个则没有设置该标志,因为它是最后一个分片。
原始的IP数据报中,IP头部的内容被完整的复制到了第一个IP的分片中,而第二个IP分片不包含ICMP的头部信息,因为IP模块重组该ICMP的报文的时候只需要一份信息就足够。
ICMP的报文的头部长度取决于报文的类型,变化范围非常的大
IP路由
IP路由决定发送数据报到目标机器的路径
IP模块工作流程
当IP模块接收到了来自数据链路层的IP数据报的时候,它首先对该数据报的头部做CRC的校验,确认无误后再分析具体信息。如果IP数据报头部设置了源站选路选项,则调用数据报转发子模块来处理数据报。如果IP数据报的头部中的目标IP就是本机的某个IP地址或者是广播地址,则该数据报就是发送给主机的。这个IP的模块就根据数据报头部中的协议字段来确定将派发给哪一个上层的应用(分用)。
如果IP模块发现这个数据报不是发送给本机的,也是调用转发子模块来转发出去。转发子模块首先检测子系统是否允许转发,不允许就丢弃,如果允许就执行一些操作,它交给IP数据报输出子模块。
IP模块实现了数据报路由的核心的数据结构是路由表,那么这个表按照数据报的目标的IP地址进行分类,同一个类型的IP数据报将被发往相同的下一跳路由器。
IP的输出队列存放的是所有等待发送的数据报,除了需要转发的数据报之外还包括封装了本机的上层数据的IP数据报。
路由机制
那么路由表是如何按照IP地址分类的?给定数据报的目标IP地址,它将匹配路由表中的哪一项?
路由机制:
- 查找路由表中和数据报的目标IP地址完全匹配的主机IP地址。如果找到,就使用该路由项,没找到则转2。
- 查找路由表中和数据报的目标IP地址具有相同网络ID的网络IP地址。如果找到,就使用该路由项,没找到则转3。
- 选择默认路由项,这通常意味着数据报的下一跳是网关。
IP转发
将不是发送给本机的IP数据报交由数据包转发子模块进行转发。
对于允许IP数据报转发的文件系统(主机/路由器),数据报转发子模块将对期望转发的数据报执行以下操作:
- 检查数据报头部的TTL值。如果TTL为0,则丢弃该数据报。
- 查看数据报头部的严格源路由选择选项。如果该选项被设置,则检测数据报的目标IP地址是否是本机的某个IP地址。如果不是则返回一个ICMP源站选路失败报文。
- 给源端发送一个ICMP重定向报文,以告诉它一个更合适的下一跳路由器(如果有必要)
- 将TTL值减1
- 处理IP头部选项
- 执行IP分片操作(如果有必要)
重定向
ICMP重定向报文
ICMP重定向报文也能用于更新路由表,因此简要讨论ICMP重定向报文。
ICMP重定向报文的数据部分含义都十分明确,它给接收方提供了如下两个信息:
- 引起重定向的IP数据报的源端IP地址。
- 应该使用路由器的IP地址
接收主机根据这两个信息就可以断定引起重定向的IP数据报应该是由哪一个路由器来进行转发,并因此来更新路由表,通常是更新路由表的缓冲而不是直接更改。