RFC 1645

Simple Network Paging Protocol - Version 2

πŸ“… published July 1994, from ietf

Status of This Memo ✨

Okay so this bit is the legal-ish fine print πŸ’… This memo is Informational, which means it's sharing info with the Internet community. It is NOT a formal Internet standard of any kind, and it can be shared around as much as you want, no limits πŸ¦‹

Abstract 🌸

Okay bestie, this RFC is all about a simple way to send pages (one-way!) to radio paging terminals, whether they're alphanumeric or numeric πŸ“Ÿ Gateways that support this protocol, plus SMTP, have been running for several months for nationwide paging and messaging, and it's giving real-world proof πŸ”₯ Email filters and SNPP client software for Unix and Windows are free too, no cap πŸ’– For more info, you contact the author.

Earlier versions of this spec were reviewed by IESG members and the "822 Extensions" Working Group. They wanted a different strategy instead, which is covered under "Relationship to Other IETF Work" further down 🧚

1. Introduction πŸŽ€

Beepers are as much a part of computer nerdom as X-terminals, maybe even more, unfortunately πŸ’€ The goal of the Simple Network Paging Protocol is to give everyone a standard way to deliver pages to individual paging terminals. The big win is that you don't need modems and phone lines just to send alphanumeric pages, and it's way easier to deliver pages to terminals in other cities or countries 🌈 Automatic page delivery should also be a lot more simplified, which is so relatable 🫢

2. System Philosophy πŸ¦‹

Radio paging gets taken for granted, because pagers are everywhere and everyone uses them πŸ“Ÿ But the actual delivery of a page, especially in wider-area paging, is a whole process and it's kinda complicated 😭 When a user starts a page, either by dialing a number on a telephone or typing an alphanumeric page into some input device, the page has to end up at some paging terminal, somewhere. Most of the time, that delivery happens using TAP (Telocator Alphanumeric input Protocol, also known as IXO). Honestly, TAP can get a little convoluted, with older-style ASCII control characters and a non-standard checksumming routine to help validate the data πŸ™ˆ

TAP is used all over the industry, but there are plans to move to a more flexible "standard" protocol called TME (Telocator Message Entry Protocol). The level two enhancements to SNPP (described below) are meant to work with this upcoming standard ✨

Even with all that complexity (or the lack of standardization, lol), the final user function is actually super simple: deliver a page from point-of-origin to someone's beeper πŸ’… That's the simple, real-time function the base protocol is trying to handle. Validation of the paging information is left completely up to the paging terminal, which makes an SNPP gateway a direct "shim" between a paging terminal and the Internet πŸ”₯

3. Why not just use Email and SMTP? πŸ™‹β€β™€οΈ

Email is pretty reliable, but it's not always timely, and this is giving a perfect example 😭 Picture this: deferred messaging happens when a gateway is down. Mary Ghoti (fish@hugecompany.org) sends a message to Zaphod Beeblebrox's beeper (5551212@pager.pagingcompany.com). Hugecompany's gateway to the Internet is down, so Mary's message gets deferred. Mary doesn't get notified about the delay, because her message hasn't actually failed to reach its destination. Three hours later, the link is back, and as soon as sendmail wakes up, the message goes out. Obviously, if Mary's page was about a meeting that was supposed to happen 2 hours ago, Mary and Zaphod have some minor admin stuff to sort out πŸ’€

But if Mary had used her SNPP client (or just telnetted to the SNPP gateway), she would've instantly found out about the network problem 🫠 She could've switched to plan "B" and called Zaphod's pager on the phone to ring him that way πŸ“ž

The real difference here isn't page delivery, it's getting an immediate heads-up that something is wrong with your message 🚨 Standard email and SMTP are pretty reliable in most cases, but they can't be positively guaranteed between all nodes at all times, so they're less ideal for emergency or urgent paging. That inability to guarantee delivery could, rightly or wrongly, leave the service provider in an awkward spot with a client who just got their emergency page six hours too late 😭

Another perk of using a separate protocol for paging is that the sender gets absolute flexibility over what gets sent to the pager πŸ’– In the paging world, messages go to alphanumeric pagers, so it's less desirable to send the recipient general header lines from a standard SMTP message. Most of that info is useless or redundant, and it wastes precious RF bandwidth πŸ₯²

So when you're implementing an SMTP gateway, the service provider should choose to parse out the info that's needed (like the sender, and maybe the subject) to get the most out of the transmission. Parsing generally means the message originator has less control over content and format. SNPP gives you a clean, effective way to send a message, exactly as written, to the recipient's pager πŸŽ€

And honestly, SNPP is way simpler for manual telnet sessions than trying to hand-hack a mail message into a gateway πŸ™ˆ

4. The SNPP Protocol ✨

The SNPP protocol is a sequence of commands and replies, built on the same philosophy as lots of other Internet protocols in use today 🧚 It has several input commands (the first 4 characters of each are significant) that trigger different server responses, and those responses fall into four categories:

 2xx - Successful, continue
 3xx - Begin DATA input (see "DATA" command)
 4xx - Failed with connection terminated
 5xx - Failed, but continue session

The first character of every server response code is a digit that tells you the category of response. The text after the code can be changed to suit individual applications πŸ’…

The session interaction is actually really simple (hence the name!) πŸ’– The client starts the connection with the listening server. Once the connection is open, the server sends a "220" level message to say it's ready to accept SNPP commands. The client passes along the pager ID info and a message, then issues a "SEND" command. The server then feeds the info to the paging terminal, collects a response, and reports success or failure back to the client πŸ”₯

4.1 Examples of SNPP Transactions πŸ¦‹

Here are some examples of client-server communication using SNPP πŸ‘‘

4.1.1 A Typical Level One Connection 🌸

          Client                         Server

  Open Connection               -->
                                <--  220 SNPP Gateway Ready
  PAGE 5551212                  -->
                                <--  250 Pager ID Accepted
  MESS Your network is hosed    -->
                                <--  250 Message OK
  SEND                          -->
                                <--  250 Message Sent OK
  QUIT                          -->
                                <--  221 OK, Goodbye

4.1.2 A Typical Level Two, Multiple Transaction πŸ’œ

This example shows one message sent to two pagers 🫢 With this level of protocol, you can pick pager-specific options for each receiver by setting the option before you issue the "PAGEr" command. In this example, the first pager gets an alternate coverage area, and the second pager gets delayed messaging 😭

          Client                         Server

  Open Connection               -->
                                <--  220 SNPP Server Ready
  COVE 2                        -->
                                <--  250 Alternate Area Selected
  PAGE 5551212 FOOBAR           -->
                                <--  250 Pager ID Accepted
  HOLD 9401152300 -0600         -->
                                <--  250 Delayed Message OK
  PAGE 5552323 XYZZY            -->
                                <--  250 Pager ID Accepted
  SUBJ Seattle Meeting          -->
                                <--  250 Message Subject OK
  DATA                          -->
                                <--  354 Begin Input, End With '.'
  Please meet me tomorrow at    -->
  the Seattle office            -->
                                <--  250 DATA Accepted

  SEND                          -->
                                <--  250 Message Sent OK
  QUIT                          -->
                                <--  221 OK, Goodbye

4.2 Level 1 Commands πŸ“

Level one commands are the minimum implementation of the protocol, so they're the basic core 🧚 This set of commands can be used with either TAP/IXO or TME for message delivery to the paging terminal.

4.2.1 PAGEr <Pager ID> 🌈

The PAGEr command submits a pager ID (PID) number, to be included in the next messaging transaction. The PID has to live in the paging terminal and be validated there. Limited validation can happen on the server too (like checking that it's all numeric, or the ID length), or validation can be left to the terminal when the page is actually sent πŸ’…

If you're implementing SNPP, the user can choose to support multiple recipients per message, but watch out, because validating before sending isn't possible with TAP/IXO (and it's not an official option in the current TME spec) πŸ™ˆ That means that to validate a PID, you basically have to generate a message to the pager, and then the terminal responds positively or negatively. When one PID in a sequence fails, showing that failure in a "standard format" can be a real challenge 😭

These are the possible responses from the SNPP server, with suggested text, in response to a PAGEr command:

250 Pager ID Accepted
421 Too Many Errors, Goodbye (terminate connection)
421 Gateway Service Unavailable (terminate connection)
550 Error, Invalid Pager ID
554 Error, failed (technical reason)

The level 2 enhancements affect the PAGEr command too, so check out the right section for the details πŸ¦‹

4.2.2 MESSage <Alpha or Numeric Message> πŸ’–

The MESSage command puts a single-line message into the gateway πŸ“Ÿ Limited validation of the message can happen on the SNPP server (like checking the length), but type-of-message validation should be done by the paging terminal. If you duplicate the MESSage command before SENDing the message, you should get a "503 ERROR, Message Already Entered" message, and the user can keep going πŸ™Œ

These are the possible responses from the SNPP server, with suggested text, in response to a MESSage command:

250 Message OK
421 Too Many Errors, Goodbye (terminate connection)
421 Gateway Service Unavailable (terminate connection)
503 ERROR, Message Already Entered
550 ERROR, Invalid Message
554 Error, failed (technical reason)

4.2.3 RESEt ✨

okay so RESEt is basically the "undo my whole mess" button 🧹 It clears everything already entered in the server session and puts it back to how it was when you first connected 🌸 It's mainly there for when you accidentally typed something wrong during a manual session, bestie πŸ™ˆ

Here are the responses the SNPP server might send back for a RESEt command, with suggested text:

250 RESET OK
421 Too Many Errors, Goodbye (terminate connection
421 Gateway Service Unavailable (terminate connection)

4.2.4 SEND πŸ’Œ

SEND is the moment of truth 😀 It wraps up the current message transaction and sends the page off to the paging terminal πŸš€ Before anything gets processed, the server should check that the PAGEr and MESSage fields (or the message DATA if you're using the level two option) actually have info in them. If one of those required fields is missing, the server should respond with "503 Error, Incomplete Information" and let the user keep going πŸ’… If everything's complete, the SNPP server should format the page, send it to the paging terminal, and wait for a response πŸ¦‹

Here are the suggested responses for a SEND command:

250 Message Sent Successfully
421 Too Many Errors, Goodbye (terminate connection)
421 Gateway Service Unavailable (terminate connection)
503 Error, Pager ID or Message Incomplete
554 Message Failed [non-administrative reason]

Now, if the pager ID is illegal or doesn't exist, or the page is being rejected for some other administrative reason, the server should respond with:

550 Failed, Illegal Pager ID (or other explanation)

And after a SEND, the server should stay online so the client can submit another transaction 🧚 no need to reconnect every time, periodt ✨

4.2.5 QUIT πŸ‘‹

QUIT is the goodbye move 🫢 It ends the current session. The server should just reply with:

221 OK, Goodbye"

and then close the connection πŸ’œ

4.2.6 HELP (optional) πŸ†˜

The HELP command is optional, and it shows a screen of info about which commands the SNPP server supports πŸ“‹ It's mostly for manual users of the gateway, so they're not left guessing πŸ€“ Each line of the HELP screen (the responses) gets a "214" code in front of it. Once the whole HELP sequence is done, a "250" series message gets sent 🌈

Here are the suggested responses for a HELP command:

214 [Help Text]  (repeated for each line of information)
250 End of Help Information
421 Too Many Errors, Goodbye (terminate connection)
421 Gateway Service Unavailable (terminate connection)
500 Command Not Implemented

4.3 Level 2 - Minimum Extensions πŸŽ€

This section lays out the minimum upgrades to SNPP for extra functionality. Level up, bestie πŸ“ˆ

4.3.1 DATA πŸ“

DATA is an alternate way to send a message, and it lets you deliver a message across multiple lines πŸ’– It works a lot like the DATA command in SMTP (Internet STD10, RFC821), so if you know that one, you're already ahead 😌 The SNPP server should only allow one DATA or MESSage command before a SEND.

Here are the suggested responses for a DATA command:

354 Begin Input; End with <CRLF>'.'<CRLF>
421 Too Many Errors, Goodbye (terminate connection)
421 Gateway Service Unavailable (terminate connection)
503 ERROR, Message Already Entered
500 Command Not Implemented
550 ERROR, failed (administrative reason)
554 ERROR, failed (technical reason)

When the client gets a "354" response, it starts typing in the message line by line πŸ’¬ A single period (.) in the first position of a line ends the input. After that, the server may respond with:

250 Message OK
421 Too Many Errors, Goodbye (terminate connection)
421 Gateway Service Unavailable (terminate connection)
550 ERROR, Invalid Message (or administrative reason)
554 ERROR, Failed (technical reason)

4.4 Level 2 - Optional Extensions 🌟

This section talks about upgrades that give you more control over paging πŸŽ›οΈ They're mostly designed to match the extra features built into the Telocator Message Entry (TME) protocol from the TDP protocol suite 🧩 These functions may, optionally (as the author is doing), be built into a paging terminal. There's no requirement to implement all of them, but if someone asks for a function that isn't supported, the server should return a "500 Function Not Implemented" error πŸ™…β€β™€οΈ

Heads up: at the time of this publication, the TME standard is still not finalized 🚧

4.4.1 LOGIn <loginid> [password] πŸ”

LOGIn lets you set a session login ID. It's how the system checks who's trying to get into the paging terminal πŸ•΅οΈβ€β™€οΈ If you never send a LOGIn command, you're treated as an "anonymous" user πŸ‘€

Here are the suggested responses for a LOGIn command:

250 Login Accepted
421 Too Many Errors, Goodbye (terminate connection)
421 Gateway Service Unavailable (terminate connection)
421 Illegal Access Attempt
550 Error, Invalid LoginID or Password
554 Error, failed (technical reason)

4.4.2 PAGEr <PagerID> [Password/PIN] πŸ“Ÿ

This PAGEr is the upgraded version of the level one one πŸ’… The big difference is that you can now add a password or PIN for validation or to unlock features πŸ”‘

Before you go further, you need to get how PAGEr works alongside the LEVEl, COVErage, HOLDtime, and ALERt commands (the option parameters described below) 🧠 Every time you send a PAGEr command, think of it as the last step in a multi-step transaction ✨

When PAGEr gets processed, the pager ID (and password) gets submitted to the paging terminal along with LEVEl, COVErage, HOLDtime, and ALERt. If you haven't changed those parameters, their defaults are used for the transaction. Once the next PAGEr command has been processed, those option parameters go back to their defaults πŸ”„ This "option-option- option-go" setup means you can give "Jeff" a different priority level and "Kathy" a different coverage area, all while sending the same message to both of them 🫣

Here are the suggested responses for a PAGEr command:

250 Pager ID Accepted
421 Too Many Errors, Goodbye (terminate connection)
421 Gateway Service Unavailable (terminate connection)
550 Error, Invalid Pager ID or Password
554 Error, failed (technical reason)

4.4.3 LEVEl <ServiceLevel> 🚦

LEVEl sets an optional alternate service level for the next PAGEr command ⏱️ Ideally, "ServiceLevel" should be an integer from 0 to 11 inclusive. Here's what the TME protocol says each number means:

 0 - Priority
 1 - Normal (default)
 2 - Five minutes
 3 - Fifteen minutes
 4 - One hour
 5 - Four hours
 6 - Twelve hours
 7 - Twenty Four hours
 8 - Carrier specific '1'
 9 - Carrier specific '2'
10 - Carrier specific '3'
11 - Carrier specific '4'

How this feature gets implemented, and how far it goes, is optional and up to the carrier πŸ€·β€β™€οΈ

Here are the suggested responses for a LEVEl command:

250 OK, Alternate Service Level Accepted
421 Too Many Errors, Goodbye (terminate connection)
421 Gateway Service Unavailable (terminate connection)
500 Command Not Implemented
550 Error, Invalid Service Level Specified
554 Error, failed (technical reason)

4.4.4 ALERt <AlertOverride> πŸ””

ALERt is optional, and it lets you override the default on whether the subscriber gets alerted when a message comes in πŸ“³ Like LEVEl, it changes the parameters that get sent to the paging terminal with PAGEr. The TME protocol defines AlertOverride as either 0-DoNotAlert, or 1-Alert.

Here are the suggested responses for an ALERt command:

250 OK, Alert Override Accepted
421 Too Many Errors, Goodbye (terminate connection)
421 Gateway Service Unavailable (terminate connection)
500 Command Not Implemented
550 Error, Invalid Alert Parameter
554 Error, failed (technical reason)

4.4.5 COVErage <AlternateArea> πŸ—ΊοΈ

COVErage is optional too, and it overrides the subscriber's default coverage area so you can pick a different region 🌍 Like the previous command, it changes the parameters sent to the paging terminal with PAGEr. AlternateArea is a designator for one of these:

  • A subscriber-specific alternate coverage area
  • A carrier-defined region available to subscribers

Let's look at an example, because it's giving real life πŸ’β€β™€οΈ Mary Ghoti has local service in Chicago, Illinois (Mary's region '1'). Her account is set up so her pager can be paged nationwide on demand (Mary's region '2'). If you specify "COVErage 2" before the right "PAGEr" command, the default Chicago area gets overridden, and Mary's pager gets messaged nationally for that transaction πŸ“£ The carrier providing Mary's service is assumed to keep track of how many pages were sent to her pager this way, and to bill her for them πŸ’Έ

Here are the suggested responses for a COVErage command:

250 Alternate Coverage Selected
421 Too Many Errors, Goodbye (terminate connection)
421 Gateway Service Unavailable (terminate connection)
500 Command Not Implemented
550 Error, Invalid Alternate Region
554 Error, failed (technical reason)

4.4.6 HOLDuntil <YYMMDDHHMMSS> [+/-GMTdifference] ⏳

HOLDuntil lets you delay delivery of a message to a particular subscriber until after the time you specify πŸ’€ The time can be in local time (for example, local to the paging terminal), or you can add an extra parameter for the offset from GMT (so "-0600" means Eastern Standard Time, in other words πŸ•). Like the previous command, this one changes the parameters sent to the paging terminal with PAGEr.

Here are the suggested responses for a HOLDuntil command:

250 Delayed Messaging Selected
421 Too Many Errors, Goodbye (terminate connection)
421 Gateway Service Unavailable (terminate connection)
500 Command Not Implemented
550 Error, Invalid Delivery Date/Time
554 Error, failed (technical reason)

4.4.7 CALLerid <CallerID> πŸ“ž

CALLerid is a message-oriented function, which is different from the subscriber-oriented ones we just went through πŸ’­ It lets you specify the CallerIdentifier function described in TME. This parameter is optional, and it's up to the carrier how it gets implemented or used πŸŽ€

Here are the suggested responses for a CALLerid command:

250 Caller ID Accepted
421 Too Many Errors, Goodbye (terminate connection)
421 Gateway Service Unavailable (terminate connection)
500 Command Not Implemented
550 Error, Invalid Caller ID
554 Error, failed (technical reason)

4.4.8 SUBJect <MessageSubject> πŸ¦‹

okay so SUBJect is the message-oriented one πŸ’Œ it lets the sender set a subject for the next message that gets sent. this param is optional, and it's totally up to the carrier how they wanna implement or use it πŸ€·β€β™€οΈ

when a client sends SUBJect, the SNPP server can reply with these suggested responses:

250 Message Subject Accepted
421 Too Many Errors, Goodbye (terminate connection)
421 Gateway Service Unavailable (terminate connection)
500 Command Not Implemented
550 Error, Invalid Subject Option
554 Error, failed (technical reason)

4.5 Illegal Commands πŸ™…β€β™€οΈ

bestie, if the client sends an illegal command, the server may respond in one of two ways:

421 Too Many Errors, Goodbye (terminate connection)
500 Command Not Implemented, Try Again

how many illegal commands get allowed before the connection gets cut should be at the discretion of the operator of the SNPP server. the only response we haven't talked about yet is:

421 SERVER DOWN, Goodbye

this one is for refusing or terminating connections when the gateway is administratively down, or when there's some other technical or administrative problem with the paging terminal πŸ’€

4.6 Timeouts ⏰

the SNPP server can, optionally, have an inactivity timeout set up. when the allotted time runs out, the server replies 421 Timeout, Goodbye and closes the connection πŸ«₯

4.7 Rigidity of Command Structure πŸ’Ž

the commands from client to server should stay constant. however, since the first character of the response tells you success or failure, the text of the server responses could be changed to suit the tastes of the operator of the SNPP server. it is suggested that the response codes mirror SMTP response codes as closely as possible 🌸


5. Revision History πŸ“œ

originally, when it was first proposed, the author used POP2 style result/response codes πŸ•°οΈ the Internet community suggested that this '+' and '-' style be swapped for numeric response codes, similar to the ones used in other services like SMTP. the protocol was changed to this specification from the first proposed draft ✨

administrative errors (like an Illegal Pager ID) got separated from technical errors (like being out of space on disk). administrative failures are generally preceded by a 550 series response, while technical failures get a 554 series code πŸŽ€

level two enhancements were added in preparation for TME deployment πŸš€

the error code 502 Command not implemented was changed to a general 500 Command not recognized failure result, to follow SMTP more closely πŸ’…

6. Relationship to Other IETF Work 🌐

the strategy of this specification, and many of its details, were reviewed by an IETF Working Group and three IESG members. they concluded that an approach using the existing email infrastructure was preferable, mostly because deploying a brand new protocol is super expensive and the Internet's most widely-distributed applications protocol infrastructure is a huge advantage πŸ“¬ most reviewers felt no new protocol was needed at all, because the special "deliver immediately or fail" requirements of SNPP could be achieved by careful configuration of clients and servers. the experimental network printing protocol [4] was pointed to as an example of an existing infrastructure approach to an existing problem πŸ–¨οΈ other reviewers believed a case could be made for new protocol details to identify paging clients and servers to each other and negotiate the details of transactions, but that it would be more sensible to handle those as extensions to SMTP [1, 2] rather than deploying a new protocol structure 🧩

the author, while recognizing these positions, believes there is merit in a separate protocol. it isolates the details of TAP/IXO and its evolving successors from users, and from mail-based approaches that might reach systems acting as SMTP/MIME [3] to SNPP gateways πŸ“Ÿ such systems and gateways are, in fact, being designed and developed alongside this work πŸ› οΈ see the section "Why not just use Email and SMTP?" for more of the author's take on the classical electronic email approach πŸ‘€

7. References πŸ“š

  • [1] Postel, J., "Simple Mail Transfer Protocol", STD 10, RFC 821, USC/Information Sciences Institute, August 1982.
  • [2] Klensin, J., Freed, N., Rose, M., Stefferud, E., and D. Crocker, "SMTP Service Extensions", United Nations University, Innosoft, Dover Beach Consulting, Inc., Network Management Associates, Inc., The Branch Office, RFC 1425, February 1993.
  • [3] Borenstein, N., and N. Freed, "MIME (Multipurpose Internet Mail Extensions) Part One: Mechanisms for Specifying and Describing the Format of Internet Message Bodies", RFC 1521, Bellcore, Innosoft, September 1993.
  • [4] Rose, M., and C. Malamud, "An Experiment in Remote Printing", RFC 1486, Dover Beach Consulting, Inc., Internet Multicasting Service, July 1993.

8. Security Considerations πŸ”

okay, big moment 😱 security issues are not discussed in this memo. so, like, bestie, be careful out there πŸ«£πŸ’€

9. Author's Address πŸ’Œ

R. Allen Gwinn, Jr.
Associate Director, Computing Services
Business Information Center
Southern Methodist University
Dallas, TX  75275

Phone:  214/768-3186
EMail:  allen@mail.cox.smu.edu  or  allen@sulaco.lonestar.org

that's the whole RFC, bestie! πŸŒˆπŸ‘‘ the end πŸ’–

πŸ“¦ where this page comes from