这是知乎上被邀请的一个问题TCP/IP协议栈中,为何选择IP层负责分片?,我从没思考过这个问题甚至不认为这是个有意义的问题,可是当我研究思考后却发现这么一个小问题也许正是当初设计TCP/IP协议栈时的一种考量。编程
TCP/IP是一个分层协议,协议栈的最底层是链路层,接下来依次是网络层,传输层,应用层。网络
能够看见tcp
连接层负责创建电路链接,是整个网络的物理基础;ide
网络层负责分配地址和传送二进制数据,主要协议是IP协议;计算机网络
......设计
再来看看几个概念blog
PDU:计算机网络各层对等实体间交换的单位信息称为协议数据单元(protocol data unit,PDU),好比分节(segment)是对应于TCP传输层的PDU,IP数据报(IP datagram)对应网络层实体间交换的PDU;接口
SDU:按照协议与服务之间的关系,除了最低层(物理层)外,每层的PDU经过由紧邻下层提供给本层的服务接口,做为下层的服务数据单元(service data unit,SDU)传递给下层,并由下层间接完成本层的PDU交换。若是本层的PDU大小超过紧邻下层的最大SDU限制,那么本层还要事先把PDU划分为若干个合适的片断让下层分开载送,再在相反方向把这些片断重组为PDU。get
帧:链路层实体间交换的PDU称为帧,其长度取决于具体的接口;网络编程
MTU:咱们进行分片的依据是MTU,而MTU是网络层和链路层之间的接口属性;
咱们能够很清楚的看到若是要在最低层的数据链路层作分片,你必需要去对不一样的物理网络的驱动程序作更改; 若是要在上层的传输层或者应用层作分片,既然数据都要经过网络层实际上就是各协议对分片功能的重复造轮子,咱们有必要付出这种成本去实现分片吗?我想IP层就是咱们在软件设计里经常使用的适配层,着这里作分片是成本最低的选择。
参考书籍《UNIX网络编程卷1》