2.1.3 Virtual Circuits

In CIFS,
a virtual circuit (VC)
represents a transport-level connection between a client and a server. VCs are
of use in situations in which multiple physical connections are being combined
to provide improved overall bandwidth for an SMB connection. For
example, VCs make it possible to multiplex SMB messages from a single SMB
connection over multiple dial-up modem connections in order to increase
throughput. Virtual circuits are rarely used over connection-oriented
transports such as NBT; they are typically associated with connectionless
transports such as Direct-hosting IPX. VC multiplexing is performed at
the command level, with the exception of the SMB_COM_READ_MPX and
SMB_COM_WRITE_MPX commands, which are specifically designed to be multiplexed.

VCs are established using the SMB_COM_SESSION_SETUP_ANDX
command, and are combined based upon the SessionKey provided in the
SMB_COM_NEGOTIATE response.<7> Every VC created between a client and server
pair using the same SessionKey is considered to be part of the same SMB
connection. Each VC thus created MUST have a unique VcNumber in the
SMB_COM_SESSION_SETUP_ANDX request that is used to establish it. The first VC
created SHOULD have a VcNumber of zero (0). The implementation-defined
maximum number of virtual circuits that the client can establish per SMB
connection is indicated by the MaxNumberVcs field in the server's
SMB_COM_NEGOTIATE response.<8>

A VcNumber of zero (0) has special significance. It
is possible for a connectionless transport to not provide any indication of
failure when a client fails or is reset. A virtual circuit with a VcNumber
of zero (0), regardless of the SessionKey value, is defined to indicate
to the server that the client has abandoned all previous virtual circuits and
that the server MUST close those VCs as well, ensuring proper cleanup of
resources.<9>
This behavior can have unintended consequences in situations where separate
applications running on the same client establish individual connections to the
same server, or in cases in which multiple clients connect to a single server
through a Network Address
Translation (NAT) device (see [KB301673] for a
detailed explanation). In these situations, each connection attempt from the
same client (or NAT device) can cause all others from that client to be
disconnected. To avoid this, clients can use a VcNumber of greater than
or equal to one, or servers MAY be configured to bypass special processing of VcNumber
zero over connection-oriented transports.

Show:
Inherited
Protected

Was this page helpful?

Your feedback about this content is important.Let us know what you think.