IP包头长度(Header Length):这个字段的作用是为了描述IP包头的长度,因为在IP包头中有变长的可选部分。IP包头最小长度为20字节。
服务类型(Type of Service):最小延时、最大吞吐量、最高可靠性、最小费用等
IP包总长(Total Length):包括头部和数据,所以IP包最大长度65535字节。由于MTU的限制,最大不超过1500,如果超过就会被分片。
标识符(Identifier):唯一的标识主机发送的一个数据报。但是被分片的数据报每个分片的标识符是一样的
片偏移(Fragment Offset):表示该IP包在该组分片包中位置,接收端靠此来组装还原IP包,除了最后一个分片,其余分片的数据部分长度都要是8的整数倍。
生存时间(TTL):当IP包进行传送时,发送端先会对该字段赋予某个特定的值。
协议(Protocol):长度8比特。标识了上层所使用的协议。如TCP UDP 等协议
以下是比较常用的协议号:
1 ICMP
2 IGMP
17 UDP
起源和目标地址(Source and Destination Addresses):标识了这个IP包的起源和目标地址
至此,IP包头基本的20字节已介绍完毕,此后部分属于可选项,不是必须的部分。
路由记录(Record route):当IP包离开每个路由器的时候记录路由器的出站接口的IP地址。等
1、路由器从接收到的数据报中抽取目的IP地址D,并计算地址D的网络前缀N,如果在同一个网络中,直接交付
2、接着,路由器检查路由表,如果表中含有D的一个特定路由,则把数据报发送到表中指定的下一跳,然后退出。否则,转步骤3
3、路由器检查N是否与路由器的任何一个直接相连的网络地址匹配,如果是的话,则通过该网络把数据报交付给目的站D。否则,转步骤4
4、路由器检查路由表,看表中是否包含一个针对网络N的路由,如果有的话,则数据报发送到表中致命的下一跳。否则,转步骤5
5、路由器检查路由表,看表中是否包含一个默认的路由,如果有的话,则把数据报发送到表中指明的默认路由器。否则,转步骤6
6、路由器将发出一个转发错误
这里要注意,没经过一个路由器TTL要减1,如果为0,那么就将该报文丢弃。
IP分片:
IP分片是网络上传输IP报文的一种技术手段。IP协议在传输数据包时,将数据报文分为若干分片进行传输,并在目标系统中进行重组。
不同的链路类型规定有不同最大长度的链路层数据帧,称为链路层MTU(最大传输单元)。常见以太网的MTU为1500,若IP协议在传输数据包时,IP报文长度大于转发接口的MTU,则将数据报文分为若干分片进行传输,分片报文到达接收方时,由接收方完成重组。
对于不同的传输层协议,在IP层上,需不需要进行分片是不同的:
1:对于TCP来说,它是尽量避免分片的。因为当在IP层进行了分片后,如果其中的某片数据丢失,则需对整个数据报进行重传。因为IP层本身没有超时重传机制,当来自TCP报文段的某一片丢失后,TCP在超时后重发整个TCP报文段,该报文段对应于一份IP数据报,没有办法只重传数据报中的一个数据报片。而且如果对数据报分片的是中间路由器,而不是起始端系统,那么起始端系统就无法知道数据报是如何被分片的,因此基于这种原因,TCP是经常要避免分片的。
那么TCP层是如何避免IP层的分片呢?
首先,TCP在建立连接时会进行3次握手,而在这3次握手中,客户端和服务端通常会协商一个值,那就是MSS(最长报文大小),用来表示本段所能接收的最大长度的报文段。MSS=MTU-TCP首部大小-IP首部大小,MTU值通过查询链路层得知。
当两端确认好MSS后进行通信,TCP层往IP层传输数据时,如果TCP层缓冲区的大小大于MSS,那么TCP层都会将其中的数据分组进行传输,这样就避免了在IP层进行分片。
:2:对于UDP而言,由于UDP是不需要保证可靠性的,没有超时和重传机制,这使得UDP很容易导致IP分片。
那么数据报被分片后是怎样的呢,又是以何种算法进行分片呢?首先我们回忆IP首部:
对于每份IP数据报来说,其16位标识字段都包含一个唯一值。在数据报被分片时,这个值同时被复制到每个片中。
在IP首部中,我们看到有一个占了3位的标志字段,其中第1位作为保留字段;第2位分段用来表示一个数据报是否允许在IP层被分片;而第3位更多分片字段,则是当数据报被分片时,让接收端知道在什么时候完成所有的分片组装,除了最后一片外,其他每个组成数据报的片都要把该比特置1。
而如果将其中的分段标志比特位置1,表示不允许IP层对数据报进行分片。例如当路由器收到一份需要分片的数据报,而在IP首部又设置了不分片(DF)的标志比特,路由器会丢弃数据报并发送一个ICMP差错报文(“需要进行分片但设置了不分片比特”)。
IP首部中13位的偏移量字段表示IP分片在整个数据流中的位置,第一个数据报分片的偏移量置为0,而后续的分片偏移量则是根据网络的MTU大小设置,且必须为8的整数倍。
需要注意的是,任何传输层的首部只出现在第一片数据中,后续报文均不带传输层信息
链接:IP分片
重组超时:一个数据报的任何一个分片首先到达时,IP层就得启动一个计时器,否则,不能到达的分片可能会最终导致接收方的缓存用尽。
IP数据报中的一个标志:DF和MF
DF:拒绝进行分片,don't fragment
MF:多分片,more fragment,该标志除了最后一个分片没有吗,其他分片都有
IP分片的一些细节:
拿ICMP来说明问题: