A packet (alternatively, datagram - the terms are basically synonomous, although in some contexts the two mean subtly different things) is the fundamental unit of information carriage in all modern communication networks.
A packet consists of a header, which contains the information needed to get the packet from the source to the destination, and a data area, which contains the information of the user who caused the creation of the packet. (A good analogy is to consider a packet to be like a letter; the header is like the envelope, and the data area is whatever the person puts inside the envelope.)
The life of one connection will usually comprise a series of packets; in some network designs, they will not necessarily all be routed over the same path through the network.
Many networks do not provide protection against loss, duplication, or misdelivery of packets. However, it is possible to layer a transport protocol on top of the packet service which can provide such protection; TCP is an example.
A datagram is a self-contained packet, one which contains enough information in the header to allow the network to forward it to the destination independently of previous or future datagrams. Thus, no setup is needed before a computer tries to send datagrams to a computer with which it has not previously communicated, unlike with virtual call protocols.
Some systems that use packets (e.g. ATM) require a connection setup stage before any packets can be sent, which is why this distinction is drawn between the two otherwise identical terms. Others, for instance the Internet Protocol, do not require prior setup, and there the two terms are used interchangeably.
The term frame is sometimes used to refer to a packet exactly as transmitted over the wire or radio.
See also packet switching.