unix网络编程 附录A IPv4、IPv6、ICMPv4、ICMPv6

IPv4首部

unix网络编程 附录A IPv4、IPv6、ICMPv4、ICMPv6_第1张图片

4位版本(version)

  • 字段值为4

首部长度(header length)

  • 字段是包括任何选项在内的整个IP首部的32为字长度
  • 这个4位字段的最大值是15,因而IP首部的最大长度是60个字节;扣除首部所占的20个字节外,它最多允许40个字节的选项

历史性的8位服务(Type-OF-Service,TOS)

  • 已被分为两个字段
  • 6位区分服务码点(Differentiated Services Code Point, DSCP)
  • 2位显示拥塞通知(Explicit Congestion Notification, ECN)
  • 可以使用IP_TOS设置该字段

16位总长度

  • 是包括IPv4首部在内的整个IP数据包的字节长度
  • 数据报中的数据量就是本字段减掉4乘以首部长度;注:首部长度都是32位,或4字节的整数倍
  • 本字段是必须的,因为有些数据链路要求把帧垫补成某个最小长度,因而有效数据报的大小有可能小于数据链路的最小长度

16位标识(identification)

  • 由IP模块为每个IP数据报设置成不同的值,用于分片重组
  • 该字段必须就源IPv4地址目的IPv4地址协议这三个字段,至少在数据报的网络存活期唯一标识每个IP数据报
  • 如果分组不会被分片(但设置了DF位),那么就不需要设置此字段

16位

  • DF(标识don’t fragment,不要分片)位;MF(表示more fragment,还有片段)位;13位片段偏移,(fragment offest)字段也用于分片和重组
  • DF还用于路径MTU(最大传输单元)发现

8位存活时间(Time-To-Time,TTL)

  • 有本IP数据报发送者设置,并由转发它的路由器递减(减去一)
  • 当该字段为0时,相应路由器就抛弃该数据报
  • 任何IP数据报的生命期限最多为255(二进制全1)
  • 本字段常用默认值64,可以使用套接字选项IP_TTLIP_MULTICAST_TTL查询和修改这个值

8位协议(protocol)

  • 指定包含在本IP数据报中的数据类型
  • 典型类型:
    • 1 ——> ICMPv4
    • 2 ——> IGMPv4
    • 6 ——> TCP
    • 17 ——> UDP
    • ICMP(Internet Control Message Protocol)Internet控制报文协议
    • Internet 组管理协议称为IGMP协议(Internet Group Management Protocol)

16位首部检验和(header checksum)

  • 只对IP首部进行计算,其算法是标准的网际网校验和算法,即简单的16位反码加法

IPv6首部

unix网络编程 附录A IPv4、IPv6、ICMPv4、ICMPv6_第2张图片

4位版本(version)

  • 字段值为6

历史性的8位流通类别(traffic class)

  • 已被分为两个字段
  • 6位区分服务码点(Differentiated Services Code Point, DSCP)
  • 2位显示拥塞通知(Explicit Congestion Notification, ECN)
  • 可以使用IPv6_TCLASS设置该字段

20位流标签(flow label)

  • 可以由应用程序进程内核为某个给定的套接字选取,应用于通过该套接字发送的任何IPv6数据报
  • 所谓的(flow)是指从某个特定源头到某个特定目的地的一个分组序列,而且该源头期望中间路由器对这些分组进行特殊处理
  • 对于一个给定的流,其流标签一经源头选定就不可以再改变,也就是说中间路由器不能像对待DSCP和ECN字段那样设置本字段
  • 值为0(默认设置)的流标签标识不属于任何一个流的分组
  • 流标签的访问接口尚未完全定义,sockaddr_in6套接字地址结构的sin6_flowinfo成员原初时为留待它用所保留的。有些系统直接将sin6_flowinfo的底28位复制到IPv6的分组首部中,用来覆盖DSCP和ECN字段

16位净荷长度(payload length)

  • 是40字节IPv6首部之后的所有内容的字节长度
  • 本字段的大小不包含IPv6的首部大小
  • 本字段值位0代表实际的长度超过16位字段的表示范围,可见不存在只含有IPv6首部的IPv6数据报,于是存放在一个特大的净荷选项中

8位的下一个首部(next header)

  • 类似于IPv4的协议字段,事实上,如果上层协议基本上无变化,IPv6和IPv4这两个字段就可以使用相同的值
  • 一个IPv6数据报可以在其40个字节的IPv6首部之后可以跟多个首部,所以称此字段为"下一个首部"而不是"协议"

8位跳限(hop limit)

  • 类似于IPv4的TTL字段
  • 可以使用套接字选项IPv6_UNICAST_HOPSIPv6_MULTICAST_HOPS设置与获取本字段的默认值,可以使用IPv6_HOPLIMIT套接字选项设置与获取本字敦的当前值,并使用IPV6_RECVHOPLIMIT套接字选项获取接收数据报的本字段值
    -注:在IPv4早期规范中,要求路由器把所转发的IPv4分组的TTL字段的值减去1,或者减去路由器存储该分组的秒数,具体取决于那个值比较大。然而在IPv6中,要求总是减去1,因而换了个不同的方法

IPv6特点

  • IPv6没有首部长度字段,所以IPv6首部没有选项长度。不过IPv6首部之后可以跟任意种类和数目的扩展首部
  • 如果首部本身64位对齐,则IPv6地址字段也在64位边界对齐。这样可以加快在64位机器上的处理,而IPv4在64位下,却只能是32位对齐的
  • IPv6首部没有用于分片的字段,因为IPv6另有一个独立的分片首部用于达成该目的。做出如此决策是因为分片属于异常情况
  • IPv6首部没有其自身的校验和字段。是因为上层协议数据单元都有各自的=校验和字段=,校验范围其中包括上层协议首部、上层协议数据、IPv6首部的如下字段:IPv6源地址、IPv6目的地址、净荷长度、下一跳首部。
    -IPv6没有广播;对于IPv4是可选的多播,对于IPv6只是一个组成部分。向子网中的所有系统发送数据是由全节点多播组处理的
  • IPv6路由器不对所转发的分组执行分片。如果不经分片就无法转发某个分组,路由器就丢弃该分组,同时向其源头发送一个ICMPv6错误;也就是说IPv6的分片,只发生在IPv6数据报的源头主机上。
  • IPv6需要支持路径MTU发现功能。如果某个节点没有实现这个功能,它就不能发送超过IPv6最小链路MTU==(1280字节==)
  • IPv6要求支持认证和安全协议。这些选项出现在固定首部之后

IPv4

IPv4地址&子网地址&IPv6地址

详见:

  • 链接:https://blog.csdn.net/h_s312/article/details/90270095

环回地址

  • 按照约定,地址127.0.0.1赋予环回地址。任何发送到这个IP的分组,子啊内部被环送回来作为IP模块的输入。该地址通常为人所知的名字是INADDR_LOOPBACK
  • 网络中,127.0.0.0/8上任何地址都可以作为环回接口

未指明地址

  • 所有32位均为0的地址是IPv4的未指明地址(unspecified address)
  • 这个IP地址只能作为源地址出现在IPv4的分组上,并且是在其发送主机处于获悉自身IP地址之前的,自举引导过程期间
  • 在套接字API中,称之为通配地址,也是INADDR_ANY
  • 在套接字中绑定该地址,意味这会接收目的地址为任何节点的IPv4地址的客户连接

多宿与地址别名

  • 多宿主机(multihomed host)的传统定义是具有多个接口的主机。计算一个主机的接口数是否超过一个,以确定它是否为多宿,环回接口不在计数之内
  • 路由器按定义是多宿的,因为它把某个接口的分组转发到另一个接口;而多宿主机不一定是路由器,除非它转发分组

一般化定义

  • 拥有多个接口的主机是多宿的,每个接口都必须有各自的IP地址,不过未指定网络地址的接口允许出现在点到点的链路上——传统定义
  • 较新的主机具备把多个IP地址赋予单个给定物理接口的能力。除第一个IP地址即主地址外的每个额外IP地址,称为该接口的一个别名地址,或逻辑接口地址。通常别名地址和主机地址共享同一个子网地址,只是主句ID不同

IPv6

全球单播地址

  • 当前全球单播地址空间的分配是以001打头的地址范围
  • 全球单播地址是可汇聚的,从左到右,如图:
    unix网络编程 附录A IPv4、IPv6、ICMPv4、ICMPv6_第3张图片
  • 全球路由前缀是赋予某个网点的网络标识(通常具有层次结构)
  • 子网ID是该网点内某个链路的标识
  • 接口ID是该链路上某个接口的标识
  • 以001打头地址范围之外的全球单播地址,都有一个64位的接口ID字段

IPv4映射的IPv6地址

  • 可以在向IPv6地址过渡时期,让允许在同时支持IPv4和IPv6的主机上的IPv6应用进程与只支持IPv4的主机通信
  • 这些地址,是在IPv6应用进程查询某个只有IPv4地址的主机的IPv6地址时,由DNS解析器自动创建的
    unix网络编程 附录A IPv4、IPv6、ICMPv4、ICMPv6_第4张图片

IPv4兼容的IPv6地址

  • 用在向IPv6过渡时期
  • 如果一个同时支持IPv4和IPv6的主机,没有邻居的IPv6路由器,那么它的系统管理员应该先创建一个含有IPv4兼容的IPv6地址的DNS AAAA记录
  • 向这个兼容的地址发送IPv6数据报的其他IPv6主机,需要先将这些IPv6地址封装成一个IPv4首部再发送;这种方法称之为自动隧道(automatic tunnel)
    image
  • 注意:当使用SIIT IPv4/IPv6过度机制时,IPv4的兼容的IPv6地址也可以作为,非隧道IPv6分组的源地址或目的地址

环回地址

  • 127个值为0位后跟单个值为1位构成的IPv6地址,是IPv6的环回地址
  • 再套接字API中,为in6addr_loopbackIN6ADDR_LOOPBACK_INT

未指明地址

  • 所有128位值均为0的IPv6地址
  • 这个地址再IPv6中只能作为源地址出现,并且是在其发送主机处于获悉自身IP地址之前的,自举引导过程期间
  • 再套接字API中称为通配地址,为in6addr_anyIN6ADDR_ANY_INIT
  • 通过绑定该地址的套接字发送IPv6分组时,内核会选择一个本地地址作为源地址,除非尚未分配任何本地地址(这种情况下,就以未指明地址为源地址)

链路局部地址

  • 该地址用在链路局部上,并且是在已知数据报不会被转发的情况下
  • 这种地址的使用例子包括自举引导的自动地址配置和以后的邻居发现
    image
  • 这些地址总是以Oxfe80开头
  • IPv6路由器绝不能把源地址或目的地址为链路局部地址的数据报,转达到其他链路

ICMPv4和ICMPv6网际网控制消息协议

  • ICMP是任何IPV4或IPv6实现都必须的有机组成部分
  • 常用于再IP节点(路由器和主机)之间互通出错消息消息性消息,不过应用程序偶尔也会使用题目获取信息型消息或出错消息。例如ping和traceroute
  • 如图ICMPv4和ICMPv6的前32位都是相同
    unix网络编程 附录A IPv4、IPv6、ICMPv4、ICMPv6_第5张图片
  • 8位类型(type)字段是ICMPv4或ICMPv6消息的类型
  • 有些类型有8位代码(code)字段,提供额外的信息
  • 检验和(checksum)字段,是标准的网际网检验和
  • ICMPv4的检验和仅仅检验ICMP消息本身,ICMPv6检验和的检验范围还包括IPv6的伪首部

ICMP消息

IPv4

unix网络编程 附录A IPv4、IPv6、ICMPv4、ICMPv6_第6张图片
unix网络编程 附录A IPv4、IPv6、ICMPv4、ICMPv6_第7张图片
image
image

IPv6

unix网络编程 附录A IPv4、IPv6、ICMPv4、ICMPv6_第8张图片
unix网络编程 附录A IPv4、IPv6、ICMPv4、ICMPv6_第9张图片
image

  • 其中端口不可达(对于ICMPv4中类型是3,代码是3;再ICMPv6中,类型是1,代码是4)仅用于自身无法通告对端某个端口上无进程在监听的传输协议。TCP为此发送RST分节,因而不需要这个ICMP出错消息
  • ICMPv6为出错消息(类型14)清楚类型字段的高序位,并为==信息性消息==(类型128137)设置该位

你可能感兴趣的:(Unix网络编程)