我们使用以太网进行数据传输(UDP、TCP),数据包的大小是有限制的,并不是多长都可以。
TCP/IP协议从下到上包含:链路层、IP层、传输层、应用层。
链路层:
链路层的数据交互是基于数据帧, 一帧数据包的最大长度1518(以太网帧最大长度)-18(以太网帧头帧尾) = 1500字节。
IP层:
由于链路层的数据帧最大为1500,所以该层的最大数据包长度为1500-20(IP包首部)=1480字节。
传输层:
如果禁止IP层进行数据分包传输:
对于TCP数据包最大长度1480-20(TCP包首部)=1460字节,大于该长度数据在经过IP层时就会进行分包。
对于UDP数据包最大长度1480-8(UDP包首部)=1472字节,大于该长度数据在经过IP层时就会进行分包,某一些路由器设置允许通过的最小以太网数据帧为576字节,如果考虑到这一限制,那么允许发送的最大UDP数据包长度为 576 - 20(IP包首部) - 18(UDP包首部) = 548字节。
如果允许IP层进行数据分包传输:
TCP 协议:基于流进行数据传输,数据包的长度不受限制。
UDP协议:UDP协议要求一帧数据包最大不能超过64K。
总结:一般来说,TCP协议是可靠的数据传输,自身会进行数据丢包重传,保证数据完整可靠的到达目的主机,但UDP协议是不可靠的数据传输方式,无法保证数据一定可以到达目的主机。所以一般在使用时需要自己添加应答重传机制,但是对于网络通讯质量很差的场合,如果发送的UDP数据包长度很大,那么在经过IP层时就会进行分包发送,在传输过程中任何一个子数据包的丢失,都会导致整个数据包在IP层被丢弃,从而导致传输失败,因此在这种情况下,最好的办法就是限制传输层发送的数据包大小,保证数据包在经过IP层时不会进行分包发送,然后我们自己在传输层上添加应答重传机制,并自己进行分包发送、组包接收。