|
|
|
|
|
|
|
|
Network Working Group J. Postel |
|
|
Request for Comments: 879 ISI |
|
|
November 1983 |
|
|
|
|
|
|
|
|
|
|
|
The TCP Maximum Segment Size |
|
|
and Related Topics |
|
|
|
|
|
This memo discusses the TCP Maximum Segment Size Option and related |
|
|
topics. The purposes is to clarify some aspects of TCP and its |
|
|
interaction with IP. This memo is a clarification to the TCP |
|
|
specification, and contains information that may be considered as |
|
|
"advice to implementers". |
|
|
|
|
|
1. Introduction |
|
|
|
|
|
This memo discusses the TCP Maximum Segment Size and its relation to |
|
|
the IP Maximum Datagram Size. TCP is specified in reference [1]. IP |
|
|
is specified in references [2,3]. |
|
|
|
|
|
This discussion is necessary because the current specification of |
|
|
this TCP option is ambiguous. |
|
|
|
|
|
Much of the difficulty with understanding these sizes and their |
|
|
relationship has been due to the variable size of the IP and TCP |
|
|
headers. |
|
|
|
|
|
There have been some assumptions made about using other than the |
|
|
default size for datagrams with some unfortunate results. |
|
|
|
|
|
HOSTS MUST NOT SEND DATAGRAMS LARGER THAN 576 OCTETS UNLESS THEY |
|
|
HAVE SPECIFIC KNOWLEDGE THAT THE DESTINATION HOST IS PREPARED TO |
|
|
ACCEPT LARGER DATAGRAMS. |
|
|
|
|
|
This is a long established rule. |
|
|
|
|
|
To resolve the ambiguity in the TCP Maximum Segment Size option |
|
|
definition the following rule is established: |
|
|
|
|
|
THE TCP MAXIMUM SEGMENT SIZE IS THE IP MAXIMUM DATAGRAM SIZE MINUS |
|
|
FORTY. |
|
|
|
|
|
The default IP Maximum Datagram Size is 576. |
|
|
The default TCP Maximum Segment Size is 536. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Postel [Page 1] |
|
|
|
|
|
|
|
|
|
|
|
RFC 879 November 1983 |
|
|
TCP Maximum Segment Size |
|
|
|
|
|
|
|
|
2. The IP Maximum Datagram Size |
|
|
|
|
|
Hosts are not required to reassemble infinitely large IP datagrams. |
|
|
The maximum size datagram that all hosts are required to accept or |
|
|
reassemble from fragments is 576 octets. The maximum size reassembly |
|
|
buffer every host must have is 576 octets. Hosts are allowed to |
|
|
accept larger datagrams and assemble fragments into larger datagrams, |
|
|
hosts may have buffers as large as they please. |
|
|
|
|
|
Hosts must not send datagrams larger than 576 octets unless they have |
|
|
specific knowledge that the destination host is prepared to accept |
|
|
larger datagrams. |
|
|
|
|
|
3. The TCP Maximum Segment Size Option |
|
|
|
|
|
TCP provides an option that may be used at the time a connection is |
|
|
established (only) to indicate the maximum size TCP segment that can |
|
|
be accepted on that connection. This Maximum Segment Size (MSS) |
|
|
announcement (often mistakenly called a negotiation) is sent from the |
|
|
data receiver to the data sender and says "I can accept TCP segments |
|
|
up to size X". The size (X) may be larger or smaller than the |
|
|
default. The MSS can be used completely independently in each |
|
|
direction of data flow. The result may be quite different maximum |
|
|
sizes in the two directions. |
|
|
|
|
|
The MSS counts only data octets in the segment, it does not count the |
|
|
TCP header or the IP header. |
|
|
|
|
|
A footnote: The MSS value counts only data octets, thus it does not |
|
|
count the TCP SYN and FIN control bits even though SYN and FIN do |
|
|
consume TCP sequence numbers. |
|
|
|
|
|
4. The Relationship of TCP Segments and IP Datagrams |
|
|
|
|
|
TCP segment are transmitted as the data in IP datagrams. The |
|
|
correspondence between TCP segments and IP datagrams must be one to |
|
|
one. This is because TCP expects to find exactly one complete TCP |
|
|
segment in each block of data turned over to it by IP, and IP must |
|
|
turn over a block of data for each datagram received (or completely |
|
|
reassembled). |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Postel [Page 2] |
|
|
|
|
|
|
|
|
|
|
|
RFC 879 November 1983 |
|
|
TCP Maximum Segment Size |
|
|
|
|
|
|
|
|
5. Layering and Modularity |
|
|
|
|
|
TCP is an end to end reliable data stream protocol with error |
|
|
control, flow control, etc. TCP remembers many things about the |
|
|
state of a connection. |
|
|
|
|
|
IP is a one shot datagram protocol. IP has no memory of the |
|
|
datagrams transmitted. It is not appropriate for IP to keep any |
|
|
information about the maximum datagram size a particular destination |
|
|
host might be capable of accepting. |
|
|
|
|
|
TCP and IP are distinct layers in the protocol architecture, and are |
|
|
often implemented in distinct program modules. |
|
|
|
|
|
Some people seem to think that there must be no communication between |
|
|
protocol layers or program modules. There must be communication |
|
|
between layers and modules, but it should be carefully specified and |
|
|
controlled. One problem in understanding the correct view of |
|
|
communication between protocol layers or program modules in general, |
|
|
or between TCP and IP in particular is that the documents on |
|
|
protocols are not very clear about it. This is often because the |
|
|
documents are about the protocol exchanges between machines, not the |
|
|
program architecture within a machine, and the desire to allow many |
|
|
program architectures with different organization of tasks into |
|
|
modules. |
|
|
|
|
|
6. IP Information Requirements |
|
|
|
|
|
There is no general requirement that IP keep information on a per |
|
|
host basis. |
|
|
|
|
|
IP must make a decision about which directly attached network address |
|
|
to send each datagram to. This is simply mapping an IP address into |
|
|
a directly attached network address. |
|
|
|
|
|
There are two cases to consider: the destination is on the same |
|
|
network, and the destination is on a different network. |
|
|
|
|
|
Same Network |
|
|
|
|
|
For some networks the the directly attached network address can |
|
|
be computed from the IP address for destination hosts on the |
|
|
directly attached network. |
|
|
|
|
|
For other networks the mapping must be done by table look up |
|
|
(however the table is initialized and maintained, for |
|
|
example, [4]). |
|
|
|
|
|
|
|
|
|
|
|
Postel [Page 3] |
|
|
|
|
|
|
|
|
|
|
|
RFC 879 November 1983 |
|
|
TCP Maximum Segment Size |
|
|
|
|
|
|
|
|
Different Network |
|
|
|
|
|
The IP address must be mapped to the directly attached network |
|
|
address of a gateway. For networks with one gateway to the |
|
|
rest of the Internet the host need only determine and remember |
|
|
the gateway address and use it for sending all datagrams to |
|
|
other networks. |
|
|
|
|
|
For networks with multiple gateways to the rest of the |
|
|
Internet, the host must decide which gateway to use for each |
|
|
datagram sent. It need only check the destination network of |
|
|
the IP address and keep information on which gateway to use for |
|
|
each network. |
|
|
|
|
|
The IP does, in some cases, keep per host routing information for |
|
|
other hosts on the directly attached network. The IP does, in some |
|
|
cases, keep per network routing information. |
|
|
|
|
|
A Special Case |
|
|
|
|
|
There are two ICMP messages that convey information about |
|
|
particular hosts. These are subtypes of the Destination |
|
|
Unreachable and the Redirect ICMP messages. These messages are |
|
|
expected only in very unusual circumstances. To make effective |
|
|
use of these messages the receiving host would have to keep |
|
|
information about the specific hosts reported on. Because these |
|
|
messages are quite rare it is strongly recommended that this be |
|
|
done through an exception mechanism rather than having the IP keep |
|
|
per host tables for all hosts. |
|
|
|
|
|
7. The Relationship between IP Datagram and TCP Segment Sizes |
|
|
|
|
|
The relationship between the value of the maximum IP datagram size |
|
|
and the maximum TCP segment size is obscure. The problem is that |
|
|
both the IP header and the TCP header may vary in length. The TCP |
|
|
Maximum Segment Size option (MSS) is defined to specify the maximum |
|
|
number of data octets in a TCP segment exclusive of TCP (or IP) |
|
|
header. |
|
|
|
|
|
To notify the data sender of the largest TCP segment it is possible |
|
|
to receive the calculation of the MSS value to send is: |
|
|
|
|
|
MSS = MTU - sizeof(TCPHDR) - sizeof(IPHDR) |
|
|
|
|
|
On receipt of the MSS option the calculation of the size of segment |
|
|
that can be sent is: |
|
|
|
|
|
SndMaxSegSiz = MIN((MTU - sizeof(TCPHDR) - sizeof(IPHDR)), MSS) |
|
|
|
|
|
|
|
|
Postel [Page 4] |
|
|
|
|
|
|
|
|
|
|
|
RFC 879 November 1983 |
|
|
TCP Maximum Segment Size |
|
|
|
|
|
|
|
|
where MSS is the value in the option, and MTU is the Maximum |
|
|
Transmission Unit (or the maximum packet size) allowed on the |
|
|
directly attached network. |
|
|
|
|
|
This begs the question, though. What value should be used for the |
|
|
"sizeof(TCPHDR)" and for the "sizeof(IPHDR)"? |
|
|
|
|
|
There are three reasonable positions to take: the conservative, the |
|
|
moderate, and the liberal. |
|
|
|
|
|
The conservative or pessimistic position assumes the worst -- that |
|
|
both the IP header and the TCP header are maximum size, that is, 60 |
|
|
octets each. |
|
|
|
|
|
MSS = MTU - 60 - 60 = MTU - 120 |
|
|
|
|
|
If MTU is 576 then MSS = 456 |
|
|
|
|
|
The moderate position assumes the that the IP is maximum size (60 |
|
|
octets) and the TCP header is minimum size (20 octets), because there |
|
|
are no TCP header options currently defined that would normally be |
|
|
sent at the same time as data segments. |
|
|
|
|
|
MSS = MTU - 60 - 20 = MTU - 80 |
|
|
|
|
|
If MTU is 576 then MSS = 496 |
|
|
|
|
|
The liberal or optimistic position assumes the best -- that both the |
|
|
IP header and the TCP header are minimum size, that is, 20 octets |
|
|
each. |
|
|
|
|
|
MSS = MTU - 20 - 20 = MTU - 40 |
|
|
|
|
|
If MTU is 576 then MSS = 536 |
|
|
|
|
|
If nothing is said about MSS, the data sender may cram as much as |
|
|
possible into a 576 octet datagram, and if the datagram has |
|
|
minimum headers (which is most likely), the result will be 536 |
|
|
data octets in the TCP segment. The rule relating MSS to the |
|
|
maximum datagram size ought to be consistent with this. |
|
|
|
|
|
A practical point is raised in favor of the liberal position too. |
|
|
Since the use of minimum IP and TCP headers is very likely in the |
|
|
very large percentage of cases, it seems wasteful to limit the TCP |
|
|
segment data to so much less than could be transmitted at once, |
|
|
especially since it is less that 512 octets. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Postel [Page 5] |
|
|
|
|
|
|
|
|
|
|
|
RFC 879 November 1983 |
|
|
TCP Maximum Segment Size |
|
|
|
|
|
|
|
|
For comparison: 536/576 is 93% data, 496/576 is 86% data, 456/576 |
|
|
is 79% data. |
|
|
|
|
|
8. Maximum Packet Size |
|
|
|
|
|
Each network has some maximum packet size, or maximum transmission |
|
|
unit (MTU). Ultimately there is some limit imposed by the |
|
|
technology, but often the limit is an engineering choice or even an |
|
|
administrative choice. Different installations of the same network |
|
|
product do not have to use the same maximum packet size. Even within |
|
|
one installation not all host must use the same packet size (this way |
|
|
lies madness, though). |
|
|
|
|
|
Some IP implementers have assumed that all hosts on the directly |
|
|
attached network will be the same or at least run the same |
|
|
implementation. This is a dangerous assumption. It has often |
|
|
developed that after a small homogeneous set of host have become |
|
|
operational additional hosts of different types are introduced into |
|
|
the environment. And it has often developed that it is desired to |
|
|
use a copy of the implementation in a different inhomogeneous |
|
|
environment. |
|
|
|
|
|
Designers of gateways should be prepared for the fact that successful |
|
|
gateways will be copied and used in other situation and |
|
|
installations. Gateways must be prepared to accept datagrams as |
|
|
large as can be sent in the maximum packets of the directly attached |
|
|
networks. Gateway implementations should be easily configured for |
|
|
installation in different circumstances. |
|
|
|
|
|
A footnote: The MTUs of some popular networks (note that the actual |
|
|
limit in some installations may be set lower by administrative |
|
|
policy): |
|
|
|
|
|
ARPANET, MILNET = 1007 |
|
|
Ethernet (10Mb) = 1500 |
|
|
Proteon PRONET = 2046 |
|
|
|
|
|
9. Source Fragmentation |
|
|
|
|
|
A source host would not normally create datagram fragments. Under |
|
|
normal circumstances datagram fragments only arise when a gateway |
|
|
must send a datagram into a network with a smaller maximum packet |
|
|
size than the datagram. In this case the gateway must fragment the |
|
|
datagram (unless it is marked "don't fragment" in which case it is |
|
|
discarded, with the option of sending an ICMP message to the source |
|
|
reporting the problem). |
|
|
|
|
|
It might be desirable for the source host to send datagram fragments |
|
|
|
|
|
|
|
|
Postel [Page 6] |
|
|
|
|
|
|
|
|
|
|
|
RFC 879 November 1983 |
|
|
TCP Maximum Segment Size |
|
|
|
|
|
|
|
|
if the maximum segment size (default or negotiated) allowed by the |
|
|
data receiver were larger than the maximum packet size allowed by the |
|
|
directly attached network. However, such datagram fragments must not |
|
|
combine to a size larger than allowed by the destination host. |
|
|
|
|
|
For example, if the receiving TCP announced that it would accept |
|
|
segments up to 5000 octets (in cooperation with the receiving IP) |
|
|
then the sending TCP could give such a large segment to the |
|
|
sending IP provided the sending IP would send it in datagram |
|
|
fragments that fit in the packets of the directly attached |
|
|
network. |
|
|
|
|
|
There are some conditions where source host fragmentation would be |
|
|
necessary. |
|
|
|
|
|
If the host is attached to a network with a small packet size (for |
|
|
example 256 octets), and it supports an application defined to |
|
|
send fixed sized messages larger than that packet size (for |
|
|
example TFTP [5]). |
|
|
|
|
|
If the host receives ICMP Echo messages with data it is required |
|
|
to send an ICMP Echo-Reply message with the same data. If the |
|
|
amount of data in the Echo were larger than the packet size of the |
|
|
directly attached network the following steps might be required: |
|
|
(1) receive the fragments, (2) reassemble the datagram, (3) |
|
|
interpret the Echo, (4) create an Echo-Reply, (5) fragment it, and |
|
|
(6) send the fragments. |
|
|
|
|
|
10. Gateway Fragmentation |
|
|
|
|
|
Gateways must be prepared to do fragmentation. It is not an optional |
|
|
feature for a gateway. |
|
|
|
|
|
Gateways have no information about the size of datagrams destination |
|
|
hosts are prepared to accept. It would be inappropriate for gateways |
|
|
to attempt to keep such information. |
|
|
|
|
|
Gateways must be prepared to accept the largest datagrams that are |
|
|
allowed on each of the directly attached networks, even if it is |
|
|
larger than 576 octets. |
|
|
|
|
|
Gateways must be prepared to fragment datagrams to fit into the |
|
|
packets of the next network, even if it smaller than 576 octets. |
|
|
|
|
|
If a source host thought to take advantage of the local network's |
|
|
ability to carry larger datagrams but doesn't have the slightest idea |
|
|
if the destination host can accept larger than default datagrams and |
|
|
expects the gateway to fragment the datagram into default size |
|
|
|
|
|
|
|
|
Postel [Page 7] |
|
|
|
|
|
|
|
|
|
|
|
RFC 879 November 1983 |
|
|
TCP Maximum Segment Size |
|
|
|
|
|
|
|
|
fragments, then the source host is misguided. If indeed, the |
|
|
destination host can't accept larger than default datagrams, it |
|
|
probably can't reassemble them either. If the gateway either passes |
|
|
on the large datagram whole or fragments into default size fragments |
|
|
the destination will not accept it. Thus, this mode of behavior by |
|
|
source hosts must be outlawed. |
|
|
|
|
|
A larger than default datagram can only arrive at a gateway because |
|
|
the source host knows that the destination host can handle such large |
|
|
datagrams (probably because the destination host announced it to the |
|
|
source host in an TCP MSS option). Thus, the gateway should pass on |
|
|
this large datagram in one piece or in the largest fragments that fit |
|
|
into the next network. |
|
|
|
|
|
An interesting footnote is that even though the gateways may know |
|
|
about know the 576 rule, it is irrelevant to them. |
|
|
|
|
|
11. Inter-Layer Communication |
|
|
|
|
|
The Network Driver (ND) or interface should know the Maximum |
|
|
Transmission Unit (MTU) of the directly attached network. |
|
|
|
|
|
The IP should ask the Network Driver for the Maximum Transmission |
|
|
Unit. |
|
|
|
|
|
The TCP should ask the IP for the Maximum Datagram Data Size (MDDS). |
|
|
This is the MTU minus the IP header length (MDDS = MTU - IPHdrLen). |
|
|
|
|
|
When opening a connection TCP can send an MSS option with the value |
|
|
equal MDDS - TCPHdrLen. |
|
|
|
|
|
TCP should determine the Maximum Segment Data Size (MSDS) from either |
|
|
the default or the received value of the MSS option. |
|
|
|
|
|
TCP should determine if source fragmentation is possible (by asking |
|
|
the IP) and desirable. |
|
|
|
|
|
If so TCP may hand to IP segments (including the TCP header) up to |
|
|
MSDS + TCPHdrLen. |
|
|
|
|
|
If not TCP may hand to IP segments (including the TCP header) up |
|
|
to the lesser of (MSDS + TCPHdrLen) and MDDS. |
|
|
|
|
|
IP checks the length of data passed to it by TCP. If the length is |
|
|
less than or equal MDDS, IP attached the IP header and hands it to |
|
|
the ND. Otherwise the IP must do source fragmentation. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Postel [Page 8] |
|
|
|
|
|
|
|
|
|
|
|
RFC 879 November 1983 |
|
|
TCP Maximum Segment Size |
|
|
|
|
|
|
|
|
12. What is the Default MSS ? |
|
|
|
|
|
Another way of asking this question is "What transmitted value for |
|
|
MSS has exactly the same effect of not transmitting the option at |
|
|
all?". |
|
|
|
|
|
In terms of the previous section: |
|
|
|
|
|
The default assumption is that the Maximum Transmission Unit is |
|
|
576 octets. |
|
|
|
|
|
MTU = 576 |
|
|
|
|
|
The Maximum Datagram Data Size (MDDS) is the MTU minus the IP |
|
|
header length. |
|
|
|
|
|
MDDS = MTU - IPHdrLen = 576 - 20 = 556 |
|
|
|
|
|
When opening a connection TCP can send an MSS option with the |
|
|
value equal MDDS - TCPHdrLen. |
|
|
|
|
|
MSS = MDDS - TCPHdrLen = 556 - 20 = 536 |
|
|
|
|
|
TCP should determine the Maximum Segment Data Size (MSDS) from |
|
|
either the default or the received value of the MSS option. |
|
|
|
|
|
Default MSS = 536, then MSDS = 536 |
|
|
|
|
|
TCP should determine if source fragmentation is possible and |
|
|
desirable. |
|
|
|
|
|
If so TCP may hand to IP segments (including the TCP header) up |
|
|
to MSDS + TCPHdrLen (536 + 20 = 556). |
|
|
|
|
|
If not TCP may hand to IP segments (including the TCP header) |
|
|
up to the lesser of (MSDS + TCPHdrLen (536 + 20 = 556)) and |
|
|
MDDS (556). |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Postel [Page 9] |
|
|
|
|
|
|
|
|
|
|
|
RFC 879 November 1983 |
|
|
TCP Maximum Segment Size |
|
|
|
|
|
|
|
|
13. The Truth |
|
|
|
|
|
The rule relating the maximum IP datagram size and the maximum TCP |
|
|
segment size is: |
|
|
|
|
|
TCP Maximum Segment Size = IP Maximum Datagram Size - 40 |
|
|
|
|
|
The rule must match the default case. |
|
|
|
|
|
If the TCP Maximum Segment Size option is not transmitted then the |
|
|
data sender is allowed to send IP datagrams of maximum size (576) |
|
|
with a minimum IP header (20) and a minimum TCP header (20) and |
|
|
thereby be able to stuff 536 octets of data into each TCP segment. |
|
|
|
|
|
The definition of the MSS option can be stated: |
|
|
|
|
|
The maximum number of data octets that may be received by the |
|
|
sender of this TCP option in TCP segments with no TCP header |
|
|
options transmitted in IP datagrams with no IP header options. |
|
|
|
|
|
14. The Consequences |
|
|
|
|
|
When TCP is used in a situation when either the IP or TCP headers are |
|
|
not minimum and yet the maximum IP datagram that can be received |
|
|
remains 576 octets then the TCP Maximum Segment Size option must be |
|
|
used to reduce the limit on data octets allowed in a TCP segment. |
|
|
|
|
|
For example, if the IP Security option (11 octets) were in use and |
|
|
the IP maximum datagram size remained at 576 octets, then the TCP |
|
|
should send the MSS with a value of 525 (536-11). |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Postel [Page 10] |
|
|
|
|
|
|
|
|
|
|
|
RFC 879 November 1983 |
|
|
TCP Maximum Segment Size |
|
|
|
|
|
|
|
|
15. References |
|
|
|
|
|
[1] Postel, J., ed., "Transmission Control Protocol - DARPA Internet |
|
|
Program Protocol Specification", RFC 793, USC/Information |
|
|
Sciences Institute, September 1981. |
|
|
|
|
|
[2] Postel, J., ed., "Internet Protocol - DARPA Internet Program |
|
|
Protocol Specification", RFC 791, USC/Information Sciences |
|
|
Institute, September 1981. |
|
|
|
|
|
[3] Postel, J., "Internet Control Message Protocol - DARPA Internet |
|
|
Program Protocol Specification", RFC 792, USC/Information |
|
|
Sciences Institute, September 1981. |
|
|
|
|
|
[4] Plummer, D., "An Ethernet Address Resolution Protocol or |
|
|
Converting Network Protocol Addresses to 48-bit Ethernet |
|
|
Addresses for Transmission on Ethernet Hardware", RFC 826, |
|
|
MIT/LCS, November 1982. |
|
|
|
|
|
[5] Sollins, K., "The TFTP Protocol (Revision 2)", RFC 783, MIT/LCS, |
|
|
June 1981. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Postel [Page 11] |
|
|
|
|
|
|