NACK 대 ACK? 언제 다른 것을 사용해야합니까?


19

개인적으로 나는 ACK가 필요하다고 느끼지 않습니다. 수신 된 각 패킷에 대해 ACK를 보내는 대신 손실 된 패킷에 대해 NACK (n)을 보내면 더 빠릅니다. 그렇다면 언제 어떤 상황에서 ACK over NACK을 사용합니까?


당신이 말하는 것에 대해 더 많은 맥락을 알려 주시겠습니까? 당신은 일반적으로 또는 TCP에 대해 묻고 있습니까?
Mike Pennington

TCP, UDP 또는 기타 특정 영역과 관련이없는 일반적인 네트워킹 질문입니다.
nFu9DT

답변:


29

ACK의 이유는 NACK만으로는 충분하지 않기 때문입니다. X 세그먼트의 데이터 스트림을 전송한다고 가정 해 봅시다 (간단 성을 위해 10이라고합시다).

연결 상태가 좋지 않고 세그먼트 1, 2, 4 및 5 만 수신합니다. 컴퓨터는 세그먼트 3에 대한 NACK을 전송하지만 세그먼트 6-10이 있어야한다는 것을 인식하지 못하고 NACK하지 않습니다.

따라서 세그먼트 3을 다시 보내지 만 컴퓨터는 데이터가 성공적으로 전송되었다고 잘못 판단합니다.

ACK는 세그먼트가 목적지에 도착했음을 보증합니다.

응용 프로그램이 데이터 순서와 재전송을 처리하도록하려면 UDP와 같은 프로토콜을 사용하도록 선택하면됩니다 (예 : TFTP처럼).


좋은 대답입니다. 그러나 첫 번째 패킷을 특수 패킷으로 지정할 수는 없었습니다. 여기에는 전송할 세그먼트 수가 포함됩니다.
Hari

4
그래도 데이터 수신 여부를 모르는 발신자의 문제가 남아 있습니다. 프로세스에 ACK가 없으면 보낸 사람이 아무 소리도 들리지 않으면 전체 데이터 흐름이 손실 된 경우에도 모든 데이터가 수신 된 것으로 간주해야합니다. ACK는 데이터가 수신되었음을 보증합니다.
YLearn

4

그것은 모두 손실 확률 분포와 트래픽 패턴으로 요약됩니다.

10-30 %의 꾸준한 손실률을 보이는 전형적인 무선 링크를 예로 들어 보겠습니다. 수신 된 각 프레임 (802.11abg 등)을 확인하면 프레임이 손실 된 시간을 신속하게 감지하여 시간 초과를 기다리는 시간을 잃지 않습니다.

대신 NAK를 사용하는 경우 트래픽 패턴에 따라 달라집니다.-단일 요청 패킷을 보내고 응답을 기대하고 해당 요청을 잃어버린 경우 시간이 초과되지 않으면 대답. -대부분의 뮤트받는 사람에게 패킷 스트림을 보내는 경우받는 사람이 다음 패킷을받을 때만 NAK를받는 것이 허용됩니다. 그러나 이는 수신자가 패킷을 다시 정렬해야하고 발신자가 전송 한 메시지의 백 로그를 추적해야한다는 것을 의미합니다.

(802.11n에서 어떤 솔루션을 선택했는지 추측하십시오. 수신기는 수신 한 프레임의 가변 길이 비트 맵을 전송합니다)

이제 일반적인 인터넷 네트워크를 사용하십시오. 문제가 발생할 때까지 거의 0 %의 패킷 손실이 발생하며 지수 분포 법에 따라 200ms 중단에서 1 분, 절반.

링크가 끊어졌을 때를 고려할 때까지 각 패킷을 획득하는 것은 손실이없는 네트워크에서 무의미 해 보일 수 있습니다. 아마도 연장 된 시간 동안 ACK 또는 NACK을 수신하지 않으며 수신기는 일반적으로 링크까지 아무것도 보내지 않습니다. 복원됩니다.

ACK를 사용하면 발신자가 전송을 중지하고 링크가 복원 될 때까지 백 로그를 유지합니다. 대신 NACK을 사용하는 경우 수신자는 오랫동안 보낸 사람의 백 로그에서 떨어진 패킷을받지 못했으며 연결을 본질적으로 복구 할 수 없다는 메시지를 표시 할 수 있습니다.


1

ACK는 슬라이딩 창 프로토콜에 유용하며, 전송기 A는 전송 된 데이터가 원격 B에 의해 수신되었음을 알 수 있습니다. 그런 다음 전송기 A는 전송 창이 가득 찰 때까지 (원격으로 전송되었지만 아직 전송되지 않은 데이터) 다음 데이터 전송을 진행할 수 있습니다. 인정).

ACK는 NAK보다 더 중요한 것으로 간주 될 수 있습니다. AAK가 보낸 패킷 / 블록이 B에 의해 수신되지 않고 B가 패킷 / 블록이 누락 된 것을 감지하는 경우 NAK는 더 빠른 복구 를 허용합니다 .

NAK없이 ACK만으로 안정적인 전송 및 흐름 제어를 지원하는 프로토콜을 완벽하게 구현할 수 있습니다 (트랜스미터가 어떤 경우에도 필요한 ACK, 재전송 메커니즘을 수신하지 않는 경우 송신기에 의한 재전송).


0

TCP에서 여기에 추가하고 싶은 가장 중요한 것은 모든 수신 패킷에 대한 ACK를 보내지 않습니다.

그러나 ACK는 LAST RECEIVED PACKET에 대해서만 전송됩니다.

내가 틀렸다면 정정 해주세요.


1
이것은 어느 정도 사실입니다. 예를 들어, ACK 또는 RST 플래그 만 설정된 세그먼트에는 ACK가 필요하지 않습니다. 또한, 지연된 ACK가 사용중인 경우, 모든 세그먼트마다 ACK가 없을 수 있지만, 일반적으로 이것은 모든 다른 세그먼트에 대해 ACK가 전송되도록 요구한다. 그러나 많은 TCP 연결은 지연된 ACK를 사용하지 않으며 데이터를 전송하는 모든 세그먼트에 대해 ACK를 보냅니다.
YLearn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.