2014-01-20 3 views
0

Linux C 프로그램에서 TCP 스트림 소켓을 사용하여 데이터를 전송합니다. 내 질문은 : 패킷 손실시 어떻게됩니까?Linux C 스트림 소켓의 TCP 메커니즘

Linux 소켓은 TCP 패킷 복구 메커니즘을 구현하여 잃어버린 패킷이 손실되면 시간 초과 후 다시 전송됩니까? 또는 send() 반환 값을 확인하고 데이터가 0 인 경우 다시 보내야합니까?

+3

TCP는 기본적으로 그 전체 목적입니다 ... 모든 그 acks 및 windows 및 프레임 'n'junk ...하지만 반환 값을 확인해야합니다 ... –

+0

그것에 대해 생각해야합니다 - 그것 *해야합니다 * 패킷 손실을 처리하십시오. 그렇지 않으면 스트림 인터페이스를 제공하기 때문에 API에 심각한 버그가 있습니다! API는 원할 경우에도 사용자에게 충분한 정보를 제공하지 않습니다. –

답변

4

TCP 소켓 또는 유닉스 도메인 소켓 (파일 시스템에인 경우 's'파일 유형으로 표시됨)을 사용하고 있는지 여부는 확실하지 않습니다. 그러나 2 가지 경우 중 하나에서 대답은 '예'입니다. 패킷 복구를 구현합니다 (유닉스 소켓에서는 손실/복구가 많지 않음). 데이터를 다시 보내지 않아도됩니다.

여전히 send()를 검사해야합니다. 누군가가 네트워크 케이블의 플러그를 뽑았거나 send()가 내부 버퍼를 오버플로하여 부분 전송 (다른 이유로 인해 send가 잘못 될 수 있음)이 발생하여 연결이 중단되었을 수 있습니다. 그러나 send()으로 끝내고 반환 값으로 일부 데이터를 "잊어 버렸다"는 메시지가 표시되지 않으면 완료됩니다.

send()가 완료되고 수신자가 모든 데이터를 가져 오기 전에 연결이 끊어 질 수 있습니다. 이를 확인하는 유일한 방법은 수신자가 데이터를 확인하도록하고 수신 확인을받는 경우 발신자 측에서 확인하는 것입니다. (나는 TCP ACK에 대해 여기서 말하지 않고있다.) 그러나 수신기가 모든 데이터를 얻은 후와 완전한 ACK를 받기 전에 연결이 끊어 질 수 있습니다. 이를 막아야 할 필요가 있다면 연결이 끊어진 후 다시 연결하고 처리 된 트랜잭션을 수신기에 요청하고 다른 트랜잭션을 다시 보내야하는 트랜잭션 구성표를 구현해야합니다.