本文介绍一些影响IP数据报大小的限制,我们先介绍这些限制,然后就他们如何影响应用进程传递的数据综合分析
- IPv4 数据报最大大小是65535(16位),包括IPv4头部。
- IPv6 数据报最大大小是65575,包括40个字节的IPv4头部
- MTU, 这是由硬件规定的,如以太网的MTU是1500字节,IPv4要求最小MTU是68字节,IPv6要求最小MTU是576字节
- path MTU: 指两台主机间的路径上最小MTU
- 分片(fragmentation): 指ip数据报大小超过相应链路的MTU,IPv4和IPv6都将对ip数据进行分片,到达目的主机后进行重组。
- IPv4头部的DF位用于设置分片还是不分片
- MSS:最大分节大小,向对方TCP通告被通告方在每个分节中能发送的最大TCP数据量。MSS的目的是告诉对方其重组缓冲区大小的实际值,从而避免分片。
TCP与UDP的输出
每个TCP套接口有一个发送缓冲区,可以用SO_SNDBUF套接口选项来改变这一缓冲区的大小。当应用进程调用write往套接口写数据时,内核从应用进程缓冲区中拷贝所有数据到套接口的发送缓冲区,如果套接口发送缓冲区容不下应用程序的所有数据,或者是应用进程的缓冲区大于套接口的发送缓冲区,或者是套接口的发送缓冲区中有别的数据,应用进程将被挂起。内核将不从write返回。直到应用进程缓冲区中的所有数据都拷贝到套接口发送缓冲区。所以,从写一个TCP套接口的write调用成功返回仅仅表示我们可以重新使用应用进程缓冲区,它并不是告诉我们对方收到数据。
TCP发给对方的数据,对方在收到数据时必须给矛确认,只有在收到对方的确认时,本方TCP才会把TCP发送缓冲区中的数据删除。
UDP因为是不可靠连接,不必保存应用进程的数据拷贝,应用进程中的数据在沿协议栈向下传递时,以某种形式拷贝到内核缓冲区,当数据链路层把数据传出后就把内核缓冲区中数据拷贝删除。因此它不需要一个发送缓冲区。
写UDP套接口的write返回表示应用程序的数据或数据分片已经进入链路层的输出队列,如果输出队列没有足够的空间存放数据,将返回错误ENOBUFS.