(MC NMF) 140515
(MC NMF) 140515
(MC NMF) 140515
No Trade Secrets. Microsoft does not claim any trade secret rights in this documentation.
Patents. Microsoft has patents that may cover your implementations of the technologies
described in the Open Specifications. Neither this notice nor Microsoft's delivery of the
documentation grants any licenses under those or any other Microsoft patents. However, a given
Open Specification may be covered by Microsoft Open Specification Promise or the Community
Promise. If you would prefer a written license, or if the technologies described in the Open
Specifications are not covered by the Open Specifications Promise or Community Promise, as
applicable, patent licenses are available by contacting iplg@microsoft.com.
Trademarks. The names of companies and products contained in this documentation may be
covered by trademarks or similar intellectual property rights. This notice does not grant any
licenses under those rights. For a list of Microsoft trademarks, visit
www.microsoft.com/trademarks.
Fictitious Names. The example companies, organizations, products, domain names, email
addresses, logos, people, places, and events depicted in this documentation are fictitious. No
association with any real company, organization, product, domain name, email address, logo,
person, place, or event is intended or should be inferred.
Reservation of Rights. All other rights are reserved, and this notice does not grant any rights
other than specifically described above, whether by implication, estoppel, or otherwise.
Tools. The Open Specifications do not require the use of Microsoft programming tools or
programming environments in order for you to develop an implementation. If you have access to
Microsoft programming tools and environments you are free to take advantage of them. Certain
Open Specifications are intended for use in conjunction with publicly available standard
specifications and network programming art, and assumes that the reader either is familiar with the
aforementioned material or has immediate access to it.
1 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
Revision Revision
Date History Class Comments
2 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
3 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
2 Messages................................................................................................................ 15
2.1 Transport............................................................................................................ 15
2.2 Message Syntax .................................................................................................. 15
2.2.1 Record Types ................................................................................................. 15
2.2.2 Record Size Encoding ...................................................................................... 15
2.2.3 Property Records ............................................................................................ 16
2.2.3.1 Version Record ......................................................................................... 17
2.2.3.2 Mode Record ............................................................................................ 17
2.2.3.3 Via Record ............................................................................................... 18
2.2.3.4 Envelope Encoding Record ......................................................................... 18
2.2.3.4.1 Known Encoding Record ....................................................................... 18
2.2.3.4.2 Extensible Encoding Record .................................................................. 19
2.2.3.5 Upgrade Request Record ........................................................................... 20
2.2.3.6 Upgrade Response Record ......................................................................... 21
2.2.3.7 Preamble End Record ................................................................................ 21
2.2.3.8 Preamble Ack Record ................................................................................ 21
2.2.3.9 End Record .............................................................................................. 22
2.2.4 Envelope Records ........................................................................................... 22
2.2.4.1 Sized Envelope Record .............................................................................. 22
2.2.4.2 Data Chunk.............................................................................................. 23
2.2.4.3 Unsized Envelope Record ........................................................................... 23
2.2.5 Fault Records ................................................................................................. 24
2.2.6 Preamble Message .......................................................................................... 25
4 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
5 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
5 Security .................................................................................................................. 45
5.1 Security Considerations for Implementers ............................................................... 45
5.2 Index of Security Parameters ................................................................................ 45
7 Change Tracking..................................................................................................... 50
8 Index ..................................................................................................................... 51
6 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
Familiarity with SOAP and XML technologies is required for a complete understanding of this
document.
Sections 1.8, 2, and 3 of this specification are normative and can contain the terms MAY, SHOULD,
MUST, MUST NOT, and SHOULD NOT as defined in RFC 2119. Sections 1.5 and 1.9 are also
normative but cannot contain those terms. All other sections and examples in this specification are
informative.
1.1 Glossary
little-endian
.NET Framework
Unicode
Envelope Record: A record that contains data, such as a SOAP message, see [SOAP1.1] and
[SOAP1.2-1/2007].
Initiating Stream: The protocol stream that flows from the initiator.
initiator: The node that initiates the connection over which a protocol stream flows.
protocol stream property: A protocol stream characteristic that may be set by a property
record and applies to subsequent records flowing with the protocol stream.
MAY, SHOULD, MUST, SHOULD NOT, MUST NOT: These terms (in all caps) are used as
specified in [RFC2119]. All statements of optional behavior use either MAY, SHOULD, or
SHOULD NOT.
1.2 References
References to Microsoft Open Specifications documentation do not include a publishing year because
links are to the latest version of the documents, which are updated frequently. References to other
documents include a publishing year when one is available.
7 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
We conduct frequent surveys of the normative references to assure their continued availability. If
you have any issue with finding a normative reference, please contact dochelp@microsoft.com. We
will assist you in finding the relevant information.
[RFC793] Postel, J., "Transmission Control Protocol", STD 7, RFC 793, September 1981,
http://www.ietf.org/rfc/rfc0793.txt
[RFC2045] Freed, N., and Borenstein, N., "Multipurpose Internet Mail Extensions (MIME) Part One:
Format of Internet Message Bodies", RFC 2045, November 1996, http://ietf.org/rfc/rfc2045.txt
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC
2119, March 1997, http://www.rfc-editor.org/rfc/rfc2119.txt
[RFC2234] Crocker, D., and Overell, P., "Augmented BNF for Syntax Specifications: ABNF", RFC
2234, November 1997, http://www.ietf.org/rfc/rfc2234.txt
[RFC2279] Yergeau, F., "UTF-8, A Transformation Format of ISO10646", RFC 2279, January 1998,
http://www.ietf.org/rfc/rfc2279.txt
[RFC2396] Berners-Lee, T., Fielding, R., and Masinter, L., "Uniform Resource Identifiers (URI):
Generic Syntax", RFC 2396, August 1998, http://www.ietf.org/rfc/rfc2396.txt
[RFC2781] Hoffman, P., and Yergeau, F., "UTF-16, an encoding of ISO 10646", RFC 2781, February
2000, http://www.ietf.org/rfc/rfc2781.txt
[RFC4178] Zhu, L., Leach, P., Jaganathan, K., and Ingersoll, W., "The Simple and Protected Generic
Security Service Application Program Interface (GSS-API) Negotiation Mechanism", RFC 4178,
October 2005, http://www.ietf.org/rfc/rfc4178.txt
[RFC4346] Dierks, T., and Rescorla, E., "The Transport Layer Security (TLS) Protocol Version 1.1",
RFC 4346, April 2006, http://www.ietf.org/rfc/rfc4346.txt
[SOAP1.1] Box, D., Ehnebuske, D., Kakivaya, G., et al., "Simple Object Access Protocol (SOAP)
1.1", May 2000, http://www.w3.org/TR/2000/NOTE-SOAP-20000508/
[SOAP1.2-1/2007] Gudgin, M., Hadley, M., Mendelsohn, N., et al., "SOAP Version 1.2 Part 1:
Messaging Framework (Second Edition) ", W3C Recommendation 27, April 2007,
http://www.w3.org/TR/2007/REC-soap12-part1-20070427/
[SOAP-MTOM] Gudgin, M., Medelsohn, N., Nottingham, M., and Ruellan, H., "SOAP Message
Transmission Optimization Mechanism", W3C Recommendation, 25 January 2005,
http://www.w3.org/TR/2005/REC-soap12-mtom-20050125/
8 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
1.3 Overview
The .NET Message Framing Protocol defines a format for framing messages, including SOAP
messages. Consider a scenario in which two SOAP nodes are interacting and exchanging SOAP
messages. The transport used for communication may not inherently support the notion of
messages. For example, if the underlying transport is TCP, it provides a byte stream, and the
receiver needs to have additional parsing logic to be able to extract a SOAP message from this
stream.
Has capability to skip past a message that is not well formed. If the message frames are well
formed but the embedded content is malformed, the protocol provides a means of skipping over
all such message frames.
9 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
The message properties are typically controlled by the Protocol Configuration Object (PCO). The PCO
determines the following aspects of a specified instance of the protocol:
The Via, which is a Uniform Resource Identifier (URI) that identifies the endpoint for which the
messages are intended.
The encoding format being used for the messages. The different encoding schemes are covered
in section 2.2.3.4.
The chunk size. If the mode supports chunking, this determines the maximum size of a chunk.
The implementation-defined maximum supported sizes for messages and record types. <1>
1.3.1 Scenarios
This section describes scenarios that capture the various message exchange patterns between SOAP
nodes. These scenarios help to define the communication modes that are covered in the next section
and that the protocol needs to support.
The scenarios describe a sales organization that has several salespersons; some are in the head
office and some offsite. They are interacting with the customers and preparing purchase orders that
need to be sent to a central server as SOAP messages. The purchase orders can also be retrieved
from the server, again as SOAP messages. The Asynchronous Message Relay is a mechanism that is
used to queue up messages when the salesperson is offline and then relay the messages after
connectivity is established. One such mechanism is Microsoft Message Queuing, as described in [MS-
MQOD].
10 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
In this scenario, two salespersons are working at the head office with several customers.
Salesperson A is responsible for collecting the customer profiles, and salesperson B is responsible for
collecting the customer requirements. The two pieces of information will need to be combined to
create a purchase order. Also, the head office has a high volume of customers; so there will be
frequent message exchanges between the two salespeople.
For this scenario, it makes sense for salesperson A to initiate a session where the message
properties are sent out. Subsequently, the messages frames are sent from salesperson A or
salesperson B, and the other salesperson can extract the message by using the message properties
for that session. At the end of the conversation, either salesperson can terminate the session.
In this scenario, a salesperson retrieves the entire customer inventory (in the form of a message)
from the server at the start of the day.
Because this operation is typically performed only once each day, a session is not required, as was
the case in the previous scenario. Instead, the protocol should send the message properties followed
by the message frames, and the receiving end applies the properties to extract the message.
In addition, because the inventory is large, the message content may be broken up into multiple
chunks. The receiving end can then stream the content one chunk at a time and does not have to
process the entire message at one time.
In this scenario, salesperson C is visiting various customers and creating their purchase orders.
However, the salesperson does not have access to the server and can upload these orders to the
server only after he returns to his branch office. The order application uses some mechanism (for
11 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
This scenario differs from the scenario in section 1.3.1.2 because the receiving end of the protocol
(that is, the relay) cannot actively participate in the protocol. This is a "store and forward" scenario
in which the sending end of the protocol stores the message frame in an intermediate store, and
later, the message frame is forwarded to, or retrieved by, the receiving end, which then extracts the
message from the message frame.
Depending on the scenario characteristics, the message properties may be sent on a per-message
basis or sent once in advance of a number of messages. The latter case uses the same session
semantic as before except that the session establishment involves participation from only one end.
Based on the preceding scenarios, the messages exchange between nodes can be classified along
the following four criteria.
Message properties can be sent on a per message basis or sent once per session, which spans
multiple messages. If many messages that have identical properties are being sent, the optimal
workflow uses the per-session scope.
The receiving end can actively participate in the protocol, or it can be a passive relay entity. If the
receiving end is active, it can negotiate certain capabilities, such as a protocol upgrade.
The logical flow of messages can be unidirectional, where only one end sends messages, or it can be
bidirectional, where both ends send messages. For unidirectional messages, the receiver may need
to acknowledge message receipt; however, the logical message flow is still in one direction.
The entire message can be sent in one message frame, or it can be split across multiple chunks.
Chunking is extremely useful when processing large messages.
Using these criteria, four communication modes are specified for the protocol to operate in. These
modes determine the pattern of messages exchanged between the nodes, and determine when the
message properties are exchanged and how the message frames are created.
12 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
The .NET Message Framing Protocol provides the capability to upgrade the underlying protocol
stream to a complementary protocol, for example, to upgrade to Secure Sockets Layer
(SSL)/Transport Layer Security (TLS). If the other end supports the complementary protocol and
goes through with the upgrade, the subsequent byte stream (messages included) use the upgraded
protocol.
The upgrade request is sent as part of message properties. Multiple upgrade negotiations can be
performed. In addition, because this is a negotiation, it requires participation from both ends, and
therefore, is available only when the communication mode is Singleton Unsized, or Duplex.
This protocol is available for use over any network transport that needs to provide message send
and receive semantics. Transports that fall in this category include TCP and named pipes.
1.5 Prerequisites/Preconditions
The protocol assumes that a transport session has been established. The management of the
transport session (that is, how and when it is established, management of idle sessions, and closure
of the transport session) is not a responsibility of the protocol. The protocol only uses the transport
session to send and receive octets.
For the Singleton Sized mode, which is described in section 1.3.2, the size of the message is not
contained as part of the message frame. The protocol assumes that the underlying transport has a
means to compute the size and relay it to the protocol.
This protocol is applicable for implementation by a transport module that wants to provide message
demarcation to higher-layer applications. Higher-layer applications can use this module to send and
receive messages.
When the communicating nodes are connected (for example, employees in the head office) or
when they are disconnected (for example, an employee working remotely).
When the communicating nodes are exchanging large messages and message-level streaming is
required to optimize the use of resources such as memory and processing.
When the communicating nodes want to upgrade the underlying transport to a complementary
protocol and exchange messages using the complementary protocol.
When a receiving node wants to bypass embedded messages that are not well formed and
process subsequent messages that are well-formed.
The protocol is not applicable for scenarios in which applications do not need message-level access
or the native message format of the underlying transport is sufficient.
13 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
Capability negotiation: The .NET Message Framing Protocol does not support negotiation of the
version, mode, upgrades, and message encoding. Instead, an implementation must be
configured with these, as described in section 3.1.3.
Extensible encoding: An implementation can opt for an extensible encoding. Vendors need to
specify the encoding as specified in [RFC2045] and covered in detail in section 2.2.3.4.2.
Upgrades: Vendors can define new protocol upgrades in addition to the ones specified in section
2.2.3.5.
Faults: An implementation can define new faults in addition to the ones specified in section
2.2.5. The fault is a URI, as defined in [RFC2396] encoding using UTF-8 encoding as specified in
[RFC2279]. Vendors define a URI namespace for their faults and that namespace is different from
the http://schemas.microsoft.com/ws/2006/05/framing/faults/ namespace used by the faults in
this protocol.
None.
14 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
2.1 Transport
This protocol is available for use over any network transport that needs to provide message send
and receive semantics. Transports that fall in this category include TCP and named pipes.
This protocol involves the exchange of a number of records. Records can be categorized as either
Property Records or Envelope Records based on their contents. The Property Records contain
message properties. The Envelope Records contain the message payload.
These records and their structure are covered in detail in subsequent sections. Each record is
prefixed with a record type, which is an octet, and MUST be set to one of the following specified
values. Values of 0x0D-0xFF for this octet are reserved for future use.
For the variable-sized records that are used by this protocol, the record needs to contain the size, in
octets, of the content. An implementation SHOULD support record sizes as large as 0xffffffff octets
(encoded size requires five octets).<2>
15 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
The following table lists the encoded sizes for the range of values of Size, which is computed as
previously explained. The network ordering of octets is top-down. For example, if the size is in the
range 0x80-0x3FFF, the network ordering of encoded size octets is (Size & 0x7F) | 0x80 followed by
Size >> 0x07.
0x00-0x7F Size
In the preceding table, "&" refers to a bitwise "and" operation, "|" refers to a bitwise "or" operation,
and ">>" refers to a right-shift operation.
The Property Records contain metadata about the protocol stream. When Property Records are
received, they set a protocol stream property and affect the interpretation of the subsequent
records within the protocol stream.
16 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
The Version Record is a Property Record used to indicate which version of the .NET Message
Framing Protocol is being used. The Version Record enables later versions of this specification to
define additional record types and associated semantics.
The data portion of a Version Record is a pair of octets that indicate the major and minor version
numbers. New sets of values for existing record types (for example, additional values of the Known
Encoding Type Record) MUST be indicated by using a different minor version value. All other types
of changes MUST be indicated with a different major version value.
The major and minor values of the Version Record denote the version of the framing format, not
that of the payload envelope.
1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
RecordType (1 byte): This octet MUST be set to 0x00 to indicate that this record is a Version
Record.
MajorVersion (1 byte): Specifies the major version of the .NET Message Framing Protocol. An
implementation that conforms to this specification MUST set this field to 0x01. A value of 0x00
is not valid for this octet, and values of 0x02–0xff are reserved for future use.
MinorVersion (1 byte): Specifies the minor version of the .NET Message Framing Protocol. An
implementation conforming to this specification MUST set this field to 0x00. The values 0x01 –
0xff for this octet are reserved for future use.<3>
The Mode Record is a Property Record that defines the communication mode for the session. The
data portion of a Mode Record is a single octet.
1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
RecordType Mode
RecordType (1 byte): This octet MUST be set to 0x01 to indicate that this is a Mode Record.
Mode (1 byte): The mode value MUST be set to one of the following values. A value of 0x00 is
not valid for this octet, and values of 0x05–0xff are reserved for future use.
Singleton- The Initiating Stream for a single one-way message or for a pair of messages in
Unsized a request-reply manner between two nodes.
0x01
Duplex The Initiating Stream for multiple bidirectional messages between two nodes.
0x02
17 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
Simplex The Initiating Stream for multiple one-way messages from a single source.
0x03
Singleton- The Initiating Stream for a single one-way message from a single source.
Sized
0x04
The Via Record is a Property Record that defines the URI for which subsequent messages are bound.
The data portion of a Via Record is of variable length.
1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
...
Via (variable)
...
RecordType (1 byte): This octet MUST be set to 0x02 to indicate that this is a Via Record.
ViaLength (variable): The value MUST be set to the size, in octets, of the Via, and encoded
based on the scheme defined in section 2.2.2. The length MUST NOT be set to 0.
Via (variable): A URI (as defined in [RFC2396] except that the "escaped" construct is never
used). The URI MUST be encoded by using UTF-8, as specified in [RFC2279].
Envelope Encoding Records are the Property Records that define the encoding format that is used to
encode the message envelope in subsequent Envelope Records. Such records come in two forms:
Known Encoding Records and Extensible Encoding Records.
In messages, this record shows as variable-sized so that it can be either of the two forms. If the
record uses Known Encoding, it is fixed-sized; otherwise, the record is variable-sized.
The Known Encoding Record indicates a previously known encoding for the subsequent Envelope
Records. The data portion of this record is a single octet.
1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
RecordType Encoding
18 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
Encoding (1 byte): This octet MUST be set to one of the following values. Values of 0x09–0xFF
are reserved for future use.<4>
0x03 UTF-8.
0x04 UTF-16.
The Extensible Encoding Record indicates an ad hoc encoding for subsequent Envelope Records. The
record data in this case is a Multipurpose Internet Mail Extensions (MIME) content type, as specified
in [RFC2045], which is encoded by using UTF-8 encoding.<5>
1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
...
Type (variable)
...
...
Parameters (variable)
19 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
Record Type (1 byte): This octet MUST be set to 0x04 to indicate that this record is an
Extensible Encoding Record.
Encoding Length (variable): The value MUST be set to the size, in octets, of the payload, and
encoded based on the scheme that is specified in section 2.2.2. The length MUST NOT be set
to 0.
Type (variable): This MUST be set to a type that is specified in [RFC2045] section 5.1.
Delimiter (1 byte): This MUST be set to the octet 0x2F (UTF-8 encoding for "/").
Subtype (variable): This MUST be set to a subtype that is specified in [RFC2045] section 5.1.
Parameters (variable): There can be one or more parameters in which the parameter
structure is defined as follows.
1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
...
Parameter Delimiter (1 byte): This MUST be set to the octet 0x3B (UTF-8 encoding for
";").
The Upgrade Request Record is a Property Record that requests a protocol upgrade.
1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
...
UpgradeProtocol (variable)
...
RecordType (1 byte): This octet MUST be set to 0x09 to indicate that this is an Upgrade
Request Record.
20 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
UpgradeProtocol (variable): The name of the protocol to upgrade to, encoded by using UTF-
8. The following table identifies some known upgrade protocol names. An implementation
SHOULD implement these upgrades and MAY define additional upgrade protocol
definitions.<6>
Protocol Meaning
The Upgrade Response Record is a Property Record that is sent in response to an Upgrade Request
Record to indicate a willingness to upgrade the protocol stream. This record has no data.
1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
RecordType
RecordType (1 byte): This octet MUST be set to 0x0A to indicate that this is an Upgrade
Response Record.
The Preamble End Record is a Property Record that is sent to indicate the end of message
properties. Envelope Records follow this record. This record has no data.
1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
RecordType
RecordType (1 byte): This octet MUST be set to 0x0C to indicate that this is a Preamble End
Record.
The Preamble Ack Record is a Property Record that is sent to indicate receipt of a Preamble End
Record and to indicate that all message properties and stream upgrades have been successfully
applied. The receiving end is now ready to receive the Envelope Records. This record has no data.
21 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
RecordType
RecordType (1 byte): This octet MUST be set to 0x0B to indicate that this is a Preamble Ack
Record.
The End Record is a Property Record that indicates that communication over a connection has
ended. This record has no data.
1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
RecordType
RecordType (1 byte): This octet MUST be set to 0x07 to indicate that this is an End Record.
An Envelope Record contains a message payload. There are two possible record types, depending on
the message transfer mode.
1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
...
Payload (variable)
...
Record Type (1 byte): This octet MUST be set to 0x06 to indicate that this is a Sized Envelope
Record.
Size (variable): The value MUST be set to the size, in octets, of the payload and encoded
based on the scheme described in section 2.2.2. The size MUST NOT be set to 0.
Payload (variable): The content of the message encoded using the encoding indicated by an
Envelope Encoding Record.
22 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
Size (variable)
...
Payload (variable)
...
Size (variable): The value MUST be set to the size, in octets, of the encoded payload, based on
the scheme described in section 2.2.2. The size MUST NOT be set to 0.
An Unsized Envelope Record contains a message that is encoded using the encoding indicated by an
Envelope Encoding Record that is broken into one or more data chunks. The end of this record is
indicated by a single 0x00 octet in place of the start of the next data chunk.
1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
...
DataChunk2 (variable)
...
Terminator
RecordType (1 byte): This octet MUST be set to 0x05 to indicate that this is an Unsized
Envelope Record.
DataChunk1 (variable): The first chunk of message data. This chunk MUST be present.
Terminator (1 byte): This field marks the end of chunks and MUST be set to 0x00.
23 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
A Fault Record notifies the sender of an error encountered while processing a message frame.
Generation of a Fault Record is informational only.
1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
...
Fault (variable)
...
RecordType (1 byte): This octet MUST be set to 0x08 to indicate that this is a Fault record.
FaultSize (variable): The value MUST be set to the size, in octets, of the fault, and encoded
based on the scheme that is described in section 2.2.2. The size MUST NOT be set to 0.
Fault (variable): A URI (as defined by [RFC2396] except that the "escaped" construct is never
used). The URI is encoded by using UTF-8. The following table defines a collection of faults. An
implementation MAY support these fault values and MAY also define new ones.<7>
For convenience, in this description the URI is broken into a namespace and fault name. The
namespace for faults in the following table is
http://schemas.microsoft.com/ws/2006/05/framing/faults/. Any additional faults that are
defined MUST NOT use this namespace.
"ContentTypeInvalid" The Envelope Encoding Record that was sent is not supported
by the endpoint.
24 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
"InvalidRecordSequence" The record sequence does not conform to the grammar that is
outlined in section 3.1.1.2.
"ServerTooBusy" The endpoint does not have sufficient resources to process the
connection.
"ViaTooLong" The receiver is enforcing a maximum Via size, and the Via
Record exceeded that quota.
To aid description, a Preamble Message is defined for an initial record sequence. The Preamble
Message may apply to multiple messages, depending on the mode specified.
1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
VersionRecord ModeRecord
...
EnvelopeEncodingRecord (variable)
...
25 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
Initiator
Receiver
An initiator initiates the protocol by sending a preamble message to the receiver. The initiator and
receiver nodes then send and receive messages using the protocol stream that connects the two
endpoints.
This section describes a conceptual model of possible data organization that an implementation
maintains to participate in this protocol. The described organization is provided to facilitate the
explanation of how the participants behave. This document does not mandate that implementations
adhere to this model as long as their external behavior is consistent with what is described in this
document.
Protocol Configuration Object (PCO) - Determines the specific transport, protocol version, mode,
Via, and message-encoding scheme to be used for this session.
Send Allowed - A Boolean value that can be set to TRUE or FALSE to indicate whether messages
can be sent on this session.
Receive Allowed - A Boolean value that can be set to TRUE or FALSE to indicate whether
messages can be received on this session.
This section describes some typical interactions between an initiator and receiver.
26 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
27 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
In the case illustrated, the initiator sends the End Record first. The protocol allows either participant
to send the End Record first. After a participant sends the End Record, the participant MUST
continue to receive messages until the session is closed.
28 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
29 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
Figure 7: Upgrades
This figure illustrates a stream upgrade that uses the Singleton Unsized mode. The figure would look
very similar if the stream upgrade used the Duplex mode.
After the protocol upgrade, subsequent protocol exchanges occur over the upgraded transport
stream until a fault occurs or an End Record is received. Although the protocol allows for multiple
upgrades, the preceding exchange illustrates a single upgrade only.
30 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
31 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
The preceding exchanges capture some of the scenarios where a Fault Record can be generated.
This section uses the Augmented Backus-Naur Form (ABNF) notation that is specified in [RFC2234]
to define the protocol stream grammar. ProtocolStream-a represents the stream of octets flowing
from the initiator to the receiver, and ProtocolStream-b represents the stream of octets flowing from
the receiver to the initiator.
ProtocolStream-a =
1*(SingletonUnsizedStream-a / DuplexStream-a /
SimplexStream-a / SingletonSizedStream-a)
ProtocolStream-b =
1*(SingletonUnsizedStream-b / DuplexStream-b)
SingletonUnsizedStream-a =
VersionRecord ModeRecordType SingletonUnsizedMode
ViaRecord EncodingRecord
*UpgradeRequest PreambleEndRecord
UnsizedEnvelopeRecord
EndRecord
DuplexStream-a =
VersionRecord ModeRecordType DuplexMode
ViaRecord EncodingRecord
*UpgradeRequest PreambleEndRecord
*SizedEnvelopeRecord
EndRecord
SimplexStream-a =
VersionRecord ModeRecordType SimplexMode
ViaRecord EncodingRecord PreambleEndRecord
*SizedEnvelopeRecord
EndRecord
SingletonSizedStream-a =
VersionRecord ModeRecordType SingletonSizedMode
ViaRecord EncodingRecord
Octets
SingletonUnsizedStream-b =
(*UpgradeResponse FaultRecord) /
(*UpgradeResponse PreambleAckRecord *1(UnsizedEnvelopeRecord)
(FaultRecord / EndRecord))
DuplexStream-b =
(*UpgradeResponse FaultRecord) /
(*UpgradeResponse PreambleAckRecord *SizedEnvelopeRecord
(FaultRecord / EndRecord))
32 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
ModeRecordType = %x01
SingletonUnsizedMode = %x01
DuplexMode = %x02
SimplexMode = %x03
SingletonSizedMode = %x04
ExtensibleEncodingRecord =
ExtensibleEncodingRecordType EncodedSize Utf8Octets
ExtensibleEncodingRecordType = %x04
UnsizedEnvelopeRecords =
UnsizedEnvelopeRecordType 1*(EncodedSize Octets) Terminator
UnsizedEnvelopeRecordType = %x05
Terminator = %x00
EndRecord = EndRecordType
EndRecordType = %x07
33 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
UpgradeResponseRecord = UpgradeResponseRecordType
UpgradeResponseRecordType = %x0A
PreambleAckRecord = PreambleAckRecordType
PreambleAckRecordType = %x0B
PreambleEndRecord = PreambleEndRecordType
PreambleEndRecordType = %x0C
Utf8Octets = 1*(Utf8Octet)
Utf8Octet =
%x00-7F /
%xC2-DF %x80-BF /
%xE0-EF %x80-BF %x80-BF /
%xF0-F4 %x80-BF %x80-BF %x80-BF
Octets = 1*(%x00-FF)
EncodedSize =
%x01-7F /
%x80-FF %x01-7F /
%x80-FF %x80-FF %x01-7F /
%x80-FF %x80-FF %x80-FF %x01-7F /
%x80-FF %x80-FF %x80-FF %x80-FF %x01-07
3.1.2 Timers
None.
3.1.3 Initialization
The PCO is made available to the participant as part of a higher-layer triggered event.
This section covers reading record types from the underlying transport. The higher-layer triggered
events and related processing are role specific.
Wherever it is mentioned that a session MUST be closed, it refers to the following actions being
taken by the participant:
Wherever it is mentioned that a Fault Record MAY (or SHOULD) be sent, it refers to the following
action being taken by the participant:
34 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
When a variable-sized record is received, the participant MUST use the following algorithm to
decode the size and read the payload. This section assumes that the record type has already been
read.
The algorithm takes as input the MaxSize, that is, the maximum supported size for this record. If
the encoded size is 0, a Fault Record MAY<8> be sent to indicate that the size is 0 and the session
MUST be closed. The decoded size is returned in little-endian format.
Figure 11: Algorithm to decode the size and read the payload
If the record type is not Fault Record, a Fault Record MAY be sent to indicate that an unexpected
record type has been received.
If the record type the participant read from the protocol stream is not Version Record, it MUST be
handled as described in section 3.1.4.2.
The participant MUST read the next two octets, which contain the major and minor versions of
the protocol being used.
If the participant does not recognize the version, a Fault Record MAY<9> be sent to indicate that
an incorrect version was specified, and the session MUST be closed.
If the record type the participant read from the protocol stream is not Mode Record, it MUST be
handled as described in section 3.1.4.2.
The participant MUST read the next octet, which contains the mode.
35 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
If the record type the participant read from the protocol stream is not a Via Record, it MUST be
handled as described in section 3.1.4.2.
The participant MUST obtain the Via, as detailed in section 3.1.4.1. The participant SHOULD use a
MaxViaSize.<11> If the Via is too long, a Fault Record MAY<12> be sent, and the session MUST
be closed.
If the participant cannot locate an endpoint that matches the Via, a Fault Record MAY<13> be
sent, and the session MUST be closed.
If the record type the participant read from the protocol stream is not Known Encoding Record or
Extensible Encoding Record, it MUST be handled as described in section 3.1.4.2.
If the record type is Known Encoding Record, the participant MUST read the next octet, which
contains the message encoding scheme.
If the record type is Extensible Encoding Record, the participant MUST obtain the encoding
scheme, as detailed in section 3.1.4.1. The participant SHOULD use a MaxContentTypeSize.<14>
If the content type is too long, a Fault Record MAY<15> be sent, and the session MUST be
closed.
If the encoding is not supported, a Fault Record MAY<16> be sent, and the session MUST be
closed.
If the record type the participant read from the protocol stream is not Upgrade Request Record, it
MUST be handled as described in section 3.1.4.2.
The participant MUST read the Upgrade Protocol, as detailed in section 3.1.4.1. The participant
SHOULD use a MaxUpgradeProtocolSize.<17> If the upgrade name is too long, a Fault Record
MAY<18> be sent, and the session MUST be closed.
If the upgrade is not supported, a Fault Record MAY<19> be sent, and the session MUST be
closed.
If the upgrade is supported, the participant MUST send an Upgrade Response Record, as
described in section 2.2.3.6. The participant MUST invoke the upgrade handler identified by the
upgrade protocol name in the Upgrade Request Record.
If the record type the participant read from the protocol stream is not Upgrade Response Record,
it MUST be handled as described in section 3.1.4.2.
If the upgrade is supported, the participant MUST invoke the appropriate upgrade handler. How
the upgrade handler achieves the upgrade is outside the scope of this document.
36 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
If the record type the participant read from the protocol stream is not Preamble End Record, it
MUST be handled as described in section 3.1.4.2.
In the case of Singleton Unsized and Duplex modes, the participant MUST send a Preamble Ack
Record as described in section 2.2.3.8.
If the record type the participant read from the protocol stream is not Preamble Ack Record, it MUST
be handled as described in section 3.1.4.2.
If the record type the participant read from the protocol stream is not Sized Envelope Record, it
MUST be handled as follows:
If the record type is End Record, the participant MUST notify the higher layer of the receipt of
End Record and set Receive Allowed to FALSE.
If the record type is a Fault Record, the session MUST be closed.
The participant MUST obtain the message as detailed in section 3.1.4.1. The participant SHOULD
use a MaxEnvelopeSize.<20>
If the message is too large, a Fault Record MAY<21> be sent, and the session MUST be closed.
If the record type the participant read from the protocol stream is not Unsized Envelope Record,
it MUST be handled as described in section 3.1.4.2.
The participant MUST then process the first chunk and any additional chunks, as described in
section 3.1.4.1, until the Terminator marker (octet 0x00) is read. To achieve streaming, reading
chunks SHOULD be correlated with consumption of chunks by the higher layer. The participant
SHOULD use a MaxChunkSize.<22> If the chunk size is too large, a Fault Record MAY<23> be
sent, and the session MUST be closed.
If the record type the participant read from the protocol stream is not End Record, it MUST be
handled as described in section 3.1.4.2.
This document assumes that the processing of received octets is deferred until initiated by a higher-
layer triggered event or a required response in the protocol. All message processing events and
sequencing rules are explained in the context of higher-layer triggered events.
37 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
None.
If at any point, the underlying network transport session is closed, the Protocol Stream is closed.
The participant MUST discard any session-related state.
3.2.2 Timers
None.
3.2.3 Initialization
The operation of the initiator is driven by the following higher-layer triggered events.
A new session state MUST be created, and session properties initialized as described in section
3.1.3.
The initiator MUST send the Preamble Message as described in section 2.2.6.
In the case of Simplex mode, the initiator MUST send the Preamble End record as described in
section 2.2.3.7.
In the case of Singleton Unsized, and Duplex modes, the initiator MUST perform the following
additional steps:
If an upgrade is required, send the Upgrade Request Record as described in section 2.2.3.5.
If an upgrade is sent, read the Upgrade Response Record as described in section 3.1.4.8.
If the mode is Duplex, the initiator MUST set Receive Allowed to TRUE.
38 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
If Send Allowed is set to FALSE, an error MUST be propagated to the higher layer, and no further
processing done. Otherwise, the initiator MUST do the following based on the mode.
The initiator MUST send an Unsized Envelope Record containing the message as described in
section 2.2.4.3.
The initiator MUST send a Sized Envelope Record containing the message as described in section
2.2.4.1.
The initiator MUST send the message and set Send Allowed to FALSE.
If Receive Allowed is set to FALSE, an error MUST be propagated to the higher layer and no further
processing done. Otherwise, the initiator MUST read a Sized Envelope Record as described in section
3.1.4.11, and propagate the contained message to a higher layer.
If mode is not Duplex or Simplex, an error MUST be propagated to the higher layer and no further
processing done. Otherwise, the initiator MUST send an End Record as described in section 2.2.3.9.
The initiator MUST set Send Allowed to FALSE.
The initiator MUST discard any session-related state and no further processing done.
None.
39 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
3.3.2 Timers
None.
3.3.3 Initialization
The operation of the receiver is driven by the following higher-layer triggered events.
A new session state MUST be created and session properties initialized as described in section 3.1.3.
The receiver MUST read the Version Record, as described in section 3.1.4.3.
The receiver MUST read the Mode Record, as described in section 3.1.4.4.
The receiver MUST read the Via Record, as described in section 3.1.4.5.
The receiver MUST read the Encoding Record, as described in section 3.1.4.6.
If the mode is Simplex, the receiver MUST read the Preamble End record as described in section
3.1.4.9.
If the mode is Singleton Unsized, or Duplex, the receiver MUST perform these additional steps:
If an upgrade is required, read the Upgrade Request Record, as described in section 3.1.4.7.
If the mode is Duplex, the receiver MUST set Send Allowed to TRUE.
If Send Allowed is set to FALSE, an error MUST be propagated to the higher layer and no further
processing done. Otherwise, the receiver MUST send a Sized Envelope Record containing the
message as described in section 2.2.4.1.
If Receive Allowed is set to FALSE, an error MUST be propagated to the higher layer and no further
processing done. Otherwise, the receiver MUST do the following based on the Mode.
40 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
The receiver MUST read an Unsized Envelope Record as described in section 3.1.4.12, and
propagate the contained message to a higher layer.
The receiver MUST read a Sized Envelope Record as described in section 3.1.4.11, and propagate
the contained message to a higher layer.
The receiver MUST read the message and propagate it to a higher layer. The receiver MUST set
Receive Allowed to FALSE.
If the mode is not Duplex, an error MUST be propagated to the higher layer and no further
processing done. Otherwise, the receiver MUST send an End Record as described in section 2.2.3.9.
The receiver MUST set Send Allowed to FALSE.
The receiver MUST discard any session-related state and no further processing done.
None.
41 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
The protocol exchange involving a Duplex Mode session is illustrated in this section. The initiator
first establishes a session with the receiver. The initiator then sends a message, and the receiver
replies. Finally, the session is closed. The Protocol Configuration Object for this session has been
configured as follows:
Transport - The specifics of network transport are excluded from this example. The following
packet captured demonstrates only the .NET Message Framing Protocol and message payload.
Version - This exchange happened over Major Version 1 and Minor Version 0 of this protocol.
42 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
43 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
44 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
None.
45 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
The information in this specification is applicable to the following Microsoft products or supplemental
software. References to product versions include released service packs:
Exceptions, if any, are noted below. If a service pack or Quick Fix Engineering (QFE) number
appears with the product version, behavior changed in that service pack or QFE. The new behavior
also applies to subsequent service packs of the product unless otherwise specified. If a product
edition appears with the product version, behavior is different in that product edition.
Unless otherwise specified, any statement of optional behavior in this specification that is prescribed
using the terms SHOULD or SHOULD NOT implies product behavior in accordance with the SHOULD
or SHOULD NOT prescription. Unless otherwise specified, the term MAY implies that the product
does not follow the prescription.
<1> Section 1.3: The Windows implementation of this protocol is exercised through the use of the
following Windows Communication Framework bindings [MSDN-WCF].
The Windows implementation of this protocol is also exercised through a custom Windows
Communication Framework binding that uses the TcpTransportBindingElement [MSDN-NETTcpBE] or
the NamedPipeTransportBindingElement [MSDN-NETNamedPipeBE], or the
MsmqTransportBindingElement [MSDN-NETMsmqBE].
The Windows implementation of this protocol is also exercised through the use of the following
Windows Web Services API channel binding [MSDN-WSCHBIND]:
46 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
<2> Section 2.2.2: The Windows implementation of the protocol that is exercised by Windows
Communication Foundation will not allow record sizes larger than 0x7fffffff octets.
<3> Section 2.2.3.1: The Windows implementation of this protocol that is exercised by Windows
Communication Foundation does not validate the value of the minor version when the value of the
major version is 0x01.
<4> Section 2.2.3.4.1: The Windows implementation of this protocol that is exercised by both
Windows Communication Framework and Windows Web Services API supports all the known
encoding schemes.
<5> Section 2.2.3.4.2: The .NET Framework 4.5 implementations of this protocol that are exercised
by Windows Communication Foundation use the Extensible Encoding Record to indicate the MIME
content type for binary message encoding compression (see [MSDN-BinaryMsgEncdngBindElmnt]).
<6> Section 2.2.3.5: The Windows implementation of this protocol that is exercised by Windows
Communication Framework supports only the SSL/TLS and Negotiate upgrade protocols.
The Windows implementation of this protocol that is exercised by Windows Web Services API
supports only the Negotiate upgrade protocol.
<7> Section 2.2.5: The Windows implementation of this protocol that is exercised by Windows
Communication Framework supports the following set of faults: ContentTypeInvalid,
ContentTypeTooLong, ConnectionDispatchFailed, EndpointNotFound, EndpointUnavailable,
MaxMessageSizeExceededFault, ServerTooBusy, ServiceActivationFailed, UnsupportedMode,
UnsupportedVersion, UpgradeInvalid, and ViaTooLong.
The Windows implementation of this protocol that is exercised by Windows Web Services API
supports the following set of faults: ContentTypeInvalid, EndpointNotFound,
MaxMessageSizeExceededFault, UnsupportedMode, and UpgradeInvalid.
<8> Section 3.1.4.1: The Windows implementation of this protocol that is exercised by both
Windows Communication Framework and Windows Web Services API does not send a Fault Record if
the size of a variable-sized record is 0.
<9> Section 3.1.4.3: The Windows implementation of this protocol that is exercised by Windows
Communication Framework sends a Fault Record (UnsupportedVersion) if an incorrect version is
specified in the received Version Record.
The Windows implementation of this protocol that is exercised by Windows Web Services API does
not send a Fault Record if an incorrect version is specified in the received Version Record.
<10> Section 3.1.4.4: The Windows implementation of this protocol that is exercised by both
Windows Communication Framework and Windows Web Services API sends a Fault Record
(UnsupportedMode) if an incorrect mode is specified in the received Mode Record.
<11> Section 3.1.4.5: The Windows implementation of this protocol that is exercised by both
Windows Communication Framework and Windows Web Services API defines a MaxViaSize of 2,048
bytes.
<12> Section 3.1.4.5: The Windows implementation of this protocol that is exercised by both
Windows Communication Framework and Windows Web Services API does not send a Fault Record if
the size of Via in the received Via Record exceeds MaxViaSize.
47 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
A Via that has a scheme equal to "net.tcp" or "net.msmq" uses the following constructions: the URI
reference is absolute, the URI contains a hierarchical part, the hierarchical part contains a network
path, the authority is a server, and the server does not include user information.
The Windows implementation of this protocol that is exercised by Windows Web Services API sends
a Via with a scheme component equal to "net.tcp" if exercised with WS_TCP_CHANNEL_BINDING
[MSDN-WSCHBIND]. A Via with a scheme equal to "net.tcp" uses the following constructions: the
URI reference is absolute, the URI contains a hierarchical part, the hierarchical part contains a
network path, the authority is a server, and the server does not include user information.
The Windows implementation of this protocol that is exercised by both Windows Communication
Framework and Windows Web Services API supports attempting to locate an endpoint for a specified
Via with a scheme component that is equal to "net.tcp" when the transport session (as described in
section 1.5) that is carrying the protocol stream is a TCP connection (as defined in [RFC793]) whose
destination address is equal to the authority of the Via; however, an authority that does not
designate a port is equivalent to an authority that uses port 808.
<14> Section 3.1.4.6: The Windows implementation of this protocol that is exercised by both
Windows Communication Framework and Windows Web Services API defines a MaxContentTypeSize
of 256 bytes.
<15> Section 3.1.4.6: The Windows implementation of this protocol that is exercised by both
Windows Communication Framework and Windows Web Services API does not send a Fault Record if
the size of the extensible encoding in the received Extensible Encoding Record exceeds
MaxContentTypeSize.
<16> Section 3.1.4.6: The Windows implementation of this protocol that is exercised by both
Windows Communication Framework and Windows Web Services API sends a Fault Record
(ContentTypeInvalid) if an unsupported content type is specified in the received Encoding Record.
<17> Section 3.1.4.7: The Windows implementation of this protocol exercised by both Windows
Communication Framework and Windows Web Services API defines a MaxUpgradeProtocolSize of
256 bytes.
<18> Section 3.1.4.7: The Windows implementation of this protocol exercised by both Windows
Communication Framework and Windows Web Services API does not send a Fault Record if the size
of an upgrade protocol name in the received Upgrade Request Record exceeds
MaxUpgradeProtocolSize.
48 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
<20> Section 3.1.4.11: The Windows implementation of this protocol that is exercised by both
Windows Communication Framework and Windows Web Services uses a MaxEnvelopeSize as
configured externally.
<21> Section 3.1.4.11: The Windows implementation of this protocol that is exercised by both
Windows Communication Framework and Windows Web Services API sends a Fault Record
(MaxMessageSizeExceededFault) if the size of the received Sized Envelope Record exceeds
MaxEnvelopeSize but is not greater than 0xffffffff. No Fault Record is sent if the size of the received
Sized Envelope Record exceeds 0xffffffff.
<22> Section 3.1.4.12: The Windows implementation of this protocol that is exercised by Windows
Communication Framework defines a MaxChunkSize of 0xfffffffa.
<23> Section 3.1.4.12: The Windows implementation of this protocol that is exercised by Windows
Communication Framework does not send a Fault Record if the size of a chunk in the received
Unsized Envelope Record exceeds MaxChunkSize.
49 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
50 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
51 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
52 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol
Timer events
initiator (section 3.1.6 38, section 3.2.6 39)
receiver (section 3.1.6 38, section 3.3.6 41)
Timers
initiator (section 3.1.2 34, section 3.2.2 38)
receiver (section 3.1.2 34, section 3.3.2 40)
Tracking changes 50
Transport 15
Transport session - underlying - closed 38
Triggered events - higher-layer
initiator
end record - send 39
message
receive 39
send 39
overview (section 3.1.4 34, section 3.2.4 38)
preamble - send 38
session
closed 39
initialized 38
receiver
end record - send 41
message
receive 40
send 40
overview (section 3.1.4 34, section 3.3.4 40)
preamble - receive 40
session
closed 41
initialized 40
53 / 53
[MC-NMF] — v20140502
.NET Message Framing Protocol