IP协议首部结构:(每行总32位)
4位版本号 4位首部长度 8位服务类型 16位总长度
16标识 3标志 13片位移
8生存时间ttl 8协议类型(ICMP为1/TCP-6/UDP-17/...)16首部校验和
32源IP地址
32目的IP地址
IP首部
普通IP首部长为20个字节,最长60字节,除非含有选项字段,结构如下:
- 4位版本号(Version): 指定IP协议的版本号。因为目前仍主要使用IPV4版本,用于标识IP协议版本,IPv4是0100,IPv6是0110,也就是二进制的4和6。
- 4位首部长度(Internet Header Length): 用于标识首部的长度,单位为4字节(32bit),所以首部长度最大值为60字节,但一般只使用20字节的固定长度。
- 8位服务类型(Type Of Service): 简称TOS,定义IP封包在传送过程中要求的服务类型。包括一个3bit的优先权子字段,4bit的TOS子字段,1bit未用位但必须置0。4bit的TOS分别代表:最小时延、最大吞吐量、最高可靠性和最小费用,4bit中同时只能置其中1bit为1,。如果所有4bit均为0,那就意味着是一般服务。
- 16位总长度(Total Length): 标识IP数据报包的总长度,以字节为单位。利用首部长度字段和总长度字段,就可以知道IP数据报中数据内容的起始位置和长度。由于该字段长16bit,所以IP数据包最长可达2^16 -1 = 65535字节,当数据包被分片时,该字段的值也随着变化。
- 16位标识(Identification): 用于标识IP数据报的唯一码,如果因为数据链路层帧数据段长度限制(也就是MTU,支持的最大传输单元为1500字节),一个过长的IP数据包需要被拆散进行分片发送,拆分出的每个分片的IP数据包标识都是一致的,当分片要进行重组的时候就是依据了这个标识。
- 3位标识(Flag): 目前只有两种,即只有后2位有意义;最低位为MF(More Fragment),为1代表后面还有分片的数据包,MF=0代表当前数据包已是最后的数据包。第二位为DF(Don’t Fragment),DF=1代表不能分片,此时若这个包长度大于路由器的长度限制,则直接丢弃了,DF=0代表可以分片。
- 13位片偏移(Fragment Offset): 代表某个分片在原始IP数据包中的相对位置。通过这个偏移量和16位标识将多个分片数据包进行还原成原IP数据包。
- 8位生存时间(Time To Live): 简称TTL,表示数据包可以经过的最多路由器数。包在传输中每经过一个路由器TTL便减一,若TTL为0,则丢弃,一般不会经过255这么多,除非有循环路由。
- 8位协议(Protocol): 代表上层的传输协议类型,一般常见的1代表ICMP,6代表TCP,17代表UDP。
- 16位首部校验和(Header Checksum): 用于验证数据完整性,用以确保封包(分片)被正确无误的接收到,与UDP和TCP协议包头中的校验和作用是一样的。首先通过校验算法填入16位的值,当目标机器收到后重新进行校验算法并进行比对,若相同代表没有出现问题。
- 16位源IP地址与16为目标IP地址。
2.1 相关问题
1. 为什么IP不是可靠连接的协议?
IP层没有连接握手协议,没有超时和重传机制。IP协议只是为路由器指明一条数据传输的方向和路线,但它只指明发送者和接受者地址,并不维护任何关于后续数据报的状态信息,不保证数据包一定能到达,以及数据是否会被丢弃以及丢弃之后如何处理。
2. IP数据报经过路由器都做了哪些改动?
IP每经过一个路由器,TTL数就会减一,如果最后TTL为0了,但是依然没有到达目的地,这个IP包将会被丢弃。
这样做了目的是为了防止出现循环回路。并且最后一跳的路由器会发送一个ICMP不可达的数据包给源IP。
3. IP包分片
IP数据包的长度为16,也就是说最大为65535个字节。但是据链路层规定MTU(Maxitum Transmission)最大传输单元为1500个字节。
当IP数据包的大小超过了1500,IP数据包必须要进行分片处理。这还只是初始发送端的分片,在网络中如果某个路由器的MTU小于1500,那么还需要在路由器端做分片,这就给IP包的完整接收照成了很大的不确定性(我们知道数据包达到终点不一定是按照顺序的),因为万一某一个分片丢失,可能会造成IP重传,当然前提是高层协议支持重传(比如TCP支持重传,UDP不支持)。
对于TCP协议,不存在分片的问题,因为TCP报头的选项字段有MSS(Maximum Segment Size,最大报文段大小)字段,规定一个TCP包最大可传输的字节数,一般是1500-20-20=1460字节。也就是说到达IP封包的时候最大可承载数据只有1460个字节,这样就可以避免分片的问题。但是对于UDP这一类的协议,分片操作还是交给IP完成,虽然这样可以增加载荷的效率,但是稳定性会受到很大的影响。
参考链接:http://t.csdnimg.cn/5JKwY , http://t.csdnimg.cn/wNJ47