问:
我们观察到使用ICMP报文来报告UDP数据报不可达。为什么TCP不用这个来指示丢失的报文段呢?
答:
TCP不使用ICMP来报告丢失的报文段有几个原因:
1. ICMP报文可能被过滤。某些网络会过滤ICMP报文,以防止ICMP攻击。如果TCP依赖ICMP来报告丢失的报文段,在这种网络上TCP将无法正常工作。
2. ICMP报文可能被阻塞或延迟。ICMP报文和普通数据报文一样,都可能被网络阻塞或延迟。如果TCP依赖ICMP,会导致TCP对丢失报文段的检测变慢,影响Congestion Control的效果。
3. ICMP报文中的信息可能不准确。ICMP报文中报告的丢失报文段的信息不一定准确,可能导致TCP产生错误的反应。
4. TCP有自己的机制来检测丢失的报文段。TCP使用定时器来检测丢失的ACK和数据报文段。此外,TCP还使用重复ACK来快速检测丢失的数据报文段。这些机制无需依赖ICMP,可以更加准确和及时地检测丢失的报文段。
5. TCP需要快速重传丢失的报文段。一旦TCP检测到丢失的报文段,需要快速重传,而不是等待ICMP报告。TCP的重传机制更加适合这种需求。
所以,总的来说,TCP不依赖ICMP的原因是:ICMP不够可靠,而TCP有更加可靠的内置机制来完成同样的功能。ICMP只作为TCP的辅助手段,用于在极端情况下报告丢失的报文段。在正常情况下,TCP主要还是依赖自己的检测和恢复机制。