This document discusses agreement protocols in distributed systems. It begins by defining agreement, why it is needed, and common problems that require agreement. It then covers assumptions made in consensus algorithms like failure models, synchronous/asynchronous communication, and network properties. Several failure types are described including crash, omission, and Byzantine faults. Solutions to the agreement problem are explored for synchronous and asynchronous systems under different failure assumptions. Key approaches and impossibility results are referenced.