Foreward It is generally thought that a computer network is a group of two or more computers that communicate through a transmission medium with their main purpose being to share resources, both physical and logical, such as files, devices (such as printers and modems) and services. Basically, they consist of two fundamental things, devices and connections. However, even this will not be of any real practical use since there is no way in which for humans to use the network to receive or distribute data. Hence, the basic neccessities for a successful and useful computer network are a communication link, an interface to the link and software to access the link. Note that for the rest of this document, the words "link" and "connection" will be loosely synonymous. So how does the theory of information distribution actually apply in the real world? Well, firstly, communication can take a number of forms. Namely, simplex, half-duplex and duplex. In the case of simplex, this form of communication is when only one party can only listen and the other can only send. In the case of half-duplex, each party must be listening or sending but not both. Finally, duplex or full-duplex communication occurs when both parties can receive and send information at the same time. Secondly, a common standard must be agreed to as to who will take precedence. ie. a "common language" to determine whether there should be priority levels on messages (in case there is an emergency), what type of error correction should occur (ie. whether a simple mechanism such as even-parity will suffice or whether something more sophisticated is required such as CRC-32), what should happen when an error in communication does occur, etc.... In other words, a protocol must be formed. In the network setting, a protocol is an agreement between communicating parties/entities on how communication is to progress. Thirdly, it has been generally found that the most efficient and least error prone method by which to achieve these goals is through 'layering'. This idea will be explained further on in the sections entitled Layering and the OSI and TCP/IP network layering models but it basically involves abstracting information starting from the top where humans see it (messages) and breaking it down (ie. datagrames, packets, frames, cells and finally bits). As the information is sent up or down further information will be removed or added respectively to a 'header' which now forms a part of the original data. It is this header which contains the information necessary for error correction, message prioritisation, etc.... Further, it is as a direct consequence of this abstraction process that problems associated with network usage, programming and troubleshooting can be eased. For example, to the programmer it allows them to be able to add information to the data being manipulated so that there is a lower chance of data corruption as it travels through the network, so that transportation of the data is sped up and also so that there is some flow control. To the system administrator, it can form a valuable idea as to how to fix any potential issues. For example, let's say that there seems to be a network connection problem. The administrator can proceed in one of either two ways. He can move upwards through the layer hierarchy or downwards. Either way, he is reducing the problem search space as he proceeds through the stack.