UNIX网络编程——网络层:IP

一、IP数据报格式

       IP数据报格式如下:

                       

       版本:IP协议版本号,长度为4位,IPv4此字段值为4,IPv6此字段值为6


       首部长度:以32位的字为单位,该字段长度为4位,最小值为5,即不带任何选项的IP首部20个字节;最大值为15,所以首部长度最大为60个字节


       服务类型(TOS):长度为8位。此字段包含3位的优先权(现已忽略),4位的服务类型子字段和1位的保留位(必须置0)。4位的服务类型分别为最小延迟(D)、最大吞吐量(T)、最高可靠性(R)、最小费用(F),如下图。

                    


       总长度:该字段长度为16位,以字节为单位,该字段长度包含IP的头部和数据部分(payload)。IP数据报最大可达65535个字节。


       标识:16位标识,用来标识一个IP数据报,每发送一个此值会加1,可用于分片和重新组装成数据包。


       标志与片偏移:3位标志其中第一位不使用, 每二位DF(Don’t Fragment),该位如果为1,如果传输的数据报超过最大传输单元,该数据报会被丢弃,并发送一个ICMP差错报文。第三位MF(More Fragment)表示是否有更多的片,该位为1,说明后续有分片。最后一片MF为0。
       IP包分片后每一个数据报都具有自己的首部,但是片偏移值不同,通过片偏移值接收端可以重新组装IP包。


       TTL:TTL(Time To Live)表示数据报最多可经过的路由器的数量。数据报每经过一个路由器,TTL减1,减为0时丢弃,并发送ICMP报文通知源主机。TTL可以避免数据报在路由器之间不断循环。


       协议类型:表示IP层上承载的是哪个高级协议。在封装与分用的过程中,协议栈知道该交给哪个层的协议处理。1 ICMP 2 IGMP 6 TCP 17UDP


       头部校验和:保证数据报头部的数据完整性,但校验不包括数据部分。这样做的目的有二:一是所有将数据封装在IP数据包中的高层协议均含有覆盖整个数据的校验和,因此IP数据报没有必要再对其所承载的数据部分进行校验。二是每经过一个路由器,IP数据报的头部要发生改变(如TTL),而数据部分不变,这样只对发生改变的头部进行校验,显然不会浪费太多的时间。为了减少计算时间,一般不用CRC校验码,而是采用更简单的网际校验和(Internet Checksum)。


       源IP地址:发送数据的主机IP地址


       目的IP地址:接收数据的主机IP地址


选项与填充(选项为4字节整数倍,否则用0填充)
安全和处理限制
路径记录:记录所经历路由器的IP地址
时间戳:记录所经历路由器的IP地址和时间
宽松源站路由:指定数据报文必须经历的IP地址,可以经过没有指定的IP地址。
严格的源站路由:指定数据报文必须经历的IP地址,不能经过没有指定的IP地址。


二、IP地址与路由

       IPv4的IP地址长度为4字节,通常采用点分十进制表示法(dotted decimal representation)例如:0xc0a80002表示为192.168.0.2。Internet被各种路由器和网关设备分隔成很多网段,为了标识不同的网段,需要把32位的IP地址划分成网络号和主机号两部分网络号相同的各主机位于同一网段,相互间可以直接通信,网络号不同的主机之间通信则需要通过路由器转发。

       假设某主机上的网络接口配置和路由表如下:

                                                                           

       这台主机只有一个网络接口连到192.168.232.0/24网络。路由表的Destination是目的网络地址Genmask是子网掩码Gateway是下一跳地址Iface是发送接口Flags中的U标志表示此条目有效(可以禁用某些条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发,因此下一跳地址处记为*号。
       如果要发送的数据包的目的地址是192.168.232.1,跟第三行的子网掩码做与运算得到192.168.232.0,正是第三行的目的网络地址,因此从eth0接口发送出去,由于192.168.232.0/24正是与eth0接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发。
       如果要发送的数据包的目的地址是202.10.1.2,跟后两行路由表条目都不匹配,那么就要按缺省路由条目,从eth0接口发出去,首先发往192.168.232.2 路由器,再让路由器根据它的路由表决定下一跳地址。


       路由的处理过程如下,ARP部分可以参考这里


原文地址:https://www.cnblogs.com/hehehaha/p/6332617.html