IP数据报格式

在这里插入图片描述
如上图,(以IPV4为例)IP数据报首部固定部分共5个“横条”,每“横条”长4字节(32bit),即IP数据报首部固定部分是20字节,普通IP数据报的首部长度(没有可选字段)是20字节。
版本字段(4bit):协议版本号(以IPV4为例,版本号是4);
首部长度字段(4bit):0101~1111(二进制值最小是5,最大是15)首部长度的单位是4字节,即IP数据报首部长度最小是20字节,最大是60字节。
区分服务(最开始称服务类型)字段(8bit):就像是贴在IP数据报上的一个“服务标签”,告诉网络中的路由器:“请按照这个等级来处理和转发我。”网络设备根据这个“标签”来决定让谁先走、给谁更多的带宽、发生拥堵时先丢弃谁的包。
总长度字段(16bit):指整个IP数据报的长度,单位是1字节。
标识字段(16bit):唯一的标识主机所发送的每一份数据报(通常每发送一份报文它的值就会加1)
标志字段(3bit)和片偏移字段(13bit):讨论分片时再来分析。
生存时间字段(8bit)(TTL:Time To Live):设置了数据报可以经过的最多路由器数(初始值由源主机设置),每经过一个处理它的路由器数值就减1,当减至0时,数据报就被丢弃,并发送ICMP报文通知源主机。
协议字段(8bit):被IP用来对数据报进行分用。分用在以往文章中已讨论过
首部检验和字段(16bit):(仅根据IP首部进行计算,它不对首部后面的数据进行计算。然而ICMP、IGMP、UDP
TCP在它们各自的首部中均含有同时覆盖首部和数据的检验和码) 流程:要计算一份IP数据报的首部检验和,首先将首部检验和字段置为0,然后对首部中的每16bit(把首部看成是由很多个16bit的字组成)进行反码求和(普通相加+循环进位、进位加到最低位),然后将得到的值取反后存入检验和字段中,当接收方收到一份IP数据报时,会对首部中的每16bit(其中包括发送方存在首部中的检验和)进行反码求和,所以,如果首部在传输过程中未发生任何差错,那么接收方计算结果应为全1,否则IP就会丢弃收到的数据报,但不会发送差错报文,由上层发现丢失的数据报并进行重传。
源IP地址(32bit)、目的IP地址(32bit):略
可选字段(长度可变):是数据报中的一个可变长的可选信息,该字段一直是以32bit作为界限,在必要的时候插入值为0的填充字节以使IP数据报首部的总字节数是4的倍数。

IP路由选择

1、IP层在内存中有一个路由表,在进行路由选择决策时,主机和路由器都使用路由表,表中有三种类型的路由:特定主机型(与目的IP地址的网络号主机号都要匹配的表目)、特定网络型(与目的网络号相匹配的表目)和默认路由型(标为“默认”的表目);在选择路由时,主机路由优先于网络路由,只有当没有任何其他路由条目能够匹配目的IP地址时,才会使用默认路由。
【对于任何一个需要转发的数据包,无论主机还是路由器,都遵循‘最长前缀匹配’原则查询路由表。默认路由(0.0.0.0/0)是所有路由中优先级最低的兜底选项。】
2、主机的路由选择很简单:如果目的主机和源主机直接相连或在同一个共享网络上,那么就把数据报直接传给主机,否则传给默认路由器。
3、IP路由选择是根据逐跳来实现的,数据报在各站的传输过程中目的IP地址始终不变,但是封装的目的链路层地址在每一站都可以改变。
路由器转发例子

子网

子网划分

子网划分不是把IP地址看成由单纯的一个网络号和一个主机号组成,而是把主机号再分成一个子网号和一个主机号。对于B类网络地址,如果将其主机号中的前8bit用作子网号,剩下的8bit用作主机号,这样就允许有2的8次方减2即254个子网,每个子网可以有2的8次方减2即254台主机。

子网掩码

子网掩码是一个32bit的值,其中值为1的比特留给网络号和子网号,为0的比特留给主机号;IP地址一般以点分十进制表示,而子网掩码经常用十六进制表示,例如对于B类地址,子网掩码0xffffff00和0xffffffc0就代表不同的子网划分,
0xffffff00就是二进制的1111 1111 1111 1111 1111 1111 0000 0000 就是十进制的255.255.255.0,对于二进制来说,一般B类地址的前16位的子网掩码都是1,后16位都是0,代表前16位是网络号,后16位是主机号,现在后16位主机号分出前8bit置为1(即子网号);
0xffffffc0就是二进制的1111 1111 1111 1111 1111 1111 1100 0000 就是十进制的255.255.255.192(这个192可以按十六进制算,16进制的c就是十进制的12,即12*16=192;也可按二进制算,27+26=192),通过子网掩码1和0的分布,已知前16位是网络号,则后16位主机号的前10位用作子网号,后六位仍是主机号。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐