In this illustration, a black arrow extends diagonally downward from left to right and points to a blue circle labeled "Wait for call 0 from above." A blue arrow extends from the top of this circle and arcs rightward to a second blue circle. The arrow has two labels separated by a horizontal line. On top: "rdt_send(data)."
On bottom: "sndpkt=make_pkt(0,data,checksum) udt_send(sndpkt)."
The second blue circle is labeled "Wait for ACK 0." A smaller blue circle extends from the top right side of the circle and travels in a clockwise motion to the center right side of the same circle. This arrow has two labels. On top: "rdt_rcv(rcvpkt) && (corrupt(rcvpkt)|| isACK(rcvpkt,1))."
On bottom: "udt_send(sndpkt)."
A blue arrow extends from the bottom right side of the second circle and arcs downward to a third circle. This arrow has two labels. On top: "rdt_rcv(rcvpkt)? && notcorrupt(rcvpkt) && isACK(rcvpkt,0)."
On bottom: capital lambda.
A blue arrow extends from the bottom of the third circle and arcs leftward to a fourth blue circle. This arrow has two labels. On top: "rdt_send(data)."
On bottom: "sndpkt=make_pkt(1,data,checksum) udt_send(sndpkt)."
The fourth blue circle is labeled "Wait for ACK 1." A smaller blue arrow extends from the lower left side of the circle and travels in a clockwise motion to the center right side of the same circle. This arrow has two labels. On top: "rdt_rcv(rcvpkt) && (corrupt(rcvpkt)|| isACK(rcvpkt,0))."
On bottom: "udt_send(sndpkt)."
A blue arrow extends from the upper left side of the fourth circle and arcs upward to the first blue circle. This arrow has two labels. On top: "rdt_rcv(rcvpkt)? && notcorrupt(rcvpkt) && isACK(rcvpkt,1)."
On bottom: capital lambda.