mirror of
https://github.com/gomson/TimothyLottes.github.io.git
synced 2026-08-04 14:48:49 +00:00
361 lines
12 KiB
HTML
361 lines
12 KiB
HTML
<html><head><link rel="stylesheet" href="style.css"></head><body><div class="page">
|
|
<h1>20040101 - Simple IP Reference</h1>
|
|
<br>
|
|
<pre>________________________________________________________________
|
|
|
|
SIMPLE IP REFERENCE - USE RFC'S FOR FULL REFERENCE
|
|
|
|
|
|
This is a minimal reference for programming a simple operating
|
|
system's internet related code. Note network byte order is big
|
|
endian (most significant byte first), keep this in mind when
|
|
sending multibyte sized numbers. This assumes some basic
|
|
knowledge of IP networking, and is not a complete reference.
|
|
|
|
________________________________________________________________
|
|
SMTP - SIMPLE MAIL TRANSPORT PROTOCOL
|
|
|
|
In progress...
|
|
|
|
|
|
________________________________________________________________
|
|
POP3 - POST OFFICE PROTOCOL
|
|
|
|
Access a maildrop via TCP port 110. The following are used to
|
|
describe,
|
|
|
|
[optional] -> optional arguments
|
|
(grouping) -> used only to describe repeating
|
|
... -> repeats last grouping
|
|
<SPACE> -> decimal 32
|
|
<DOT> -> decimal 46
|
|
<LF> -> decimal
|
|
<CR> -> decimal
|
|
"text" -> text to be sent as is
|
|
|
|
The formatting is as follows,
|
|
|
|
client sends: (command)...
|
|
command: keyword [(<SPACE> argument)...] <CR> <LF>
|
|
keywords: are 3-4 characters long and case insensitive
|
|
arguments: are up to 40 characters long
|
|
|
|
server sends: (responce)...
|
|
responce: first [(extra)... <DOT> <CR> <LF>]
|
|
first: status_indicator <SPACE> keyword
|
|
[(<SPACE argument)...] <CR> <LF>
|
|
extra: data <CR> <LF>
|
|
first: may be up to 512 characters long
|
|
status_indicator: will be "+OK" or "-ERR"
|
|
always in upper case
|
|
data: if first character is <DOT> then it
|
|
will actually be <DOT> <DOT>
|
|
|
|
The connection happens in states,
|
|
|
|
client: connects to server
|
|
server: "+OK" SPACE "POP3" safe_to_ignore_data <CR> <LF>
|
|
|
|
AUTHORIZATION STATE
|
|
The client needs to identify itself before accessing mail.
|
|
|
|
client: "USER" <SPACE> name <CR> <LF>
|
|
server: responds if good, "+OK" safe_to_ignore_data <CR> <LF>
|
|
server: responds if bad, "-ERR" safe_to_ignore_data <CR> <LF>
|
|
|
|
then,
|
|
|
|
client: "PASS" <SPACE> password <CR> <LF>
|
|
server: responds if good, "+OK" safe_to_ignore_data <CR> <LF>
|
|
server: responds if bad, "-ERR" safe_to_ignore_data <CR> <LF>
|
|
|
|
loop if bad
|
|
|
|
TRANSACTION STATE
|
|
In this state the mailbox is locked, all messages get
|
|
assigned a decimal number starting with "1" and going in
|
|
incremental order. All messages are flagged as not deleted.
|
|
|
|
client: "STAT" <CR> <LF>
|
|
server: "+OK" <SPACE> number_of_messages <SPACE>
|
|
mail_size_in_bytes safe_to_ignore_data <CR> <LF>
|
|
server: responds if bad, "-ERR" safe_to_ignore_data <CR> <LF>
|
|
server: does not count deleted messages in the total
|
|
|
|
client: "LIST" [<SPACE> message_number] <CR> <LF>
|
|
server: for message_number option,
|
|
"+OK" <SPACE> size_of_message safe_to_ignore_data
|
|
<CR> <LF>
|
|
server: otherwise gives multiline responce,
|
|
"+OK" safe_to_ignore_data <CR> <LF>
|
|
[(message_number <SPACE> message_size safe_to_ignore
|
|
<CR> <LF>)...] <DOT> <CR> <LF>
|
|
server: responds if bad, "-ERR" safe_to_ignore_data <CR> <LF>
|
|
server: does not list deleted messages
|
|
|
|
client: "RETR" <SPACE> message_number <CR> <LF>
|
|
server: "+OK" safe_to_ignore <CR> <LF>
|
|
lines_of_message_remember_special_dot_dot_encoding
|
|
<DOT> <CR> <LF>
|
|
server: responds if bad,
|
|
"-ERR" safe_to_ignore_data <CR> <LF>
|
|
server: should not send a deleted message
|
|
|
|
client: "DELE" <SPACE> message_number <CR> <LF>
|
|
server: marks message as deleted,
|
|
"+OK" safe_to_ignore <CR> <LF>
|
|
server: responds if bad,
|
|
"-ERR" safe_to_ignore_data <CR> <LF>
|
|
server: will respond in error if already deleted
|
|
server: does not actualy delete message until update state
|
|
|
|
client: "NOOP" <CR> <LF>
|
|
server: "+OK" <CR> <LF>
|
|
|
|
client: "RSET" <CR> <LF>
|
|
server: messages set not deleted,
|
|
"+OK" safe_to_ignore <CR> <LF>
|
|
server: responds if bad, "-ERR"
|
|
safe_to_ignore_data <CR> <LF>
|
|
|
|
client: "QUIT" <CR> <LF>
|
|
server: changes to update state
|
|
|
|
UPDATE STATE
|
|
server: "+OK" safe_to_ignore_data <CR> <LF>
|
|
server: responds if bad, "-ERR"
|
|
safe_to_ignore_data <CR> <LF>
|
|
server: will perminatly delete messages marked as deleted
|
|
|
|
Reported email message size may be different than actual sent
|
|
size of message, the <DOT> characters should not be counted
|
|
twice even though they are sent that way.
|
|
|
|
|
|
________________________________________________________________
|
|
SLIP - SERIAL LINE IP
|
|
|
|
Use 1006 byte datagrams (not including the adjusted characters
|
|
below). To send a packet just send data. If data byte is 192,
|
|
then send 219 and 220 instead. If data byte is 219, then send
|
|
219 and 221 instead. When the last byte of the packet is sent
|
|
then send 192.
|
|
|
|
|
|
________________________________________________________________
|
|
ETHERNET
|
|
|
|
Ethernet Header
|
|
|
|
offset bytes meaning
|
|
0 6 destination 48bit Ethernet MAC
|
|
6 6 source 48bit Ethernet MAC
|
|
12 2 type, ARP=0x806, IP=0x800
|
|
14 total size (offset of IP header)
|
|
|
|
When get IP from network, save source MAC to IP mapping if
|
|
source IP is on the local network (hence the requirement of a
|
|
netmask). When put IP to network, set destination MAC to
|
|
correct MAC for destination IP (if on local network) or
|
|
address of default router (not on local network).
|
|
|
|
Ethernet ARP (Address Resolution Protocol) Header
|
|
|
|
offset bytes meaning
|
|
14 2 hardware type: 1=ethernet
|
|
16 2 protocol: IP=0x800
|
|
18 1 hardware length: 6 (for 48bit Ethernet MAC)
|
|
19 1 protocol length: 4 (for 32bit IP)
|
|
20 2 opcode: request=1, reply=2
|
|
22 6 source MAC
|
|
28 4 source IP
|
|
32 6 destination MAC
|
|
38 4 destination IP
|
|
|
|
These packets are used to resolve IP addresses into MAC
|
|
addresses. After initial resolution the translation should be
|
|
cached. Probably should use 20 minutes as default for ARP
|
|
cache entry timeout (this is BSD default). If ARP request, and
|
|
destination IP equals host IP, then send reply with source set
|
|
to host info and destination set to source info from request.
|
|
To send an ARP request set ethernet header destination MAC to
|
|
all 0xFF, ARP header destination MAC to all 0x00, and set
|
|
source to host.
|
|
|
|
|
|
________________________________________________________________
|
|
DNS HOST NAME TO IP ADDRESS RESOLUTION
|
|
|
|
DNS uses UDP packets at port 53. This only gives the minimal
|
|
amount of into to write a simple resolver. DNS messages
|
|
encode host names with a special format, host dot seperated
|
|
substring,
|
|
|
|
offset bytes meaning
|
|
0 1 n, size of string or 0 for end of string
|
|
1 n the characters for the string (skips .)
|
|
|
|
This may be repeated multiple times to encode a string
|
|
with many '.' characters. So to encode "this.name.com",
|
|
|
|
4,'this',4,'name',3,'com',0,
|
|
|
|
DNS Message Header
|
|
offset bytes meaning
|
|
0 2 id (could be used for resolver table entry)
|
|
2 1 flags
|
|
0x80 response
|
|
0x01 query
|
|
3 1 flags
|
|
0xf error mask
|
|
0x3 error name
|
|
0x0 error none
|
|
4 2 number of questions, 1
|
|
6 2 number of answers, 0 for query
|
|
8 2 number of authority, 0
|
|
10 2 number of additional, 0
|
|
12 total size
|
|
for query
|
|
special formated host name follows
|
|
for request
|
|
special formated host name follows
|
|
then DNS answer messages follows
|
|
|
|
DNS Answer Message First Part (2 options)
|
|
0 1 c0 (compressed record)
|
|
1 1 skip
|
|
|
|
or a DNS encoded host name
|
|
|
|
DNS Answer Message Second Part
|
|
offset bytes meaning
|
|
0 2 type, 1
|
|
2 2 class, 1
|
|
4 2 time to live
|
|
6 2 length, 4
|
|
8 4 IP
|
|
12 total size
|
|
|
|
To query for IP address for hostname, the hostname must be
|
|
encoded after the message header in the special dot broken
|
|
encoding, followed by the following sequence of bytes:
|
|
0,1,0,1. So to encode "this.name.com",
|
|
|
|
4,'this',4,'name',3,'com',0, 0,1,0,1
|
|
|
|
When reading a DNS responce, and the second flag byte to error
|
|
mask to check for error. The question name is entered
|
|
immediately following the message header. To get to the
|
|
answers this name must be parsed by reading a number and then
|
|
skipping that number of characters, until the number read is
|
|
zero. You should probably check that the question matches the
|
|
hostname under question for security. The answers follow. The
|
|
answer may contain compressed name records or normal host name
|
|
records (with the dot broken encoding). Choose an answer with
|
|
a valid IP address.
|
|
|
|
|
|
________________________________________________________________
|
|
IP PACKETS
|
|
|
|
Offsets from Link Level Header (ethernet=14),
|
|
|
|
IP HEADER
|
|
offset bytes meaning
|
|
0 1 vhl
|
|
1 1 type of service
|
|
2 2 length of packet
|
|
4 2 ip id
|
|
6 2 ip offset
|
|
8 1 time to live, set to maximum 255 hops
|
|
9 1 protocol, 1=ICMP, 6=TCP, 17=UDP
|
|
10 2 ip checksum
|
|
12 4 source ip address
|
|
16 4 destination ip address
|
|
20 total size
|
|
|
|
TCP HEADER
|
|
offset bytes meaning
|
|
20 2 source port
|
|
22 2 destination port
|
|
24 4 sequence number
|
|
28 4 acknowledge number
|
|
32 1 tcp offset
|
|
33 1 flags
|
|
34 2 window
|
|
36 2 tcp checksum
|
|
38 2 urgp
|
|
40 total size
|
|
|
|
|
|
________________________________________________________________
|
|
ICMP - INTERNET CONTROL MESSAGE PROTOCOL
|
|
|
|
ICMP Header
|
|
|
|
offset bytes meaning
|
|
0 1 type (8=echo, 0=reply)
|
|
1 1 icode (0)
|
|
2 2 icmp checksum
|
|
4 2 id (0 or number to help match echos and replies)
|
|
6 2 sequence number (0 or like id byte)
|
|
8 total size
|
|
|
|
This is only enough to do a ping. The ICMP checksum is the
|
|
16bit one's complement of the one's complement of the sum of
|
|
the ICPM message starting at the type byte. What ever data
|
|
sent after the ICMP header in a echo should be returned in the
|
|
reply.
|
|
|
|
|
|
________________________________________________________________
|
|
UDP - USER DATAGRAM PROTOCOL
|
|
|
|
UDP Header
|
|
|
|
offset bytes meaning
|
|
0 2 source port
|
|
2 2 destination port
|
|
4 2 udp length (udp header + data)
|
|
6 2 udp checksum (use zero here when computing this)
|
|
8 total size
|
|
|
|
The UPD packet sits on top of the IP packet. The length for a
|
|
zero data size packet is 8. The checksum is the 16bit one's
|
|
complement of the one's complement sum of a pseudo header of
|
|
information from the IP header, the UDP header, and the data
|
|
padded with zeros if necessary to make a multiple of 2 bytes.
|
|
The pseudo header is as follows,
|
|
|
|
offset bytes meaning
|
|
0 4 source IP address
|
|
4 4 destination IP address
|
|
8 1 zero
|
|
9 1 protocol (17 for UDP)
|
|
10 2 udp length
|
|
|
|
If the computed checksum is zero it is sent as all ones. An
|
|
all zero checksum means that there is no checksum.
|
|
|
|
|
|
________________________________________________________________
|
|
FTP - FILE TRANSFER PROTOCOL
|
|
|
|
Work in progress...
|
|
|
|
|
|
________________________________________________________________
|
|
TCP
|
|
|
|
Work in progress...
|
|
|
|
|
|
|
|
________________________________________________________________
|
|
</pre>
|
|
|
|
</div></body></html>
|
|
|
|
|
|
|