This document summarizes forward error correction techniques using convolutional encoders and Viterbi decoders. It first provides background on communication channels and the need for error correction when transmitting data. It then describes convolutional coding, a technique that maps a continuous stream of input bits to a continuous stream of encoded output bits using shift registers, with the encoded bits depending on current and past input bits. The key aspects of convolutional encoders are discussed, including parameters like the number of output bits, input bits, and shift registers. Generator polynomials are also introduced as characterizing the encoder connections. Viterbi decoding is highlighted as a maximum likelihood algorithm for decoding the trellis structure of convolutional codes based on soft decisions.