数据包分片概念
在TCP/UDP分层中,数据链路层用MTU(Maximum Transmission Unit,最大传输单元)来限制所能传输的数据包大小,MTU是指一次传送的数据最大长度,不包括数据链路层数据帧的帧头。以太网缺省MTU=1500字节,这是以太网接口对IP层的约束,如果IP层有<=1500字节需要发送,只需要一个IP包就可以完成发送任务;如果IP层有>1500字节数据需要发送,IP层就需要对数据进行分片,否则数据将无法发送成功。IP层是没有超时重传机制的,如果IP层对一个数据包进行了分片,只要有一个分片丢失了,只能依赖于传输层进行重传,所有的分片都要重传一遍。IP分片会大大降低传输层传送数据的成功率,所以我们要避免IP分片。
网络层并不会在每个分片里复制一次UDP头,它是把完整的UDP包切开,加上IP头发送出去,除了第一个分片有UDP头,后面的分片都不包含UDP头。也就是说多个分片包只有第一个是有UDP头的,它可以根据UDP头里的端口号通知相应的应用取走,但是后面的分片包由于没有UDP头,传输层无法把分片包交给正确的应用程序。所以UDP分片包必须在网络层重组成一个完整的UDP包,交给传输层处理。如果某些分片包没有被目的主机网络层接收到,就有可能会造成整个数据包被丢弃的情况。
分片包如何过安全组
对于天翼云产品来说,由于目前尚未支持TCP/UDP分片大包过安全组时支持指定端口,当您发送通道信令给设备,设备推送通道报文时,如果报文较大,网络层将大于1500kb的UDP报文格式转换为ipv4格式,会由于安全策略过滤问题,直接丢弃了这部分内容,导致信令服务获取不到。因此在配置安全组规则时,您需要将端口范围指定为1-65535,不进行指定端口过滤。