RFC 740

NETRJS Protocol

πŸ“… published November 1977, from ietf

RFC 740 is the NETRJS Protocol πŸŽ€ by R. Braden at UCLA-CCN, dated 22 November 1977, NIC 42423 (the header also says RTB 42423, 22 Nov 77). It's part of the Network Working Group series and it obsoletes RFC 189 and RFC 599 πŸ’… This is part 1 of 4, so more is coming bestie 🫢


A. Introduction ✨

okay so NETRJS is a private protocol for remote job entry service πŸ–₯️ The UCLA Campus Computing Network (CCN) made it and used it for batch job submission to an IBM 360 Model 91. CCN's NETRJS server lets a remote user, or a daemon process working for a user, reach CCN's RJS ("Remote Job Service") subsystem. RJS gives remote job entry to real remote batch (card reader/line printer) terminals over direct communications lines, and also over the ARPANET 🌸

a batch user at a remote host needs a NETRJS user process to talk to the NETRJS server at the batch host. an active NETRJS user process pretends to be a "Virtual Remote Batch Terminal", or "VRBT" πŸ¦‹

a VRBT can have virtual card readers, printers, and punches. every VRBT also has a virtual remote operator console πŸ’œ with a virtual card reader, a Network user can send a stream of card images with one or more batch jobs, JCL ("job control language") and all, to the batch server host. the NETRJS server spools those jobs into the batch system to run by priority. NETRJS then sends the print and/or punch output images back to the virtual printer and/or card punch of the VRBT that submitted the job. the batch user can wait for output, or sign off and sign on again later to pick it up πŸ“

to start a NETRJS session, the user process has to run a standard ICP to a fixed socket at the server. that sets up a full-duplex Telnet connection for the virtual remote operator console, so the VRBT can sign on to RJS ✨ then the console is used to send commands to NETRJS and to get status, confirmation, and error messages from the server. the most important remote operator commands are summarized in Appendix D πŸ“‹

different VRBTs are told apart by 8-character terminal ids, which the server site assigns to individual batch users or user groups 🧚


B. Connections and Protocols πŸ”Œ

the protocol uses up to five connections between the user and server processes. the operator console uses one full-duplex Telnet connection. the data transfer streams for the virtual card reader, printer, and punch each use their own simplex connection, under a data transfer protocol defined in Appendix A. this doc calls one of those simplex data transfer connections a "channel", and calls a connection "input" or "output" based on the server's point of view πŸ¦‹

a channel only needs to be open while it's in use, and different channels can be used one after another or all at once. CCN's NETRJS server supports running a virtual card reader, a virtual printer, and a virtual punch at the same time (on top of the operator console) on the same VRBT process πŸ’… the NETRJS protocol could easily be extended to any number of simultaneously-operating virtual card readers, printers, and punches 🌈

the NETRJS server plays the passive role when it comes to opening the data channels. the server only "listens" for an RFC from the user process πŸ‘‚ NETRJS uses an 8-bit byte size on all data channels πŸ’œ

some NETRJS user processes are daemons running in the background to submit jobs from a list of user requests πŸ€– others are interactive, run directly under terminal control by remote users. in the interactive case, the VRBT process usually splits the user's terminal between NETRJS (acting as the remote operator console) and local VRBT commands. those local commands let the user pick the files holding job streams to send to the server, and pick the files that will receive job output from the server πŸ“‚ other local commands can tell the VRBT to open data transfer channels to the NETRJS server, or to close them to free buffer space or abort transmission πŸ™ˆ

the user process gets to choose one of three ICP sockets to set the VRBT's character set: ASCII-68, ASCII-63, or EBCDIC πŸŽ€ the server translates the data on the card reader and printer channels to match. (in CCN's implementation of NETRJS, an EBCDIC VRBT sends and receives "transparent" streams of 8-bit bytes with no translation, since CCN is an EBCDIC installation πŸ’€) the punch stream is always transparent, outputting "binary decks" of 80-byte records untranslated. the operator console connections always use Network ASCII, as defined by the Telnet protocol ✨

NETRJS does data compression too, swapping repeated blanks or other characters for repeat counts 🌸 but when the terminal id is assigned, a particular network VRBT can be set to use no data compression. in that case NETRJS just truncates trailing blanks and sends records in a simple "op code-length-data" form, called "truncated format" (see Appendix A) πŸ“


C. Starting and Terminating a Session πŸšͺ

the remote user connects to the NETRJS server by running an ICP to contact socket 71 (decimal) for EBCDIC, socket 73 (decimal) for ASCII-68, or socket 75 (decimal) for ASCII-63. a successful ICP gives a pair of connections, and those are the NETRJS operator console connections. NETRJS sends a READY message over the operator output connection 🫢

the user (process) now has to enter a valid signon command, SIGNON terminal-id, through the virtual remote operator console. RJS normally acknowledges the signon with a console message. but if there's no NETRJS server port free, NETRJS says no by closing both operator connections 😭 if the user doesn't enter a valid signon within 3 minutes, NETRJS closes the operator connections too ⏰ and if the VRBT tries to open data transfer channels before the signon is accepted, those channels get refused, with an error message sent to the VRBT operator console πŸ™…β€β™€οΈ

say S is the even number sent in the ICP. then the NETRJS connections have sockets at the server with a fixed relation to S, shown in this table πŸ“Š

Channel                          Server Socket     User Socket
-------                          -------------     -----------
Remote Operator Console Input         S            U + 3 Telnet
Remote Operator Console Output        S + 1        U + 2 Telnet
Data Transfer - Card Reader #1        S + 2        any odd number
Data Transfer - Printer #1            S + 3        any even number
Data Transfer - Punch #1              S + 5        any even number

once the VRBT has a valid signon, it can open data transfer channels and start input and output operations, as the following sections explain πŸ’– to end the session, the VRBT can close all connections. or it can send a SIGNOFF command through the virtual remote operator console. when NETRJS gets a SIGNOFF, it waits until the current job output streams are finished, then ends the session itself by closing all connections πŸ‘‘


D. Input Operations πŸ“₯

a job stream for the NETRJS server is a series of logical records, and each one is a card image of at most 80 characters πŸƒ the user can send a "stack" of jobs one after another through the card reader channel, with no end-of-job marker between them. NETRJS can parse the JCL well enough to spot where each job begins 🧠

to submit a batch job or a stack of jobs, the user process first has to open the card reader channel by issuing an Init for foreign socket S+2 and the right local socket. NETRJS is listening on socket S+2, and it sends back an RTS command to open the channel. once the channel is open, the user can start sending the job stream using the protocol defined in Appendix A. for each job that's spooled successfully, NETRJS sends a confirming message to the remote operator console βœ…

at the end of the job stack, the user process must send an End-of-Data transaction to start processing the last job. then NETRJS closes the channel (so it isn't holding buffer space for no reason) 🧹 at any point during the session, the user process can re-open the card reader channel and send another job stack. it can also end the session and sign on later to get the output πŸ”

if the user process leaves the channel open for 5 minutes without sending any bits, the server aborts (closes) the channel ⏳ the user process can abort the card reader channel any time by closing it. NETRJS then throws away the last partially spooled job πŸ—‘οΈ if NETRJS hits an error (like a transaction sequence number error or a dropped bit), it aborts the channel by closing it early, and it also tells the user process that the job was discarded. that's how the race between End-of-Data and aborting gets sorted out 🏁 the user process should retransmit only the jobs in the stack that haven't been completely spooled πŸ”„

⚠️ if the user's process, NCP, or host, or the Network itself fails during input, RJS throws away the job being transmitted. a message telling the user that this job was discarded gets made and sent to them the next time they sign on 😭 but jobs whose receipt was acknowledged on the operator's console are not affected by the failure, and the server still runs them 🫢

E. Output Operations πŸ¦‹

The VRBT MAY wait to set up a virtual printer or punch and open its channel until a STATUS message from NETRJS says output is ready πŸ’Œ. Or it MAY leave the output channel(s) open for the whole session, ready to catch output the moment it shows up 🌸. The VRBT can also pick which of several available jobs gets sent back, just by typing the right operator commands 🎯.

To be ready for printer (or punch) output from its jobs, the VRBT sends an Init to foreign socket S+3 for printer output or S+5 for punch output, respectively. NETRJS is listening on those sockets and SHOULD immediately return an STR ✨. Hmm, it's possible NETRJS will say no because of a buffer shortage, and then it returns a CLS instead. If that happens, just try again later 🫢.

When NETRJS has job output for a particular virtual terminal and an open output channel to go with it, it sends the output as a series of logical records using the protocol in Appendix A πŸ“¦. The first record is the job name (8 characters), then a comma, then the ID string from the JOB card (if there is one). In the printer stream, the first column of every record after the first is an ASA carriage control character (see Appendix C) πŸ–¨οΈ. A virtual printer in NETRJS has 254 columns, not counting carriage control, so NETRJS sends up to 255 characters of a logical record it finds in a SYSOUT data set πŸ“. If the user wants to reject or fold records longer than some smaller record size, they can do that in their VRBT process πŸ’….

NETRJS sends an End-of-Data transaction and then closes an output channel at the end of the output for each complete batch job. After that, the remote site MUST send a new RFC to start output for another job πŸŽ€. This gives the remote site a chance to allocate a new file for each job without breaking up the output within a job 🧚.

If the batch user wants to cancel (or backspace or defer) the output of a particular job, they can enter the right NETRJS commands on the operator input channel (see Appendix D) πŸ™ˆ.

If NETRJS runs into a permanent I/O error while reading the disk data set, it tells the user through their console, skips forward to the next set of system messages or SYSOUT data set in the same job, and keeps going πŸ› οΈ. If the user's process stops accepting bits for 5 minutes, the server aborts the channel ⏰. No matter what, the user gets a notice that output transfer has ended for each job, through a remote console message πŸ“£.

If the user spots an error in the stream, they can send a Backspace (BSP) command from their console to repeat the last "page" of output πŸ“„. They can also send a Restart (RST) command to repeat from the last SYSOUT data set or from the beginning of the job πŸ”. Or they can abort the channel by closing their socket πŸšͺ. If they abort the channel, NETRJS simulates a Backspace command, and when the user reopens the channel, the job starts sending again from an earlier point in the same data set 🎬. This still works even if the user ends the current session first and reopens the channel in a later session, because RJS saves the state of every incomplete output stream πŸ’Ύ. Before reopening the channel, though, they can defer this job for later output, restart it at the beginning, or cancel its output (see Appendix D) 🫠. Heads up: aborting the channel only does anything if NETRJS hasn't sent the End-of-Data transaction yet ⚠️.

If the user's process, NCP, host, or the Network itself fails during an output operation, NETRJS acts as if the channel was aborted and the user signed off 😱. NETRJS only discards a job's output after it gets the RFNM from the last data transfer message (the one containing an End-of-Data) πŸ“¬. In no case SHOULD a NETRJS user lose output from a batch job πŸ‘‘.


APPENDIX A: Data Transfer Protocol in NETRJS πŸ’–

1. Introduction

The records in the data transfer channels (for virtual card reader, printer, and punch) are usually grouped into transactions, and each transaction comes after a header πŸ“š. The transaction header has a sequence number and the length of the transaction πŸ”’. Network byte size MUST be 8 bits in these data streams πŸ’œ.

A transaction is the unit of buffering inside the server software, and it's capped at 880 8-bit bytes 🧱. Transactions can be as short as one record, but sites that care about efficiency SHOULD send transactions as close as possible to the 880 byte limit 🏎️.

Logical messages and physical message boundaries have no required relationship with transactions. The NCP can split a transaction into physical messages wherever it likes πŸͺ„. The CCN server starts each transaction at the beginning of a new physical message, but that isn't a requirement of the protocol πŸ™ƒ.

Every logical record in a transaction starts with an "op code" byte that holds the channel identification, so its value is unique to each channel but stays the same within a channel πŸ†”. This gives the receiver an easy way to check bit-synchronization, and it also leaves room for a future extension to true "multi-leaving" (multiplexing all channels within one connection in each direction) 🌈.

The only transmission error checks in the current NETRJS protocol are (1) the "op code" byte, to verify bit synchronization, and (2) the transaction sequence number πŸ”. Under the NETRJS protocol, a data transfer error MUST abort the entire transmission, and there is no provision for restart πŸ’€.

2. Meta-Notation

The NETRJS data transfer protocol is described using a formal notation derived from the one proposed in RFC 31 by Bobrow and Sutherland 🧠. The notation is a set of productions for bit string variables. Each variable name for a fixed length field is followed by its length in bits, like SEQNUMB(16). Numbers in quotes are decimal, unless a leading X says they're hex. Each hex digit is 4 bits, so hex numbers don't show the length explicitly. For example, '255'(8) and X'FF' both represent a string of 8 one bits πŸŽ€.

The meta-syntactic operators are:

     |     :alternative string

     [ ]   :optional string

     ( )   :grouping

     +     :catenation of bit strings

The numerical value of a bit string (read as an integer) is written as a lower case identifier in front of the string expression, separated by a colon. For example, in "i:FIELD(8)", i stands for the numeric value of the 8 bit string FIELD πŸ”’.

Last one: Bobrow and Sutherland's symbol for repeating a sub-string is (STRING-EXPRESSION = n). That means n occurrences of STRING-EXPRESSION, catenated together implicitly. Here, any n greater than or equal to 0 is assumed, unless n is explicitly restricted πŸ”.

3. Protocol Definition

Here's the first production, STREAM 🌊:

STREAM ::= (TRANSACTION = n) + [END-OF-DATA]

So STREAM, the whole sequence of data on one open channel, is n TRANSACTIONS followed by an END-OF-DATA marker. The marker is left out if the sender aborts the channel 🚫.

TRANSACTION ::= THEAD(72) + (RECORD = r) + ('0'(1) = f)

A transaction is a 72 bit header, r records, and f filler bits. It can't go over 880*8 bits πŸ“.

THEAD ::= X'FF'+f:FILLER(8)+SEQNUMB(16)+LENGTH(32)+X'00'

Transactions are numbered in order using the SEQNUMB field, starting at 0 for the first transaction after the channel is (re)opened πŸ”’. The 32 bit LENGTH field is the total length in bits of the r RECORDs that follow. For convenience, the using site can add f extra filler bits at the end of the transaction to hit a convenient word boundary on its machine. The value of f is sent in the FILLER field of THEAD 🧩.

RECORD ::= COMPRESSED | TRUNCATED

RJS accepts a mix of COMPRESSED and TRUNCATED RECORDs in an input stream πŸ₯°. In the printer and punch streams going to a given VRBT, RJS sends just one of the two formats. The choice is made for each terminal id 🎯.

COMPRESSED ::= '2'(2) + DEVID(6) + (STRING = p) + '0'(8)
STRING     ::= ('6'(3) + i:DUPCOUNT(5))  |

This form represents a string of i consecutive blanks πŸͺΆ.

                     ('7'(3) + i:DUPCOUNT(5) + TEXTBYTE(8)) |

This form represents a string of i consecutive duplicates of TEXTBYTE πŸ‘―.

                     ('2'(2) + j:LENGTH(6) + (TEXTBYTE(8) = j))

This form represents a string of j characters πŸ’¬.

TRUNCATED  ::= '3'(2) + DEVID(6) + n:COUNT(8) + (TEXTBYTE(8)=n)
DEVID(6)   ::= DEVNO(3) + t:DEVTYPE(3)

DEVID identifies a specific virtual device, which means it identifies a channel πŸ›€οΈ. DEVTYPE says what kind of device it is, like this πŸ‘‡:

            t = 1:  Output to remote operator console
                2:  Input from remote operator console
                3:  Input from card reader
                4:  Output to printer
                5:  Output to card punch
              6,7:  Unused

DEVNO identifies the particular device of type t at this remote site. Right now, only DEVNO = 0 is possible 🫧.

END-OF-DATA ::=X'FE'

This marks the end of a job's output (or the end of a job stack, for input) 🏁.


APPENDIX B: Telnet for VRBT Operator Console πŸ“ž

The remote operator console connections use the ASCII Telnet protocol. Here's how it works πŸ’»:

  1. Three EBCDIC graphics don't have an ASCII equivalent, so they get a one-to-one character mapping, shown below πŸ”„:
ASCII in Telnet     |  NETRJS
----------------------------------------------------
broken vertical bar |  solid vertical bar
tilde               |  not sign
back slash          |  cent sign
  1. Telnet controls get ignored πŸ™ˆ.
  2. If an operator console input line goes over 133 characters (not counting CR LF), NETRJS truncates it βœ‚οΈ.
  3. NETRJS accepts BS (Control-H) to delete a character, and CAN (Control-X) to delete the current line πŸ—‘οΈ. The sequence CR LF ends each input and output line. HT (Control-I) gets translated to a single space 🫧. ETX (Control-C) ends (aborts) the session πŸ›‘. All other ASCII control characters get ignored 😌.
  4. NETRJS turns the six ASCII graphics that have no EBCDIC equivalent into a question mark ("?") on input ❓.

APPENDIX C: Carriage Control πŸŽ€

The carriage control characters that NETRJS sends in a printer channel follow IBM's extended USASI code. The table below shows what each one does πŸ–¨οΈ:

CODE       ACTION BEFORE WRITING RECORD
----       ----------------------------
Blank      Space one line before printing
0          Space two lines before printing
-          Space three lines before printing
+          Suppress space before printing
1          Skip to channel 1
2          Skip to channel 2
3          Skip to channel 3
4          Skip to channel 4
5          Skip to channel 5
6          Skip to channel 6
7          Skip to channel 7
8          Skip to channel 8
9          Skip to channel 9
A          Skip to channel 10
B          Skip to channel 11
C          Skip to channel 12

APPENDIX D ✨

okay so this section is basically a cheat sheet for the RJS Operator Commands πŸ“ it gives a quick overview, but if you want the full form and parameter specs, go check out references 2 and 3 πŸŽ€

Terminal Control and Information Commands

  • SIGNON: literally the first command of a session. It identifies the VRBT by giving its terminal id πŸ†”
  • SIGNOFF: the last command of a session. RJS waits for any data transfer in progress to finish, then closes all connections πŸšͺ
  • STATUS: outputs a complete list (or a summary) of all jobs in the system for this VRBT on the remote operator console, with an indication of their processing status in the batch host πŸ“Š
  • ALERT: outputs an "Alert" message on the remote operator console, if there is one from the computer operator 🚨 The Alert message also gets sent automatically when the user does a SIGNON, or whenever the message changes πŸ’œ
  • MSG: sends a message to the computer operator or to any other RJS terminal (real or virtual) πŸ’Œ A message from the computer operator or another RJS terminal pops up on the remote operator console automatically 🌸

Job Control and Routing Commands

Under CCN's job management system, the default destination for output is the input source πŸ¦‹ So a job submitted under a given VRBT gets sent back to that VRBT (same terminal id), unless the user's JCL overrides the default destination πŸ‘‘

RJS puts print and punch output for a particular remote terminal into either an Active Queue or a Deferred Queue. When the user opens their print or punch output channel, RJS immediately starts sending job output from the Active Queue, and keeps going until that queue is empty πŸƒβ€β™€οΈ Deferred Queue output is different. It has to be called for by job name (using a RESET command from the remote operator) before RJS will send it πŸ™ˆ Whether a job's output lands in Active or Deferred depends on the deferral status of the VRBT when the job is entered. That status gets set to Active when the user signs on, but the SET command can change it πŸ”„

  • SET: lets the remote user change certain properties of their VRBT for the duration of the current session ✨
    • (a) May change the default output destination to be another (real or virtual) RJS terminal or the central facility.
    • (b) May change the deferral status of the VRBT.
  • DEFER: moves the print and punch output for a specified job or set of jobs from the Active Queue to the Deferred Queue. If the job's output is being transmitted over a channel right now, RJS aborts the channel and saves the current output location before moving the job πŸ›‘ A later RESET command will return it to the Active Queue with an implied Backspace (BSP) πŸ”™
  • RESET: moves specified job(s) from Deferred to Active Queue so they can be sent to the user. A specific list of job names, or all jobs, can be moved with one RESET command 🧺
  • ROUTE: re-routes the output of specified jobs (or all jobs) waiting in the Active and Deferred Queues for the VRBT πŸ—ΊοΈ The new destination can be any other RJS terminal or the central facility 🏒
  • ABORT: cancels a job which was successfully submitted and is awaiting execution, or is currently executing πŸ’€

Output Stream Control Commands

  • BSP (BACKSPACE): "backspaces" the output stream within the current sysout data set. The actual amount backspaced depends on sysout blocking, but it's roughly equivalent to a page on the line printer πŸ“„
  • CAN (CANCEL):
    • (a) On an output channel, CAN causes the rest of the output in the sysout data set currently being transmitted to be omitted. Alternatively, it may omit the rest of the sysout data sets for the job currently being transmitted; however, the remaining system and accounting messages will still be sent.
    • (b) On an input channel, CAN causes RJS to ignore the job currently being read. However, the channel is not aborted as a result, and RJS will keep reading in jobs on the channel πŸ“₯
    • (c) CAN can delete all sysout data sets for specified job(s) waiting in the Active or Deferred Queue πŸ—‘οΈ
  • RST (RESTART):
    • (a) Restarts a specified output stream at the beginning of the current sysout data set or, optionally, at the beginning of the job.
    • (b) Marks as restarted specified job(s) whose transmission was earlier interrupted by system failure or user action (e.g., DEFER command or aborting the channel). When RJS transmits these jobs again, it will start at the beginning of the partially transmitted sysout data set or, optionally, at the beginning of the job. This function may be applied to jobs in either the Active or the Deferred Queue; however, if the job was in the Deferred Queue, RST also moves it to the Active Queue. If the job was never transmitted, RST has no effect other than this queue movement. πŸ”
  • REPEAT: sends additional copies of the output of specified jobs πŸ“š
  • EAM: echoes the card reader stream back in the printer and/or punch stream πŸƒ

APPENDIX E πŸŽ€

When you define a brand-new NETRJS virtual terminal, you get some options to pick from. They're listed below πŸ’–

  1. Truncated/Compressed Data Format: a VRBT may use either the truncated data format (default) or the compressed format for printer and punch output. Check out Reference 9 for the virtues of compression πŸ—œοΈ
  2. Automatic Coldstart Job Resubmission: if "R" (Restart) is specified in the accounting field on the JOB card and this option is chosen, RJS will automatically resubmit the job from the beginning if the server operating system gets "coldstarted" before all of the job's output has come back πŸ”„ Otherwise, the job will be lost and must be resubmitted from the remote terminal in case of a coldstart 😭
  3. Automatic Output RESTART: with this option, printer output that's interrupted by a broken connection always starts over at the beginning. Without it, the output is backspaced approximately one page when restarted, unless the user forces the output to start over from the beginning with a RESTART command when the printer channel is re-opened and before printing begins πŸ–¨οΈ
  4. Password Protection: this option lets a password be supplied when a terminal is signed on, which prevents unauthorized use of the terminal ID πŸ”
  5. Suppression of Punch Separator and Large Letters.: this option suppresses both the separator cards RJS normally puts in front of each punched output deck, and the separator pages on printed output that contain the job name in large block letters. These separators are a handy operational aid when output goes to a real printer or punch, but they're generally undesirable for an ARPA user who's saving the output in a file for on-line examination πŸ—‚οΈ

APPENDIX F 🌈

Character translation time! A VRBT declares its character set for job input and output by the initial connection socket it chooses. It can be ASCII-68, ASCII-63, or EBCDIC πŸ”€ The ASCII-63 mapping was added to NETRJS at the request of users whose terminals have keyboards like the ones on the model 33 Teletype ⌨️

Since CCN operates an EBCDIC machine, its NETRJS server translates ASCII input to EBCDIC and translates printer output back to ASCII πŸ” Here's how that translation works πŸ‘‡

For ASCII-68, these rules apply:

  1. There is a one-to-one mapping between the three ASCII characters broken vertical bar, tilde, and back slash (which aren't in EBCDIC) and the three EBCDIC characters vertical bar, not sign, and cent sign (respectively), which aren't in ASCII.
  2. The other six ASCII graphics not in EBCDIC are translated on input to unused EBCDIC codes, shown in the table below.
  3. The ASCII control DC4 is mapped to and from the EBCDIC control TM.
  4. The other EBCDIC characters not in ASCII are mapped in the printer stream to the ASCII question mark.

For ASCII-63, the same rules apply, except that the ASCII-63 codes X'60' and X'7B' - X'7E' are mapped as in the following table.

      EBCDIC              | ASCII-68 VRBT       | ASCII-63 VRBT
      ---------------------------------------------------------------
      vertical bar  X'4F' | vertical bar  X'7C' | open bracket  X'5B'
      not sign      X'5F' | tilde         X'7E' | close bracket X'5D'
      cent sign     X'4A' | back slash    X'5C' | back slash    X'5C'
      underscore    X'6D' | underscore    X'5F' | left arrow    X'5F'
      .             X'71' | up arrow      X'5E' | up arrow      X'5E'
      open bracket  X'AD' | open bracket  X'5B' | .             X'7C'
      close bracket X'BD' | close bracket X'5D' | .             X'7E'
      .             X'8B' | open brace    X'7B' | .             X'7B'
      .             X'9B' | close brace   X'7D' | .             X'7D'
      .             X'79' | accent        X'60' | .             X'60'

APPENDIX G πŸ’–

REFERENCES ✨

  1. "Interim NETRJS Specifications", R. T. Braden. RFC #189: NIC #7133, July 15, 1971.

okay so this is the basic system programmer's definition doc πŸ“š the proposed changes mentioned on the first page of RFC #189 never got implemented, bc the DTP that was super in vogue back then became obsolete πŸ’€

  1. "NETRJS Remote Operator Commands", R. T. Braden. NIC #7182, August 9, 1971

this one + references 3 and 8 are the remote operator (aka user) command language for NETRJS πŸŽ€ they're basically the core user docs for NETRJS at CCN, so main character energy πŸ‘‘

  1. "Implementation of a Remote Job Service", V. Martin and T. W. Springer. NIC #7183, July, 1971.
  2. "Remote Job Entry to CCN via UCLA Sigma 7; A scenario", UCLA/CCN. NIC #7748, November 15, 1971.

this one described the first NETRJS user implementation on a server host 🧚 it's no longer of general interest tho, so we're moving on bestie

  1. "Using Network Remote Job Entry", E. F. Harslem. RFC #307: NIC #9258, February 24, 1972.

ngl this one is out of date πŸ™ˆ but it gives you the general vibe of the Tenex NETRJS user process "RJS" πŸ¦‹

  1. "EBCDIC/ASCII Mapping for Network RJS", R. T. Braden. RFC #338: NIC #9931, May 17, 1972.

the ASCII-63 mapping in here is no longer correct πŸ’€ but CCN's standard ASCII-68/EBCDIC mapping is described correctly, and that info is accurately covered in Appendix F of the current document 🫢

  1. "NETRJT--Remote Job Service Protocol for TIP's", R. T. Braden. RFC #283: NIC 38165, December 20, 1971.

this was an attempt to define an rje protocol to handle TIPs 🌸 NETRJT never got implemented, but a lot of its features ended up in the current Network standard RJE protocol, which is so iconic ✨

  1. "CCN NETRJS Server Messages to Remote User", R. T. Braden. NIC #20268, November 26, 1973.
  2. "FTP Data Compression", R. T. Braden. RFC #468: NIC #14742, March 8, 1973.
  3. "Update on NETRJS", R. T. Braden. RFC #599: NIC #20854, December 13, 1973.

this one updated reference 1, and the current document combines the two πŸ’œ

  1. "Network Remote Job Entry -- NETRJS", G. Hicks. RFC #325: NIC 9632, April 6, 1972.
  2. "CCNRJS: Remote Job Entry between Tenex and UCLA-CCN", D. Crocker. NUTS Note 22, [ISI]<DOCUMENTATION>CCNRJS.DOC, March 5, 1975.
  3. "Remote Job Service at UCSB", M. Krilanovich. RFC #477: NIC #14992, May 23, 1973.
πŸ“¦ where this page comes from