WIZnet Developer Forum

[W5300]전송속도 문의입니다.

감사합니다.
w5300 16bit direct모드로 ftp서버를 구현중입니다.
server->client 파일전송시는 10MB/s이상의 속도로 파일전송이 이루어집니다.
client-> server로 전송시에는 1.6KB/s 정도의 속도밖에 나오지 않습니다.
socket() -> listen() -> send() or recvfrom() -> close()로 구성되어 있습니다.

socket(2, Sn_MR_TCP, 19800, 0x00)로 초기화 한 경우나
socket(2, Sn_MR_TCP, 19800, Sn_MR_ND)로 초기화 한 경우나 동일한 상황입니다.
테스트핀출력으로 확인해보니 약5초 간격으로 수신 이벤트가 발생하는 것으로 확인됩니다.
이 5초는 어디에 설정된 것이며, Sn_MR_ND로 딜레이 없도록 설정하여도 이렇게 되는 이유는 무엇인가요?

W5300은 서버로 구동할 때 속도 이슈를 말씀하시는 건지 확실하지 않습니다.
FTPC 나 FTPS나 W5300 입장에서는 똑같은 방식으로 동작합니다.
성능이슈가 생길 이유는 없습니다.

테스트 환경과 문제가 발생하는 패킷을 wireshark로 캡쳐하여 원본을 보내주시면 원인 분석에 도움이 됩니다. 가능하시면 사용중인 driver source code도 같이 첨부바랍니다.

답변 감사합니다.
루프문은 아래와 같습니다.

	while (1){
		if((len = getSn_RX_RSR(DATA_SOCK)) > 0){
			tov_tmr=OVER_TIME;
			if (len > MAX_BUF_SIZE) len = MAX_BUF_SIZE;
			recv(DATA_SOCK, rx_buf, len);
TP1_LOW;
			ret = f_write(&file, rx_buf, len, &bw);
TP1_HIG;
            if (ret) {
				disconnect(DATA_SOCK);
				sprintf(sckStr, write_fail, path);
				sockPutStr(CTRL_SOCK);
				break;
			}
		}

다시 확인한 결과 f_write항목을 제거하면 전송속도는 대략 10MB/정도 나옵니다.
f_write실행시간은 2ms정도 되는데 5초마다 f_write가 연속으로 7회정도 실행되고 나머지시간(5초-14ms)에는 len이 0인 상태입니다.
Wreshark로 캡쳐한 패킷을 첨부하였으니 보시고 회신부탁드립니다.

파형 192.168.10.60.zip (5.7 KB) 파형

패킷 분석 결과, W5300의 Windows Update Errata #2 인 것으로 보입니다.

수신 전용일 경우 W5300의 window update가 상대방에게 제대로 전송되지 않아 속도 저하 문제가 발생합니다.

이를 해결하기 위한 가장 좋은 방법은 강제로 수신시 마다 강제로 임의로 Data를 보내는 방법를 방법입니다만, FTP의 경우 Data 채널로 Data 수신이 발생할 경우 프로그램이 오동작 가능성이 있습니다.
오동작이 발생하지 않는다면 하기 코드와 같이 수행할 수 있습니다.

while (1){
		if((len = getSn_RX_RSR(DATA_SOCK)) > 0){
			tov_tmr=OVER_TIME;
			if (len > MAX_BUF_SIZE) len = MAX_BUF_SIZE;
			recv(DATA_SOCK, rx_buf, len);
                        send(DATA_SOCK, "0", 1); 
TP1_LOW;
			ret = f_write(&file, rx_buf, len, &bw);
TP1_HIG;
            if (ret) {
				disconnect(DATA_SOCK);
				sprintf(sckStr, write_fail, path);
				sockPutStr(CTRL_SOCK);
				break;
			}
		}

감사합니다.
강제전송 코드를 넣으니 증상이 개선됩니다.
그런데 한가지 문제가 더 발견되었습니다.
수신시 마다 len의 크기를 계속 더해보니 ftp로 보낸 파일의 크기보다 2가 큰 현상이 발견되었습니다.
받은 파일을 hex편집기로 열어보니 파일의 마지막에 임의의 2byte가 추가 되어 있습니다. 이부분도 확인 부탁드립니다.
파일의 크기에 관계없이 항상 +2입니다.
강제전송코드를 제거해도 같은 현상입니다.

W5300은 내부 메모리를 16bit로 사용하고 있습니다.
따라서, 홀수 바이트를 수신할 경우 dummy 바이트를 구분할 수 없는 문제가 있습니다.
따라서, 매 수신 패킷마다 실제 수신한 데이타크기를 알려주는 Lenght header 2byte가 추가되어 socket buffer에 저장됩니다.

따라서 getSn_RX_RSR()값과 recv()함수 return 값이 서로 다를 수 있습니다.
예로 100byte의 Packet 하나를 수신할 경우 전자는 102, 후자는 100을 리턴합니다.
여러 패킷이 수신버퍼에 쌓여 있을 경우, 차이는 더 날 수 있습니다.

증상으로 보아 header가 포함되어 계산된 것으로 보입니다.
수신한 파일은 마지막 2byte 말고 다른부분들이 원본과 정확히 일치하는지 확인 바랍니다.

그리고, ioLibrary 최신 버전을 사용하실 것을 권장합니다.
감사합니다.

recv함수의 리턴값을 받으니 증상이 없어지네요.
답변 감사합니다.
그럼 수고하십시오

Copyright © 2017 WIZnet Co., Ltd. All Rights Reserved.