我们知道链路层通常对可传输的每个帧的最大长度有一个上限。为了保持IP数据报抽象与链路层细节的一致和分离,IP引入了分片与重组。
当IP层接受到一个要发送的IP数据报时,它会判断该数据报应该从哪个本地接口发送(通过查找转发表),以及要求的MTU是多少。IP层比较外出接口的MTU和数据的大小,如果数据报太大则进行分片。
IPv4中的分片可以在原始发送方主机和端到端路径上的任何中间路由器上进行。当一个IP数据报被分片了,直到它到达最终目的地才会被重组。原因有以下两点,其中第二点是主要原因:
使用UDP的应用程序如果想要避开IP层分片,可能就需要考虑它生成的结果IP数据报的大小了。
如果结果数据报的大小超过链路的MTU,那么IP数据报就要被分割成多个IP分组,这有可能导致性能问题,因为如果一个数据报丢失了,整个数据报就丢失了。原因是我们知道IP自身没有差错纠正机制。像超时和重传这些机制是更高层的责任。(TCP有超时和重传操作,UDP则没有。一些基于UDP的应用程序会自己实现超时和重传,但这是在UDP之上的某层进行的)当TCP报文段的一个分片丢失了,TCP会重传整个TCP报文段,这涉及整个IP数据报。只重发数据报的一个分片是不可能的。因此通常是要避免分片。
使用UDP是比较容易产生IP分片的(TCP不同,TCP会尽量避免分片,一个应用程序强迫TCP发送比要求的分片要大的多的报文段几乎是不可能的)。在以太网里,一帧的数据最大一般是1500字节,若IPv4头部是20字节,UDP头部是8字节,这就使得若要避免分片,应用程序最大为1472字节。