套接字缓冲区大小及限制
Pv4数据报的最大值是65535字节,包括IPv4首部。
IPv6数据报的最大值是65575字节,包括40字节的首部。
MTU:IP数据报的最大传输单元,以太网的MTU是1500字节。
IPv4要求的最小链路MTU是68字节。
IPv6要求的最小链路MTU是1280字节。
如果一个IPv6的数据报的值小于要求的最小值1280字节,那么就需要进行重组和分片,以使得这些链路看起来具有至少为1280字节的MTU。
在两个主机之间的路径中最小的MTU称为路径MTU。1500字节的以太网MTU是当今常见的路径MTU。
如果数据报的大小超过了相应链路的MTU,IPv4和IPv6都将进行分片,这些分片在到达目的主机之前通常不会被重组。
IPv4主机对其产生的数据报进行分片,IPv4路由器对其转发的数据报执行分片,但是IPv6只有主机对其产生的数据报执行分片,IPv6路由器不对其转发的数据报执行分片。
IPv4的首部的"不分片“位(即DF位)若被设置,那么不管是发送这些数据报的主机,还是转发这些数据报的路由器,都不允许对它们进行分片,当IPv4路由器接收到一个超过其外出链路MTU大小且设置了DF位的IPv4数据报时,它将产生一个ICMPV4"destination unreachable,fragmentation needed but DF bit set"(目的地不可达,需分片但DF位已设置)出错消息,当IPv6路由器接收到一个超过其外出链路MTU大小的IPv6数据报时,它将产生一个ICMPv6"packet too big"(分组太大)出错消息。
IPv4的DF位可用于路径MTU发现,如果一个TCP是基于IPv4的,那么它将在所发送的所有数据报中设置DF位。如果某个中间路由器返回一个ICMPV4"destination unreachable,fragmentation needed but DF bit DF bit set错误,那么TCP就减少每个数据报的数据量并重传。
TCP有一个MSS(maximum segment size,最大分节大小),用于向对端TCP通告对端在每个分节中能发送的最大TCP数据量。MSS的目的是告诉对端其重组缓冲区大小的实际值,从而试图避免分片。MSS经常设置成MTU减去IP和TCP首部的固定长度。在以太网中使用IPv4的MSS值为1460,使用IPv6的MSS值为1440。
TCP输出
每一个TCP套接字有一个发送缓冲区,当某个进程调用write时,内核从该应用进程的缓冲区中复制所有数据到所写套接字的发送缓冲区。如果该套接字的发送缓冲区容不下该应用进程的所有数据,该应用进程将被投入睡眠,这里假设该套接字是阻塞的,它是通常的默认设置,内核将不从write系统调用返回,直到应用进程缓冲区中的所有数据都复制到套接字发送缓冲区。因此,从写一个TCP套接字的write调用成功返回仅仅表示我们可以重新使用原来的应用进程缓冲区,并不表明对端的TCP或应用进程已接收到数据,对端TCP必须确认收到的数据,伴随来自对端的ACK的不断到达,本端TCP至此才能从套接字发送缓冲区中丢弃已确认的数据。TCP必须为已发送的数据保留一个副本,直到它被对端确认为止。