





Network Working Group                               SNMPv2 Working Group
Request for Comments: 1901                                       J. Case
Category: Experimental                               SNMP Research, Inc.
                                                           K. McCloghrie
                                                     Cisco Systems, Inc.
                                                                 M. Rose
                                            Dover Beach Consulting, Inc.
                                                           S. Waldbusser
                                          International Network Services
                                                            January 1996


                 Introduction to Community-based SNMPv2

Status of this Memo

   This document specifies an Experimental protocol for the Internet
   community.  This memo does not specify an Internet standard of any
   kind.  Discussion and suggestions for improvement are requested.
   Distribution of this memo is unlimited.

Table of Contents

   1. Introduction ................................................    1
   2. Components of the SNMPv2 Framework ..........................    2
   2.1 Structure of Management Information ........................    2
   2.2 Textual Conventions ........................................    3
   2.3 Conformance Statements .....................................    3
   2.4 Protocol Operations ........................................    3
   2.5 Transport Mappings .........................................    4
   2.6 Protocol Instrumentation ...................................    4
   3. The Community-based Administrative Framework ................    4
   4. Security Considerations .....................................    5
   5. Editor's Address ............................................    6
   6. Acknowledgements ............................................    6
   7. References ..................................................    7

1.  Introduction

   The purpose of this document is to define the Community-based
   Administrative Framework for the SNMP version 2 framework (SNMPv2).
   The SNMPv2 framework is fully described in [1-6].  This framework is
   derived from the original Internet-standard Network Management
   Framework (SNMPv1), which consists of these three documents:

      STD 16, RFC 1155 [7] which defines the Structure of Management
      Information (SMI), the mechanisms used for describing and naming
      objects for the purpose of management.



SNMPv2 Working Group          Experimental                      [Page 1]

RFC 1901         Introduction to Community-based SNMPv2     January 1996


      STD 16, RFC 1212 [8] which defines a more concise description
      mechanism, which is wholly consistent with the SMI.

      STD 15, RFC 1157 [9] which defines the Simple Network Management
      Protocol (SNMP), the protocol used for network access to managed
      objects.

   For information on coexistence between SNMPv1 and SNMPv2, consult
   [10].

2.  Components of the SNMPv2 Framework

   A management system contains:  several (potentially many) nodes, each
   with a processing entity, termed an agent, which has access to
   management instrumentation; at least one management station; and, a
   management protocol, used to convey management information between
   the agents and management stations.  Operations of the protocol are
   carried out under an administrative framework which defines
   authentication, authorization, access control, and privacy policies.

   Management stations execute management applications which monitor and
   control managed elements.  Managed elements are devices such as
   hosts, routers, terminal servers, etc., which are monitored and
   controlled via access to their management information.

2.1.  Structure of Management Information

   Management information is viewed as a collection of managed objects,
   residing in a virtual information store, termed the Management
   Information Base (MIB).  Collections of related objects are defined
   in MIB modules.  These modules are written using a subset of OSI's
   Abstract Syntax Notation One (ASN.1) [11].  It is the purpose of the
   Structure of Management Information for SNMPv2 document [1] to define
   that subset.

   The SMI is divided into three parts:  module definitions, object
   definitions, and, trap definitions.

   (1)  Module definitions are used when describing information modules.
        An ASN.1 macro, MODULE-IDENTITY, is used to concisely convey the
        semantics of an information module.

   (2)  Object definitions are used when describing managed objects.  An
        ASN.1 macro, OBJECT-TYPE, is used to concisely convey the syntax
        and semantics of a managed object.

   (3)  Notification definitions are used when describing unsolicited
        transmissions of management information.  An ASN.1 macro,



SNMPv2 Working Group          Experimental                      [Page 2]

RFC 1901         Introduction to Community-based SNMPv2     January 1996


        NOTIFICATION-TYPE, is used to concisely convey the syntax and
        semantics of a notification.

2.2.  Textual Conventions

   When designing a MIB module, it is often useful to define new types
   similar to those defined in the SMI.  In comparison to a type defined
   in the SMI, each of these new types has a different name, a similar
   syntax, but a more precise semantics.  These newly defined types are
   termed textual conventions, and are used for the convenience of
   humans reading the MIB module.  It is the purpose of the Textual
   Conventions for SNMPv2 document [2] to define the initial set of
   textual conventions available to all MIB modules.

   Objects defined using a textual convention are always encoded by
   means of the rules that define their primitive type.  However,
   textual conventions often have special semantics associated with
   them.  As such, an ASN.1 macro, TEXTUAL-CONVENTION, is used to
   concisely convey the syntax and semantics of a textual convention.

2.3.  Conformance Statements

   It may be useful to define the acceptable lower-bounds of
   implementation, along with the actual level of implementation
   achieved.  It is the purpose of the Conformance Statements for SNMPv2
   document [3] to define the notation used for these purposes.  There
   are two kinds of notations:

   (1)  Compliance statements are used when describing requirements for
        agents with respect to object definitions.  An ASN.1 macro,
        MODULE-COMPLIANCE, is used to concisely convey such requirements.

   (2)  Capability statements are used when describing capabilities of
        agents with respect to object definitions.  An ASN.1 macro, AGENT-
        CAPABILITIES, is used to concisely convey such capabilities.

   Finally, collections of related objects are grouped together to form
   a unit of conformance.  An ASN.1 macro, OBJECT-GROUP, is used to
   concisely convey the syntax and semantics of a group.

2.4.  Protocol Operations

   The management protocol provides for the exchange of messages which
   convey management information between the agents and the management
   stations.  The form of these messages is a message "wrapper" which
   encapsulates a Protocol Data Unit (PDU).





SNMPv2 Working Group          Experimental                      [Page 3]

RFC 1901         Introduction to Community-based SNMPv2     January 1996


   It is the purpose of the Protocol Operations for SNMPv2 document [4]
   to define the operations of the protocol with respect to the sending
   and receiving of the PDUs.

2.5.  Transport Mappings

   The management protocol, version 2 of the Simple Network Management
   Protocol, may be used over a variety of protocol suites.  It is the
   purpose of the Transport Mappings for SNMPv2 document [5] to define
   how the SNMPv2 maps onto an initial set of transport domains.  Other
   mappings may be defined in the future.

   Although several mappings are defined, the mapping onto UDP is the
   preferred mapping.  As such, to provide for the greatest level of
   interoperability, systems which choose to deploy other mappings
   should also provide for proxy service to the UDP mapping.

2.6.  Protocol Instrumentation

   It is the purpose of the Management Information Base for SNMPv2
   document [6] to define managed objects which describe the behavior of
   a SNMPv2 entity.

3.  The Community-based Administrative Framework

   It is the purpose of an administrative framework to define an
   infrastructure through which effective management can be realized in
   a variety of configurations and environments.  Specified as a part
   of, or as extensions of, an administrative framework are security
   mechanisms used to achieve an administratively-defined level of
   security for protocol interactions.

   The administrative framework for SNMPv2 identified in this document
   is the same framework as was defined for SNMPv1 [9].  This
   administrative framework associates each message with a "community"
   as defined in [9].  Use of this administrative framework with SNMP
   Version 2 is commonly known as "Community-based SNMPv2 (SNMPv2C)."

   Specifically, Section 3.2.5 of [9] defines the concept of a
   community, and Section 4.1 of [9] defines the Elements of Procedure
   for generating and receiving messages.  The following updates apply:

   (1)  The types of access defined in Section 3.2.5 of [9] are updated
        by [1].

   (2)  The Elements of Procedure defined in Section 4.1 of [9] are
        updated with the additional requirement of incrementing the
        relevant statistics counter as defined in [6].



SNMPv2 Working Group          Experimental                      [Page 4]

RFC 1901         Introduction to Community-based SNMPv2     January 1996


   (3)  The requirement in the Elements of Procedure in Section 4.1 of
        [9] that the "the source transport address that a response
        message is sent from shall be identical to the destination
        transport address that the original request message was sent to"
        is deleted, i.e., the source transport address of a response
        message can be any transport address belonging to the agent.

   The form of a message is also taken from [9], with the exception that
   a new version number is used in the message "wrapper".  Use of a new
   version number is necessary because of SNMPv2's new PDU types [4],
   error codes [4], etc.  With this one change, the wrapper becomes:

    COMMUNITY-BASED-SNMPv2 DEFINITIONS ::= BEGIN

    -- top-level message

        Message ::=
                SEQUENCE {
                     version
                        INTEGER {
                            version(1)  -- modified from RFC 1157
                        },

                    community           -- community name
                        OCTET STRING,

                    data                -- PDUs as defined in [4]
                        ANY
                }
        }

    END

   Note that with this administrative framework, the
   'authorizationError(16)' value defined for the error-status component
   of an SNMPv2 PDU [4] is unused.  It may, however, be used with future
   administrative frameworks.

4.  Security Considerations

   Security issues are not discussed in this memo.










SNMPv2 Working Group          Experimental                      [Page 5]

RFC 1901         Introduction to Community-based SNMPv2     January 1996


5.  Editor's Address

   Keith McCloghrie
   Cisco Systems, Inc.
   170 West Tasman Drive
   San Jose, CA  95134-1706
   US

   Phone: +1 408 526 5260
   EMail: kzm@cisco.com

6.  Acknowledgements

   This document is the result of significant work by the four major
   contributors:

   Jeffrey D. Case (SNMP Research, case@snmp.com)
   Keith McCloghrie (Cisco Systems, kzm@cisco.com)
   Marshall T. Rose (Dover Beach Consulting, mrose@dbc.mtview.ca.us)
   Steven Waldbusser (International Network Services, stevew@uni.ins.com)

   In addition, the contributions of the SNMPv2 Working Group are
   acknowledged.  In particular, a special thanks is extended for the
   contributions of:

     Alexander I. Alten (Novell)
     Dave Arneson (Cabletron)
     Uri Blumenthal (IBM)
     Doug Book (Chipcom)
     Kim Curran (Bell-Northern Research)
     Jim Galvin (Trusted Information Systems)
     Maria Greene (Ascom Timeplex)
     Iain Hanson (Digital)
     Dave Harrington (Cabletron)
     Nguyen Hien (IBM)
     Jeff Johnson (Cisco Systems)
     Michael Kornegay (Object Quest)
     Deirdre Kostick (AT&T Bell Labs)
     David Levi (SNMP Research)
     Daniel Mahoney (Cabletron)
     Bob Natale (ACE*COMM)
     Brian O'Keefe (Hewlett Packard)
     Andrew Pearson (SNMP Research)
     Dave Perkins (Peer Networks)
     Randy Presuhn (Peer Networks)
     Aleksey Romanov (Quality Quorum)
     Shawn Routhier (Epilogue)
     Jon Saperia (BGS Systems)



SNMPv2 Working Group          Experimental                      [Page 6]

RFC 1901         Introduction to Community-based SNMPv2     January 1996


     Bob Stewart (Cisco Systems, bstewart@cisco.com), chair
     Kaj Tesink (Bellcore)
     Glenn Waters (Bell-Northern Research)
     Bert Wijnen (IBM)

7.  References

[1]  SNMPv2 Working Group, Case, J., McCloghrie, K., Rose, M., and
     S. Waldbusser, "Structure of Management Information for Version 2
     of the Simple Network Management Protocol (SNMPv2)", RFC 1902,
     January 1996.

[2]  SNMPv2 Working Group, Case, J., McCloghrie, K., Rose, M., and
     S. Waldbusser, "Textual Conventions for Version 2 of the Simple
     Network Management Protocol (SNMPv2)", RFC 1903, January 1996.

[3]  SNMPv2 Working Group, Case, J., McCloghrie, K., Rose, M., and
     S. Waldbusser, "Conformance Statements for Version 2 of the Simple
     Network Management Protocol (SNMPv2)", RFC 1904, January 1996.

[4]  SNMPv2 Working Group, Case, J., McCloghrie, K., Rose, M., and
     S. Waldbusser, "Protocol Operations for Version 2 of the Simple
     Network Management Protocol (SNMPv2)", RFC 1905, January 1996.

[5]  SNMPv2 Working Group, Case, J., McCloghrie, K., Rose, M., and
     S. Waldbusser, "Transport Mappings for Version 2 of the Simple
     Network Management Protocol (SNMPv2)", RFC 1906, January 1996.

[6]  SNMPv2 Working Group, Case, J., McCloghrie, K., Rose, M., and
     S. Waldbusser, "Management Information Base for Version 2 of the
     Simple Network Management Protocol (SNMPv2)", RFC 1907,
     January 1996.

[7]  Rose, M., and K. McCloghrie, "Structure and Identification of
     Management Information for TCP/IP-based internets", STD 16, RFC
     1155, May 1990.

[8]  Rose, M., and K. McCloghrie, "Concise MIB Definitions", STD 16,
     RFC 1212, March 1991.

[9]  Case, J., Fedor, M., Schoffstall, M., Davin, J., "Simple Network
     Management Protocol", STD 15, RFC 1157, SNMP Research, Performance
     Systems International, MIT Laboratory for Computer Science, May
     1990.







SNMPv2 Working Group          Experimental                      [Page 7]

RFC 1901         Introduction to Community-based SNMPv2     January 1996


[10] SNMPv2 Working Group, Case, J., McCloghrie, K., Rose, M., and
     S. Waldbusser, "Coexistence between Version 1 and Version 2 of the
     Internet-standard Network Management Framework", RFC 1908,
     January 1996.

[11] Information processing systems - Open Systems Interconnection -
     Specification of Abstract Syntax Notation One (ASN.1),
     International Organization for Standardization.  International
     Standard 8824, (December, 1987).










































SNMPv2 Working Group          Experimental                      [Page 8]

