Difference between revisions of "Unit TCP"
(8 intermediate revisions by the same user not shown) | |||
Line 22: | Line 22: | ||
TCP Send and Recv do not use a block buffer as per UDP etc. Instead the data for each Segment is stored in memory (TCP_MAX_MSS) allocated with the Segment. The Free and Used values still track the amount of data in the buffer but this method allows OOB data to be handled correctly. | TCP Send and Recv do not use a block buffer as per UDP etc. Instead the data for each Segment is stored in memory (TCP_MAX_MSS) allocated with the Segment. The Free and Used values still track the amount of data in the buffer but this method allows OOB data to be handled correctly. | ||
− | TCP Sequence numbers are compared using modulo 2^32 arithmetic. The following calculations provide the | + | TCP Sequence numbers are compared using modulo 2^32 arithmetic. The following calculations provide the necessary handling of wraparound etc. |
LT = (A - B) < 0 | LT = (A - B) < 0 | ||
Line 85: | Line 85: | ||
| 65536; TCP Send/Receive Buffer Sizes | | 65536; TCP Send/Receive Buffer Sizes | ||
|- | |- | ||
− | | <code>TCP_WINDOW_SIZE = | + | | <code>TCP_WINDOW_SIZE = 64240;</code> |
− | | | + | | Sliding Window Receive Size (44 x MSS) |
|- | |- | ||
| <code>TCP_INITIAL_WINDOW = 8192;</code> | | <code>TCP_INITIAL_WINDOW = 8192;</code> | ||
Line 93: | Line 93: | ||
|colspan="2"| | |colspan="2"| | ||
|- | |- | ||
− | | <code>TCP_WINDOW_TIMEOUT = | + | | <code>TCP_TIMEOUT_OFFSET = 10;</code> |
+ | | How much time offset to allow from the designated value | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>TCP_ADVERT_TIMEOUT = 100;</code> | ||
+ | | Time to wait before sending a window size update after closing the receive window | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>TCP_WINDOW_TIMEOUT = 5000;</code> | ||
| Time to wait before probing small/zero Window | | Time to wait before probing small/zero Window | ||
|- | |- | ||
Line 133: | Line 143: | ||
|- | |- | ||
| <code>TCP_HEADER_SIZE = 20;</code> | | <code>TCP_HEADER_SIZE = 20;</code> | ||
− | | SizeOf(TTCPHeader) | + | | SizeOf(TTCPHeader) Does Not Allow for Options |
|- | |- | ||
| <code>TCP_OPTIONS_SIZE = 40;</code> | | <code>TCP_OPTIONS_SIZE = 40;</code> | ||
Line 140: | Line 150: | ||
|colspan="2"| | |colspan="2"| | ||
|- | |- | ||
− | | <code>TCP_SEGMENT_SIZE = | + | | <code>TCP_SEGMENT_SIZE = 68;</code> |
− | | SizeOf(TTCPSegment) | + | | SizeOf(TTCPSegment) Including TSocketTimerItem |
|- | |- | ||
|} | |} | ||
Line 388: | Line 398: | ||
| <code>Next:PTCPSegment;</code> | | <code>Next:PTCPSegment;</code> | ||
| Pointer to Next Segment | | Pointer to Next Segment | ||
+ | |- | ||
+ | |colspan="2"| | ||
+ | |- | ||
+ | | <code>Item:TSocketTimerItem;</code> | ||
+ | | Socket Timer Item for this Segment | ||
|- | |- | ||
|} | |} | ||
Line 397: | Line 412: | ||
− | '''TCP | + | '''TCP specific classes''' |
− | + | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|- | |- | ||
− | | | + | | [[TTCPProtocolTransport|<code>TTCPProtocolTransport = class(TProtocolTransport)</code>]] |
− | + | ||
− | + | ||
− | | <code> | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|- | |- | ||
|} | |} | ||
− | + | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|- | |- | ||
− | | | + | | [[TTCPProtocol|<code>TTCPProtocol = class(TNetworkProtocol)</code>]] |
− | + | ||
− | + | ||
− | | <code> | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|- | |- | ||
|} | |} | ||
− | + | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|- | |- | ||
− | | | + | | [[TTCPSocket|<code>TTCPSocket = class(TProtocolSocket)</code>]] |
− | + | ||
− | + | ||
− | + | ||
− | | <code> | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|- | |- | ||
|} | |} | ||
− | + | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|- | |- | ||
− | | | + | | [[TTCPState|<code>TTCPState = class(TProtocolState)</code>]] |
− | + | ||
− | + | ||
− | | <code> | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|- | |- | ||
|} | |} | ||
− | + | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|- | |- | ||
− | | | + | | [[TTCPOptions|<code>TTCPOptions = class(TProtocolOptions)</code>]] |
− | + | ||
− | + | ||
− | + | ||
− | | <code> | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|- | |- | ||
|} | |} | ||
− | + | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|- | |- | ||
− | | | + | | [[TTCPSendBuffer|<code>TTCPSendBuffer = class(TSocketBuffer)</code>]] |
− | + | ||
− | + | ||
− | | <code> | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|- | |- | ||
|} | |} | ||
− | + | {| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;" | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|- | |- | ||
− | | | + | | [[TTCPRecvBuffer|<code>TTCPRecvBuffer = class(TSocketBuffer)</code>]] |
− | + | ||
− | + | ||
− | | <code> | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|- | |- | ||
|} | |} | ||
− | |||
<br /> | <br /> | ||
Line 1,253: | Line 467: | ||
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
− | |- | + | |-https://ultibo.org/wiki/Unit_Sockets# |
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 1,269: | Line 483: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Buffer |
| The complete packet including Transport header | | The complete packet including Transport header | ||
|- | |- | ||
Line 1,281: | Line 495: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Buffer |
| The complete packet including Transport header | | The complete packet including Transport header | ||
|- | |- | ||
Line 1,289: | Line 503: | ||
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | <div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;"> | ||
<pre style="border: 0; padding-bottom:0px;">function GetTCPHeaderLength(AFamily:Word; ABuffer:Pointer):Word;</pre> | <pre style="border: 0; padding-bottom:0px;">function GetTCPHeaderLength(AFamily:Word; ABuffer:Pointer):Word;</pre> | ||
− | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' | + | <div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div> |
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | <div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;"> | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Buffer |
| The complete packet including Transport header | | The complete packet including Transport header | ||
|- | |- | ||
Line 1,305: | Line 519: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Buffer |
| The complete packet including Transport header | | The complete packet including Transport header | ||
|- | |- | ||
Line 1,317: | Line 531: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Buffer |
| The complete packet including Transport header | | The complete packet including Transport header | ||
|- | |- | ||
Line 1,329: | Line 543: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Buffer |
| The complete packet including Transport header | | The complete packet including Transport header | ||
|- | |- | ||
Line 1,341: | Line 555: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- | ||
Line 1,353: | Line 567: | ||
{| class="wikitable" style="font-size: 14px; background: white;" | {| class="wikitable" style="font-size: 14px; background: white;" | ||
|- | |- | ||
− | ! | + | ! Note |
| None documented | | None documented | ||
|- | |- |
Latest revision as of 01:38, 30 May 2018
Return to Unit Reference
Contents
Description
Ultibo TCP (Transmission Control Protocol) unit
Notes:
Segment handling:
Send adds new segments to the end of the list only accepts ACKs for whole segments.
Recv adds/inserts segments in correct SEQ order accepts overlapping segments only sends ACKs for whole segments.
Send will coalesce small data writes into larger segments if options allow this.
Recv will store the segments exactly as received.
TCP Send and Recv do not use a block buffer as per UDP etc. Instead the data for each Segment is stored in memory (TCP_MAX_MSS) allocated with the Segment. The Free and Used values still track the amount of data in the buffer but this method allows OOB data to be handled correctly.
TCP Sequence numbers are compared using modulo 2^32 arithmetic. The following calculations provide the necessary handling of wraparound etc.
LT = (A - B) < 0
LEQ = (A - B) <= 0
GT = (A - B) > 0
GEQ = (A - B) >= 0
See GlobalSock.pas for actual functions that implement this.
Constants
TCP_*
Note: Some TCP definitions are in the Protocol or IP modules | |
TCP_PROTOCOL_NAME = 'TCP';
|
|
TCP_TIMER_INTERVAL = 1;
|
1ms timer interval for TCP |
MIN_TCP_PACKET = 20;
|
Not Counting Adapter and Transport Header |
MAX_TCP_PACKET = 1480;
|
Not Counting Adapter and Transport Header |
TCP_DEFAULT_MSS = 536;
|
Default Segment Size for TCP (576 - TCP - IP) |
TCP_MAX_MSS = 1460;
|
Max Segment Size for TCP (1500 - TCP - IP) |
TCP_MAX_LIFETIME = 120000;
|
Max Segment Lifetime (2 minutes) |
TCP_TIMEOUT = 0;
|
Wait forever on a TCP Read/Write |
TCP_BUFFER_SIZE = 262144;
|
65536; TCP Send/Receive Buffer Sizes |
TCP_WINDOW_SIZE = 64240;
|
Sliding Window Receive Size (44 x MSS) |
TCP_INITIAL_WINDOW = 8192;
|
Initial Window to advertise in SYN packet |
TCP_TIMEOUT_OFFSET = 10;
|
How much time offset to allow from the designated value |
TCP_ADVERT_TIMEOUT = 100;
|
Time to wait before sending a window size update after closing the receive window |
TCP_WINDOW_TIMEOUT = 5000;
|
Time to wait before probing small/zero Window |
TCP_ACK_TIMEOUT = 200;
|
Max Delayed Ack Time |
TCP_CONNECT_COUNT = 3;
|
Number of Connect retries (on RST) before Failure |
TCP_RESTART_TIMEOUT = 400;
|
Timeout between Connect retries (Milliseconds) |
TCP_RETRY_COUNT = 10;
|
Number of Retransmits before Reset |
TCP_RETRY_TIMEOUT:array[1..TCP_RETRY_COUNT] of LongWord = (250,500,1000,2000,4000,8000,15000,30000,60000,120000);
| |
TCP_KEEPALIVE_COUNT = 3;
|
Number of Failed Keepalives before Reset |
TCP_KEEPALIVE_TIMEOUT:array[1..TCP_KEEPALIVE_COUNT] of LongWord = (600000,60000,60000);
| |
TCP_MAX_PORT = 65536;
|
|
TCP_HEADER_SIZE = 20;
|
SizeOf(TTCPHeader) Does Not Allow for Options |
TCP_OPTIONS_SIZE = 40;
|
Maximum Allowed Options |
TCP_SEGMENT_SIZE = 68;
|
SizeOf(TTCPSegment) Including TSocketTimerItem |
TCP_STATE_*
TCP_STATE_LISTEN = 0;
|
listening for connection |
TCP_STATE_SYNSENT = 1;
|
SYN sent, active open |
TCP_STATE_SYNREC = 2;
|
SYN received, SYNACK sent |
TCP_STATE_ESTAB = 3;
|
established |
TCP_STATE_FINWAIT1 = 4;
|
sent FIN |
TCP_STATE_FINWAIT2 = 5;
|
sent FIN, received FINACK |
TCP_STATE_CLOSWAIT = 6;
|
received FIN waiting for close |
TCP_STATE_CLOSING = 7;
|
sent FIN, received FIN (waiting for FINACK) |
TCP_STATE_LASTACK = 8;
|
FIN received, FINACK + FIN sent |
TCP_STATE_TIMEWAIT = 9;
|
dally after sending final FINACK |
TCP_STATE_CLOSED = 10;
|
FINACK received |
TCPOPT_*
TCPOPT_EOL = 0;
|
end-of-option list |
TCPOPT_NOP = 1;
|
no-operation |
TCPOPT_MAXSEG = 2;
|
maximum segment size |
TCPOPT_WINDOW = 3;
|
window scale factor (rfc1072) |
TCPOPT_SACKOK = 4;
|
selective ack ok (rfc1072) |
TCPOPT_SACK = 5;
|
selective ack (rfc1072) |
TCPOPT_ECHO = 6;
|
echo (rfc1072) |
TCPOPT_ECHOREPLY = 7;
|
echo (rfc1072) |
TCPOPT_TIMESTAMP = 8;
|
timestamps (rfc1323) |
TCPOPT_CC = 11;
|
T/TCP CC options (rfc1644) |
TCPOPT_CCNEW = 12;
|
T/TCP CC options (rfc1644) |
TCPOPT_CCECHO = 13;
|
T/TCP CC options (rfc1644) |
TCP_FLAG_*
TCP_FLAG_FIN = $01;
|
|
TCP_FLAG_SYN = $02;
|
|
TCP_FLAG_RST = $04;
|
|
TCP_FLAG_PUSH = $08;
|
|
TCP_FLAG_ACK = $10;
|
|
TCP_FLAG_URG = $20;
|
|
TCP_FLAG_MASK = $3F;
|
|
Van Jacobson's Algorithm; max std. average and std. deviation | |
MAX_VJSA = 80000;
|
|
MAX_VJSD = 20000;
|
|
INIT_VJSA = 220;
|
TCP_PORT_*
TCP_PORT_START = 49152;
|
First dynamic port (Previously 1024) As per IANA assignment |
TCP_PORT_STOP = 65534;
|
Last dynamic port (Previously 5000) Short of IANA assignment to allow for rollover |
Type definitions
TCP header
PTCPHeader = ^TTCPHeader;
TTCPHeader = packed record
Note: Some TCP definitions are in the Protocol or IP modules | |
Note: 20 Bytes unless TCP Options are added | |
SourcePort:Word;
|
Network Order |
DestPort:Word;
|
Network Order |
Sequence:LongWord;
|
First Sequence number in Data |
Acknowledge:LongWord;
|
Next Sequence number expected |
HeaderLength:Byte;
|
Number of 32 bit words in Header and Options (Bits 4-7 Reserved) |
Flags:Byte;
|
Flags for TCP Control (Bits 1-2 Reserved) |
WindowSize:Word;
|
Max 65536 (See WindowScale for higher values) |
Checksum:Word;
|
As per standard (Header, Options and Data) |
Urgent:Word;
|
TCP segment
PTCPSegment = ^TTCPSegment;
TTCPSegment = record
Note: 48 Bytes (Used by TCPSendBuffer/TCPRecvBuffer) | |
Size:Word;
|
Size of Segment Data (Can be zero) |
Data:Pointer;
|
Pointer to Data in Buffer (Can be nil) |
FirstSequence:LongWord;
|
Start Sequence of Data |
LastSequence:LongWord;
|
End Sequence of Data (including Control bits)(actually the Start Sequence of next Segment) |
Control:Word;
|
Control Bits on this segment (SYN/FIN/URG) (Send/Recv) |
Transferred:WordBool;
|
Data has been Transferred to/from Buffer (Send/Recv) |
Acknowledged:WordBool;
|
Data has been Acknowledged (Send/Recv) |
SelectiveAck:WordBool;
|
Data has been Selective Acknowledged (Send/Recv) |
RoundTripTime:Int64;
|
|
Count:Word;
|
Transmit Count (Send) |
Timeout:Int64;
|
Transmit (Send)/Acknowledge (Recv) Timeout |
Prev:PTCPSegment;
|
Pointer to Prev Segment |
Next:PTCPSegment;
|
Pointer to Next Segment |
Item:TSocketTimerItem;
|
Socket Timer Item for this Segment |
Class definitions
TCP specific classes
TTCPProtocolTransport = class(TProtocolTransport)
|
TTCPProtocol = class(TNetworkProtocol)
|
TTCPSocket = class(TProtocolSocket)
|
TTCPState = class(TProtocolState)
|
TTCPOptions = class(TProtocolOptions)
|
TTCPSendBuffer = class(TSocketBuffer)
|
TTCPRecvBuffer = class(TSocketBuffer)
|
Public variables
None defined
Function declarations
Initialization functions
procedure TCPInit;
Note | None documented |
---|
TCP functions
function CheckTCP(AFamily:Word; ABuffer:Pointer):Boolean;
Buffer | The complete packet including Transport header |
---|
function GetTCPHeaderOffset(AFamily:Word; ABuffer:Pointer):Word;
Buffer | The complete packet including Transport header |
---|
function GetTCPHeaderLength(AFamily:Word; ABuffer:Pointer):Word;
Buffer | The complete packet including Transport header |
---|
function GetTCPOptionsLength(AFamily:Word; ABuffer:Pointer):Word;
Buffer | The complete packet including Transport header |
---|
function GetTCPDataOffset(AFamily:Word; ABuffer:Pointer):Word;
Buffer | The complete packet including Transport header |
---|
function GetTCPDataLength(AFamily:Word; ABuffer:Pointer):Word;
Buffer | The complete packet including Transport header |
---|
function ChecksumTCPRecv(AFamily:Word; APseudo:PIPPseudo; ABuffer:Pointer; AOffset,ALength:Word):Word;
Note | None documented |
---|
function ChecksumTCPSend(AFamily:Word; APseudo:PIPPseudo; AHeader:PTCPHeader; AOptions,AData:Pointer; AOptionsLength,ADataLength:Word):Word;
Note | None documented |
---|
Return to Unit Reference