停止等待机制是数据传输的最基本机制. 发送方发送一个带有序号的包给对方, 然后在收到确认之后才发出下一个. 停止等待机制的实现简单, 在TFTP协议中使用. 但是它的传输时延与网络时延成正比, 因为当数据在线路上传输的时候, 发送方和接收方什么也不做, 只是等待. 如果需要高的吞吐率, 就应该使用滑动窗口机制(TCP协议使用)等.
正如前面所说的, 停止等待机制容易实现, 下面给出使用UDP实现停止等待机制的代码:
// Send data and wait for an ACK. Return bytes sent. // If error occurs, return -1; int send_packet(int sock, struct Packet *packet, int size){ struct tftpx_packet rcv_packet; int time_wait_ack = 0; int rxmt = 0; int r_size = 0; for(rxmt = 0; rxmt < PKT_MAX_RXMT; rxmt ++){ if(send(sock, packet, size, 0) != size){ return -1; } for(time_wait_ack = 0; time_wait_ack < PKT_RCV_TIMEOUT; time_wait_ack += 5000){ r_size = recv(sock, &rcv_packet, sizeof(rcv_packet), MSG_DONTWAIT); if(r_size > 4 && rcv_packet.cmd == htons(CMD_ACK) && rcv_packet.seq== packet->seq){ // Valid ACK goto send_done; } usleep(5000); } // Retransmission } if(rxmt == PKT_MAX_RXMT){ // send timeout printf("Sent packet exceeded PKT_MAX_RXMT.\n"); return -1; } send_done: return size; }