Protocol Negotiation in CIFS
- A Smattering of SMB Dialects
- Greetings: The NEGOTIATE PROTOCOL REQUEST
- Gesundheit: The NEGOTIATE PROTOCOL RESPONSE
- Are We There Yet?
I don’t have an accent.
—Oh yes you do.
CIFS is a very rich and varied protocol suite, a fact that is evident in the number of SMB dialects that exist. Five are listed in the X/Open SMB protocol specification, and the SNIA doc — published ten years later — lists eleven. That’s a bigbunch, and they probably missed a few. Each new dialect may add new SMBs, deprecate old ones, or extend existing ones. As if that were not enough, implementations introduce subtle variations within dialects.
All that in mind, our goal in this section will be to provide an overview of the available dialects, cover the workings of the NEGOTIATE PROTOCOL SMB exchange, and take a preliminary peek at some of the concepts that we have yet to consider (things like virtual circuits and authentication). For the most part, the examples and discussion will be based on the “NT LM 0.12” dialect. The majority of the servers currently available support some variation of NT LM 0.12, and at least one client implementation (jCIFS) has managed to get by without supporting any others. Server writers should be warned, however, that there really are a lot of clients still around that use older calls. Even new clients will use older calls, simply because of the difficulty of acquiring reliable documentation on the newer stuff.
13.1 A Smattering of SMB Dialects
In keeping with tradition, the list of dialects is presented as a table with the dialect name in the left-hand column and a short description in the right, ordered from oldest to newest. Most of the references to these dialects seem to do it this way. Our list is not quite as complete as you might find elsewhere. The aim here is to highlight some of the better-known examples in order to provide a bit of context for the examination of the SMB_COM_NEGOTIATE message.
Where relevant, important differences between dialects will be noted. It would be very difficult, however, to try to document all of the features of each dialect and all of the changes between them. If you really, really need to know more (which is likely, if you are working on server code) see the SNIA doc, the X/Open doc, the expired IETF drafts, and the other old Microsoft documentation that is still freely available from their FTP server.1
SMB dialects |
|
---|---|
Dialect Identifier |
Notes |
PC NETWORK PROGRAM 1.0 |
Also known as the Core Protocol. This is the original stuff, as documented in COREP.TXT. According to ancient lore, this dialect is sometimes also identified by the string “PCLAN1.0”. |
MICROSOFT NETWORKS 1.03 |
This is the Core Plus Protocol. It extends a few Core Protocol SMB commands, and adds a few new ones. |
MICROSOFT NETWORKS 3.0 |
Known as the Extended 1.0 Protocol or LAN Manager 1.0. This dialect was created when IBM and Microsoft were working together on OS/2. This particular variant was designed for DOS clients, which understood a narrower set of error codes than OS/2. |
LANMAN1.0 |
Identical to the MICROSOFT NETWORKS 3.0 dialect except that it was intended for use with OS/2 clients, so a larger set of error codes was available. OS/2 and DOS both expect that the STATUS field will be in the DOS-style ErrorClass/ErrorCode format. Again, this dialect is also known as LAN Manager 1.0 or as the Extended 1.0 Protocol. |
LM1.2X002 |
Called the Extended 2.0 Protocol; also known as LAN Manager 2.0. This dialect represents OS/2 LANMAN version 2.0, and it introduces a few new SMBs. The identifier for the DOS version of this dialect is “DOS LM1.2X002”. As before, the key difference between the DOS and OS/2 dialects is simply that the OS/2 version provides a larger set of error codes. |
LANMAN2.1 |
Called the LAN Manager 2.1 dialect (no surprise there), this version is documented in a paper titled Microsoft Networks SMB File Sharing Protocol Extensions, Document Version 3.4. You can find it by searching the web for a file named “SMB-LM21.DOC”. You will likely need a conversion tool of some sort in order to read the file, as it is encoded in an outdated form of a proprietary Microsoft format (it’s a word-processing file). The cool thing about the SMB-LM21.DOC document is that instead of explaining how LANMAN2.1 works it describes how LANMAN2.1 differs from its predecessor, LANMAN2.0. That’s useful for people who want to know how the protocol has evolved. |
Samba |
You may see this dialect listed in the protocol negotiation request coming from a Samba-based client such as smbclient, KDE Konqueror (which uses Samba’s libsmbclient library), or the Linux SMBFS implementation. No one from the Samba Team seems to remember when, or why, this was added. It doesn’t appear to be used any more (if, indeed, it ever was). |
NT LM 0.12 |
This dialect, sometimes called NT LANMAN, was developed for use with Windows NT. All of the Windows 9x clients also claim to speak it, as do Windows 2000 and XP. As mentioned above, this is currently the most widely supported dialect. It is, quite possibly, also the sloppiest with all sorts of variations and differing implementations. |
CIFS |
Following the release of the IETF CIFS protocol drafts, many people thought that Microsoft would produce a “CIFS” dialect, and many documents refer to it. No such beast has actually materialized, however. Maybe that’s a good thing. |
Section 3.16 of the SNIA CIFS Technical Reference, V1.0 provides a list of of SMB message types categorized by the dialect in which they were introduced. There is also a slightly more complete list of dialects in Section 5.4 of the SNIA doc.