Predetermined hardware or software activity designed to establish or maintain communication and/or synchronization between two machines or programs. Hardware handshaking uses voltage levels or pulses on wires to carry the handshaking signals whereas software handshaking uses data units carried by some underlying communication medium, which could still include pulses and voltages on wires in some capacity. The obnoxious noises you hear when fax machines and modems establish communication with one another are examples of handshaking. Specifically, they are trying to establish a communication speed (which is why you generally hear the pitch shifting up and down between the two), and possibly more in depth aspects such as error checking and so on. A simple handshaking protocol might only involve the receiver sending a message meaning “I received your last message and I am ready for you to send me another one.” A more complex handshaking protocol might allow the sender to ask the receiver if he is ready to receive or for the receiver to reply with a negative acknowledgement meaning “I did not receive your last message correctly, please resend it” (e.g. if the data was corrupted en route).