2012-10-26 7 views
28

TCP 소켓을 열고 네트워크의 다른 소켓에 연결합니다. 그런 다음 데이터를 보내고받을 수 있습니다. 매초 소켓에 뭔가를 보내는 타이머가 있습니다.TCP 소켓 연결 시간 초과 없음

나는 강제로 연결이 끊어지면서 연결이 갑자기 중단된다. (이 경우 이더넷 케이블을 잡아 당긴다). 내 소켓은 여전히 ​​매초마다 성공적으로 데이터를 쓰고 있다고보고하고 있습니다. 이것은 약 1 시간 30 분 동안 계속되며, 쓰기 오류가 결국 발생합니다.

소켓이 마침내 다른 끝을 받아들이는이 시간 초과를 지정하는 것은 사라졌습니까? OS (Ubuntu 11.04)입니까, TCP/IP 사양입니까, 아니면 소켓 구성 옵션입니까?

+2

[this] (http://stackoverflow.com/questions/5907527/application-control-of-tcp-retransmission-on-linux)가 답변을 제공합니다. – SKi

답변

49

통신을 방해하지만 네트워크 케이블을 당겨도 TCP 연결이 끊어지지는 않습니다 (1). 케이블을 다시 연결할 수 있으며 IP 연결이 설정되면 모든 백 - 데이터가 이동합니다. 이것은 셀룰러 네트워크에서도 TCP를 신뢰할 수있게합니다.

TCP가 데이터를 보내면 응답으로 ACK가 필요합니다. 일정 시간 내에 아무 것도 나타나지 않으면 데이터를 다시 전송하고 다시 기다립니다. 전송간에 대기하는 시간은 일반적으로 기하 급수적으로 증가합니다.

ACK가 없으면 일부 재전송 횟수 또는 총 시간이 경과하면 TCP는 연결이 "끊어진 것"으로 간주합니다. 얼마나 많은 시간 또는 얼마나 오래 당신의 OS와 그 구성에 달려 있지만, 일반적으로 몇 분 정도 시간 초과됩니다. 리눅스의 tcp.7 man page에서

:

tcp_retries2 (integer; default: 15; since Linux 2.2) 
      The maximum number of times a TCP packet is retransmitted in 
      established state before giving up. The default value is 15, which 
      corresponds to a duration of approximately between 13 to 30 minutes, 
      depending on the retransmission timeout. The RFC 1122 specified 
      minimum limit of 100 seconds is typically deemed too short. 

이 가능성이 당신이 당신의 연결이 사라진 경우 감지하는 데 걸리는 시간을 변경 조정할 수 있습니다 값입니다.

(1) 예외가 있습니다. 운영 체제는 케이블이 제거 된 것을 알면 모든 연결이 "끊어진"것으로 간주해야한다는 것을 상위 계층에 알릴 수 있습니다.

+1

답변에 감사드립니다. – corvid

+0

매일 수천 개의 HTTP 요청을 처리합니다. 이제는 Websocket (nodejs)에서 작업하고 있습니다. 따라서 당연히 저는 오래된 소켓에 대해 더 알고 싶었습니다. 이제 How Socket SocketsWork를 알게되었습니다. 안정적이고 연결 지향적이며 호스트 특정 프로토콜입니다. 재시도 횟수는 OS에 따라 다릅니다! –