ningwentao 2011-04-20
IP数据包的最大长度是64K字节(65535),因为在IP包头中用2个字节描述报文长度,2个字节所能表达的最大数字就是65535。
由于IP协议提供为上层协议分割和重组报文的功能,因此传输层协议的数据包长度原则上来说没有限制。实际上限制还是有的,因为IP包的标识字段终究不可能无限长,按照IPv4,好像上限应该是4G(64K*64K)。依靠这种机制,TCP包头中就没有“包长度”字段,而完全依靠IP层去处理分帧。这就是为什么TCP常常被称作一种“流协议”的原因,开发者在使用TCP服务的时候,不必去关心数据包的大小,只需讲SOCKET看作一条数据流的入口,往里面放数据就是了,TCP协议本身会进行拥塞/流量控制。
UDP则与TCP不同,UDP包头内有总长度字段,同样为两个字节,因此UDP数据包的总长度被限制为65535,这样恰好可以放进一个IP包内,使得UDP/IP协议栈的实现非常简单和高效。65535再减去UDP头本身所占据的8个字节,UDP服务中的最大有效载荷长度仅为65527。这个值也就是你在调用getsockopt()时指定SO_MAX_MSG_SIZE所得到返回值,任何使用SOCK_DGRAM属性的socket,一次send的数据都不能超过这个值,否则必然得到一个错误。
那么,IP包提交给下层协议时将会得到怎样的处理呢?这就取决于数据链路层协议了,一般的数据链路层协议都会负责将IP包分割成更小的帧,然后在目的端重组它。在EtherNet上,数据链路帧的大小如以上几位大侠所言。而如果是IPoverATM,则IP包将被切分成一个一个的ATMCell,大小为53字节。