一个IP数据报有首部和数据两部分组成。首部的前一部分是固定长度20字节,是所有IP数据报必须有的,在首部的固定部分的后面是一些可选字段,其长度是可变的。
- 1). 版本(Version)
占4位,IPv4或IPv6 - 2). 首部长度(Header Length)
占4位,可表示的最大十进制数值是15。请注意,首部长度字段所表示的数的单位是32位,即4个字节。因为首部的最小长度是20字节,所以首部长度的十进制数最小是5。最大为15,即60字节。首部长度限制为60字节的缺点是有时不够用,但这样做是希望用户尽量减少开销,最常用的长度就是20字节,这时不使用任何选项。 - 3). 区分服务(Differentiated Services)
占8位,用来获得更好的服务。也叫服务类型。 - 4). 总长度(Total Length)
占16位,单位为字节,总长度指首部和数据之和的长度,因此数据报的最大长度为2的16次方减1等于65535字节,而实际上显示中这样长的数据报在现实中是很少遇到的。不能超过数据链路层中帧格式中定义的最大传送单元(maximum trasfer unit,MTU),通常为1500字节,当大于这个数时,就需要进行分包传输,注意:在进行分片时,总长度字段表示分片后的每一个分片的首部长度与该分片的数据长度之和。 - 5). 标识(Identification)
占16位,存储器中维护了一个计数器,每产生一个数据报时,计数器的值加1,并将此值赋值给标识字段,这个标识并不是序号,因为IP是无连接服务,数据报不存在按序接受问题。当数据报长度超过MTU时,会进行分片,这时这个标识字段的值就会被复制到所有的数据报分片的标识字段中。相同的表示字段值使得被分片后的数据报最后能正确的封装成原来的数据报。 - 6). 标志(Flags)
占3位,最高位保留未使用。从高位到低位分别为:Don't fragment(为1时不能分片,为0时可以分片)、More fragment(为1时表示后面还有分片,为0时表示这已是若干分片中的最后一个)。 - 7). 片偏移
占13位,片偏移指出,较长的分组在分片后,某分片在原分组中的相对位置。也就是说,相对于用户数据字段的起点,该分片从何处开始。片偏移以8个字节为偏移单位,这就是说,每个分片的长度一定是8字节的整数倍。 - 8). 生存时间(Time to live,TTL)
占8位,表示数据报在网络中能够经过多少个路由器,每经过一个路由器值就被减1,由发出数据报的源点设置这个值,防止无法交互的数据报无限制地在英特网中兜圈子。如果把ttl的值设置为1,表示只能在局域网中传输。 - 9). 协议占8位,指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分交由哪个处理过程。常用的协议字段值如下
协议名 | ICMP | IGMP | IP | TCP | EGP | IGP | UDP | IPv6 | ESP | OSPF |
---|---|---|---|---|---|---|---|---|---|---|
字段值 | 1 | 2 | 4 | 6 | 8 | 9 | 17 | 41 | 50 | 89 |
- 10). 首部检验和(Header checksum)
占16位,这个字段只检验数据报的首部,但不包括数据部分。这是因为数据报没经过一个路由器,路由器都要计算一下首部校验和,一些字段,比如生存周期、标志、片偏移等都可能发生变化。不检验数据部分可以减少计算的工作量。 - 11). 源地址(Source)
占32位 - 12). 目的地址(Destination)
占32位
问:IP数据包经由路由转发的时候源IP,目的IP是否改变?
- 当路由器转发没有NAT(网络地址转换)时,源IP,目的IP是始终没有变化的。
- 当路由器通过NAT转发的内网IP数据报时,从路由器发到英特网的数据报源IP地址为路由器的公网IP地址。