2014-04-10 2 views
3

서버에 데이터를 지속적으로 보내는 TCP 클라이언트가 있습니다. 클라이언트와 서버가 성공적으로 연결되면 클라이언트는 몇 초 간격으로 데이터를 계속 전송합니다.리눅스에서 send-q TCP 소켓의 내용을 읽으십시오.

데이터를 거의 보내지 않은 상태에서 클라이언트와 서버 간의 연결이 끊어지면 TCP_retries2의 값에 따라 TCP가 데이터를 다시 전송한다는 것을 알게되었고이 값을 8로 구성하여 이후에 쓰기 오류가 발생합니다. 100 초. 그러나 send-q에는 승인되지 않은 패킷이있을 것입니다.

이 소켓을 닫기 전에 내 프로그램에서 send-q의 승인되지 않은 패킷의 내용을 읽는 방법이 있습니까? 아니면 데이터를 보내고 다시 연결 한 후 다시 보내야합니까? 이것을 구현하는 다른 방법이 있습니까?

답변

1

응용 프로그램이 데이터를 TCP에 제공하면 패킷의 수신 확인을 추적하는 것은 TCP의 책임입니다. ACK가 나타나지 않으면 RTO 알고리즘을 기반으로 패킷을 전달하는 것이 가장 좋습니다. 이제 ACK가 수신 될 때까지 데이터는 TCP_SEND_Q에 보관됩니다. 나는 응용 프로그램에서 어떤 제어가 있다고 생각하지 않습니다. 현재 상태는 TCP_SEND_Q입니다.

// i는 송신 데이터를 기억하고 당신이 어떻게해야합니까

// 다시 연결 한 후 다시 보내해야합니까? 이전 연결 상태가 없어 졌습니까? 클라이언트와 서버 응용 프로그램이 수신 한 내용과 오프라인으로 보낸 내용에 대한 이해를 유지할 때까지 새로운 연결을 통해 새로 시작해야합니다.

+0

답장을 보내 주셔서 감사합니다. 현재 신청서 승인을받지 못했습니다. 나는 클라이언트 측으로부터 재전송 time_out 오류를 받기 전에 100 초를 보낸 모든 데이터를 전송할 것을 생각했다. 나는 신청 수준 승인에 대해 생각해야한다. – Praveen

-1

탱고까지 2 걸립니다. 연결의 끝을 닫을 수 있고 연결의 다른 끝이 떨어질 때까지 기다립니다. 반대로 3 방향 핸드 셰이크를 생각하십시오.

연결을 닫은 후 다시 열 때까지 얼마나 걸립니까? 동일한 연결 정보를 사용하여 다시 연결하기 전에 TIME_WAIT 이상 기다려야합니다.

+0

TCP는 상대방이 연결을 끊을 때까지 기다리지 만 응용 프로그램이 대기하지 않습니다. close() 함수는 비동기입니다. 클라이언트에서 동일한 로컬 포트를 재사용하는 경우 TIME_WAIT 만 기다려야하며 아웃 바운드 포트 번호에 대해 다른 Han bozo 방화벽 규칙을 수행 할 이유가 없습니다. 아웃 바운드 포트 번호는 제거해야하며 아무 것도 수행하지 않고 응용 프로그램을 구현할 수 없게 만듭니다 . 그리고 당신은 실제로 그 질문에 대답하지 않았습니다. – EJP

1

아니요.

피어 응용 프로그램이 데이터를 수신했는지 알아야 할 경우 피어 응용 프로그램이 응용 프로그램 프로토콜을 통해 응용 프로그램에이를 다시 확인하게하고 승인되지 않은 데이터를 응용 프로그램에서 어떻게 든 보내야한다고 처리해야합니다 . 이것은 또한 트랜잭션 멱등성의 문제를 야기합니다. 그래서 당신은 무방하게 다시 보낼 수 있습니다.

당신이 IOCTL에 sendq의 크기를 얻을 수
3

: 만 원격 시스템의 커널 허용 무엇을 알려줍니다 sendq

SIOCOUTQ 
      Returns the amount of unsent data in the socket send queue. 
      The socket must not be in LISTEN state, otherwise an error 
      (EINVAL) is returned. SIOCOUTQ is defined in 
      <linux/sockios.h>. Alternatively, you can use the synonymous 
      TIOCOUTQ, defined in <sys/ioctl.h>. 

참고, 그 호스트에서 실행중인 응용 프로그램을 처리하는 것을 보장하지 않습니다 . 대부분의 실패는 통신 당사자간에 네트워크에 존재하지만,이 측정 기준은 성공적인 전송으로 명확한 증명을 위해 사용될 수 없습니다.

+0

200 바이트가 전송 대기 중이고'SIOCOUTQ'가 100을 반환한다고 가정합니다. 처음 100 바이트가 승인되었거나 마지막 100 일 수 있고 첫 번째가 라우팅에서 손실되었을 수 있습니까? – lvella

+1

TCP는 스트림 프로토콜이므로 바이트까지 모든 것이 수신되면 바이트 만 ACK 될 수 있으므로 예, 처음 100 바이트인지 확인할 수 있습니다. (SACK이라는 TCP 확장이있어 임의의 데이터 청크를 수신 확인하지만 TCP 구조체의 snd_una 값을 변경하지 않으므로 SACK이 사용되는 경우에도 올바르게 작성해야합니다.) –

관련 문제