github.com/hashicorp/yamux源码解析
|
há 10 anos atrás | |
---|---|---|
.gitignore | há 10 anos atrás | |
LICENSE | há 10 anos atrás | |
README.md | há 10 anos atrás | |
addr.go | há 10 anos atrás | |
const.go | há 10 anos atrás | |
const_test.go | há 10 anos atrás | |
mux.go | há 10 anos atrás | |
session.go | há 10 anos atrás | |
session_test.go | há 10 anos atrás | |
stream.go | há 10 anos atrás | |
util.go | há 10 anos atrás | |
util_test.go | há 10 anos atrás |
Yamux or Yet another Mux (Multiplexer) is another multiplexing library. It relies on an underlying connection to provide reliability and ordering (such as TCP or Unix domain sockets), and provides stream-oriented multiplexing. It is inspired by SPDY but is not interoperable with it.
Yamux features include:
Yamux uses a streaming connection underneath, but imposes a message framing so that it can be shared between many logical streams. Each frame contains a header like:
This means that each header has a 12 byte overhead. All fields are encoded in network order (big endian). Each field is described below:
The version field is used for future backwards compatibily. At the current time, the field is always set to 0, to indicate the initial version.
The type field is used to switch the frame message type. The following message types are supported:
0x0 Data - Used to transmit data. May transmit zero length payloads depending on the flags.
0x1 Window Update - Used to updated the senders receive window size. This is used to implement per-session flow control.
0x2 Ping - Used to measure RTT. It can also be used to heart-beat and do keep-alives over TCP.
0x3 Go Away - Used to close a session.
The flags field is used to provide additional information related to the message type. The following flags are supported:
0x1 SYN - Signals the start of a new stream. May be sent with a data or window update message. Also sent with a ping to indicate outbound.
0x2 ACK - Acknowledges the start of a new stream. May be sent with a data or window update message. Also sent with a ping to indicate response.
0x4 FIN - Performs a half-close of a new stream. May be sent with a data message or window update.
0x8 RST - Reset a stream immediately. Sent with a data message only.
0x 16 LZW - Indicates the payload is LZW compressed. Sent with a data message only.
The StreamID field is used to identify the logical stream the frame is addressing. The client side should use odd ID's, and the server even. This prevents any collisions. Additionally, the 0 ID is reserved to represent the session.
Both Ping and Go Away messages should always use the 0 StreamID.
A Window Update may also provide StreamID 0, meaning the window for the entire session is being modified.
The meaning of the length field depends on the message type:
There is no explicit connection setup, as Yamux relies on an underlying transport to be provided. However, there is a distinction between client and server side of the connection.
To open a stream, an initial data or window update frame is sent with a new StreamID. The SYN flag should be set to signal a new stream.
The receiver must then reply with either a data or window update frame with the StreamID along with the ACK flag to accept the stream or with the RST flag to reject the stream.
To close a stream, either side sends a data or window update frame along with the FIN flag. This does a half-close indicating the sender will send no further data.
Once both sides have closed the connection, the stream is closed.
Alternatively, if an error occurs, the RST flag can be used to hard close a stream immediately.
When Yamux is initially started there is a 2MB window size for the session. Additionally, each new stream has a 256KB window size.
To prevent the session or streams from stalling, window update frames should be sent regularly. Yamux can be configured to provide a limit for windows sizes.
Both sides should track the number of bytes sent in Data frames only, as only they are tracked as part of the window size.
When a session is being terminated, the Go Away message should be sent. The Length should be set to one of the following to provide an error code: