2011-03-08 4 views
9

서버가 중단되거나 (클라이언트에 FIN 또는 RESET이 전송되지 않음) 반 개방 연결의 경우 클라이언트가이 끊어진 연결에서 일부 데이터를 보내려고하면 각 TCP 세그먼트는 un -ACKED. TCP는 일정 시간 후에 패킷을 재전송하려고 시도합니다. TCP는 몇 번이나 포기하기 전에 재전송을 시도 할 것이고이 경우 어떻게 될 것입니까? 호스트가 도달 할 수 없다는 것을 운영 체제에 알리는 방법은 무엇입니까? 이것은 TCP RFC에서 어디에 지정되어 있습니까?TCP가 몇 번 재전송합니까?

답변

13

프로그램 프로그램이 충돌하면 커널이 모든 열린 소켓을 적절히 정리합니다. (TCP 관점에서 보면 응용 프로그램 계층 프로토콜에 위배 될 수 있지만 응용 프로그램은이 이벤트에 대비해야합니다.)

서버 커널이 충돌하고 다시 돌아 오지 않는 경우 숫자와 소켓이 아직 또는 연결되지 않은 경우 재시도 타이밍 따라 달라집니다. (tcp(7)에서)

tcp_retries1 (integer; default: 3; since Linux 2.2) 
      The number of times TCP will attempt to 
      retransmit a packet on an established connection 
      normally, without the extra effort of getting 
      the network layers involved. Once we exceed 
      this number of retransmits, we first have the 
      network layer update the route if possible 
      before each new retransmit. The default is the 
      RFC specified minimum of 3. 

    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. 

서버 커널 충돌하는 경우와 , 그것의에 대해 알 수 없습니다까지 돌아 오지 않는다 소켓과 의지 RST 이러한 후속 패킷을 사용하면 오류를 훨씬 빠르게 처리 할 수 ​​있습니다.

장애가 발생한 단일 지점 장애 라우터가 중단되면 빠르게 다시 가동되면 연결이 계속 작동 할 수 있습니다. 이렇게하려면 방화벽과 라우터에 상태가 없거나 또는 stateful 인 경우 기존 연결이 계속 실행되도록 허용하는 규칙 집합이 있어야합니다. (잠재적으로 안전하지 않은 다른 방화벽 관리자는 이에 대해 다른 정책을 가지고 있습니다.) errnoECONNRESET (적어도 send(2) 이상)으로 설정된 경우 프로그램에 오류가 반환됩니다.

+0

블랙홀 경로, 재시도 후 소켓과 프로그램에 어떤 변화가 있었습니까? 소켓 상태가 CLOSED로 전환합니까? 또는 프로그램의 다음 쓰기/읽기가 xxx의 errno를 얻을 것인가? – Chinaxing

관련 문제