3.2.1.1.2 Send Window (Call)

Send Window: The client and server SHOULD implement an abstraction of a send window in its call object to support an implementation of a sliding window algorithm. The Windows-based client and server call objects share a common packet-windowing implementation that maintains separate windows for the data to be sent and received. For a particular call, the send window contains the following properties:

  • Sent Fragment List: For every call, the client and server MUST maintain a Sent Fragment List of fragment descriptors that represents the set of fragments that have been sent to the client or server but for which a FACK has not yet been received.

    The Sent Fragment List is maintained as a ring buffer containing a number of fragment descriptors. The maximum number of elements in the Sent Fragment List is limited by the greater of the Outbound Fragment Window and Maximum_window_size.

    Fragments are added to the Sent Fragment List when they are sent, and are removed when a FACK PDU is received for the corresponding fragment. Removing a fragment from the Sent Fragment List enables further fragments to be sent.

  • Fragment_final: An unsigned 32-bit integer representing the final fragment to be sent. It is calculated using the size of the call to be sent divided by the Maximum_fragment_length.

  • Fragment_base: An unsigned 32-bit integer representing the first unacknowledged fragment of the call to be sent. It is zero initially and advanced when the receiver acknowledges one or more additional fragments.

  • Outbound Fragment Window: The client and server maintain an unsigned 32-bit integer containing the window size that indicates the maximum number of unacknowledged fragments that the remote client and server are ready to receive.

    The value is initialized from the current value of the activity's Maximum_window_size.

  • Burst_length: The number of fragments to transmit at one time. Initially one; limited by the Outbound Fragment Window. It is incremented when a FACK is received and halved when a receive times out as detected by the Packet Retransmission Timer. The minimum value is 0. For details, see the discussion of Packet Transmission Behavior in section 3.2.1.5.3.

  • Send_serial_number: The serial number of the next packet to be sent. Initially zero; incremented after every sent fragment and, for client implementations, every PING packet.

  • Fack_serial_number: The latest serial number acknowledged by the recipient. Initially zero; updated when a received FACK or NOCALL carries a higher value in its serial_num field.

  • Maximum PDU Length: The size of the largest packet that can be sent and received by the transport. Set to 1,024 bytes for the first call of an activity. At the end of the call, the current value is stored in the activity, and the next call begins with the stored value. When a FACK or NOCALL is received, the value is updated to the lower of the local transport limit and the value in the packet's max_tsdu field.

  • Maximum_fragment_length: The largest amount of stub data that fits in a single PDU. It is equal to the Maximum PDU Length minus 0x80 bytes for the RPC header and the number of bytes required for the security trailer. It is updated whenever Maximum PDU Length is updated.