2011-01-29 5 views
2

인터넷에서 TCP 프로토콜을 학습하고 실험을 시작합니다. http://www.diffen.com/difference/TCP_vs_UDPTCP 소켓 질문

"에서 기사를 읽은 후"손실 된 부품의 경우 메시지 확인 및 재전송을 관리하므로 TCP가 더 신뢰할 수 있습니다. 따라서 누락 된 데이터가 전혀 없습니다. " 나는 "TCP는 신뢰성"과 "재전송 부품을 잃었다"때문에 그것이 좋은 생각

while(! EOF (file)) 
{ 
    data = read_from(file, 5KB); //read 5KB from file 
    write(data, socket); //write data to socket to send 
} 

...하지만 그렇지 않다 :

는 그럼 난, 난 TCP 소켓 코드 블록을 내 실험을 쓰는가 잘 했어. 작은 파일은 OK이지만은 2MB의에 올 때, 가끔은 괜찮아요 항상은 아니지만 ...

이제

, 나는 또 다른 하나를 시도 :

while(! EOF (file)) 
{ 
    wait_for_ACK();//or sleep 5 seconds 
    data = read_from(file, 5KB); //read 5KB from file 
    write(data, socket); //write data to socket to send 
} 

그것은이다 ... 지금은 좋은

내가 생각할 수있는 것은 첫째 이유는 다음과 같습니다 : 1. 전송 속도가 프로그램의 쓰기 속도보다 느리기 때문에 송신자의 버퍼 오버 플로우가 발생합니다 (전송 속도는 TCP로 제어 됨) 2. 아마도 전송 속도 쓰기 속도보다 큽니다.하지만 일부 패킷은 손실됩니다 (일부 재전송 후에도 여전히 실패하고 TCP가 포기합니다 ...)

아이디어가 있으십니까? 감사합니다. .

+2

흠,이 코드는 어떤 OS 및 프로그래밍 언어입니까? – thkala

+0

@thkala +1, 저 "5KB"는 정말로 나를 음미합니다. – Mauricio

+0

Linux의 경우 C ... 5KB가 그 예입니다. 5KB 대신, 파일에서 1KB를 읽을 수있을 때마다, 다음에 1KB를 보내십시오. – user397232

답변

5

TCP는 데이터가 손실되지 않도록하지만 실제로 전송을 허용있어 얼마나 많은 바이트를 확인해야합니다 ... 전형적인 루프는

while (size > 0) 
{ 
    int sz = send(socket, bufptr, size, 0); 
    if (sz == -1) ... whoops, error ... 
    size -= sz; bufptr += sz; 
} 

입니다 전송을위한 버퍼가 전송해야하는 크기보다 작을 수 있으므로 결과적으로 sz (전송에 허용 된 바이트 수)이 더 적을 수 있습니다 size보다.

송신이 비동기식이라고 생각하는 것도 중요합니다. 즉, send 함수가 데이터를 반환하기 전에 데이터가 이미 목적지에 있지 않으면 전달할 TCP 전송 시스템에만 할당되었습니다. 수신 시점을 알고 싶으면 다른 시스템 (예 : 상대방의 회신 메시지)을 사용해야합니다.

+0

일부 재전송 후 패킷이 여전히 손실되면 어떻게됩니까? 이 경우 TCP가 오류 메시지를 반환하므로 catch 할 수 있습니까? 버퍼가 꽉 찼을 때 TCP 버퍼에 쓰기를 계속한다면 오버 플로우가 발생합니다.이 경우 sz = 0입니까? – user397232

+0

@ user397232 :이 경우 오류가 발생합니다 (및 sz = -1). 버퍼가 어떤 임계 값을 초과하면'send()'가 블록되어 일부 데이터가 전송 될 때까지 프로그램이 대기하게됩니다. – Javier

2

write(socket)을 확인하여 요청한 내용을 기록하는지 확인해야합니다. 모든 것을 보내거나 시간 제한을 계산할 때까지 반복합니다. 소켓 읽기/쓰기에 무기한 시간 초과를 사용하지 마십시오. 특히 Windows에서 문제가 발생하면 문제를 묻습니다. send 통화가 프로그램에서 일부 데이터를 수용 할 때