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.