2013-04-28 2 views
15

TCP 3 방향 핸드 셰이크에서 세 세그먼트가 전송됩니다 (SYN, SYN ACK, ACK). 세 번째 세그먼트 (ACK)가 손실되면 어떻게됩니까? 발신자가 세그먼트를 다시 보내거나 연결 설정을 포기할 것입니까? 두 호스트가 세그먼트가 손실되었다는 것을 어떻게 알 수 있습니까?TCP 핸드 셰이크 세그먼트가 손실되면 어떻게됩니까?

+1

https://tools.ietf.org/rfc/rfc793.txt는 어떤 일이 발생하는지 설명합니다. –

+0

@EdHeal : 특정 부분을 지적 할 수 있습니까? – skrtbhtngr

답변

16

TCP는 모든 패킷에 시퀀스 번호가 있습니다. 따라서 패킷이 손실되었는지 여부를 쉽게 알 수 있습니다. 호스트가 패킷에 대해 ACK를 얻지 못하면 단지 재전송합니다.

비록 대부분의 경우 ACK가 손실 되더라도 아주 단순한 이유로 다시 보내지 않습니다. ACK 직후에 TCP 프로토콜을 연 호스트는 데이터 전송을 시작합니다. 이 데이터는 모든 TCP 패킷과 마찬가지로 ACK 번호를 가지므로 수신자는 ACK를받습니다. 따라서 SYN-ACK의 송신자는 다음 패키지에서 "암시 적"ACK를 얻으므로 ACK를 얻지 못했다는 사실을 신경 쓰지 않아야합니다.

SYN-ACK의 재전송은 데이터가 전혀 수신되지 않는 경우에만 필요합니다.

업데이트 :

우리의 SYN가 (이 수신 부문에서 아마) 인정 된 경우 수신 세그먼트의 우선 순위 수준해야 경기 : 나는 정확히이 지정된 RFC의 장소를 발견 을 다시 설정해야하는 경우 로컬 우선 순위 수준을 정확하게 지정해야합니다.

즉, ACK가 삭제되었지만 다음 패킷이 삭제되지 않으면 모든 것이 정상입니다. 그렇지 않으면 연결을 재설정해야합니다. 어느 것이 완벽하게 이해됩니다.

+2

핸드 셰이크의 최종 ACK 자체는 ACK가 아닙니다. –

+8

ACK를 ACK하면 실제 데이터 전송이 불가능합니다. –

+0

나는 그 점을 얻었다. 고맙습니다! – ZHOU

1

저는이 특정 상황에 대한 전문가는 아니지만 클라이언트가 연결되어 있다고 생각하지만 서버는 그렇지 않을 것이라고 생각합니다. 클라이언트가 서버에 데이터를 보내려고하면 서버는이를 거부하고 "연결"을 재설정 할 수 있도록 클라이언트에 RST 패킷을 전송합니다.

+0

서버는 SYN-ACK을 보낼 때 연결이 설정된 것으로 간주합니다. 그러나 이것은 구현 세부 사항 일 수 있습니다, 나는이 경우에 무엇을해야하는지에 대한 실제 사양을 찾지 못했습니다. 어쩌면 아무것도 없습니다. –

+0

@LennartRegebro : [RFC 793 Section 3.4] (http://tools.ietf.org/html/rfc793#section-3.4)에 따르면 서버는 최종 ACK를 수신 할 때까지 'ESTABLISHED'상태로 들어 가지 않습니다. 'SYN + ACK '을 보내면 여전히 SYN-RECEIVED 상태입니다. 클라이언트는'SYN + ACK '를 받으면'ESTABLISHED' 상태가됩니다. –

+3

발견 : "수신 세그먼트의 우선 순위 수준이이어야 로컬로 우선 순위 수준을 일치시켜야합니다 (리셋을 보내야하는 경우). 즉, ACK 및 * only * ACK가 삭제되면 연결이 설정됩니다. 더 많은 것들이 떨어지면 리셋됩니다. " –