2007-05-06

数据传输中的停止等待机制的实现

Views: 8711 | Add Comments

停止等待机制是数据传输的最基本机制. 发送方发送一个带有序号的包给对方, 然后在收到确认之后才发出下一个. 停止等待机制的实现简单, 在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;
}

Related posts:

  1. 构建C1000K的服务器(1) – 基础
  2. Libevent 2 HTTP 客户端示例
  3. Master-Workers 模式处理高负载
  4. 基于列的数据库
  5. 要记得清除 sockaddr_in
Posted by ideawu at 2007-05-06 21:35:21

Leave a Comment