最近我正在用模拟器进行网络实验。我发现当MAC层队列已满时,上层(例如IP)仍然将数据包转发给它,此实现选择丢弃这些数据包。
我想知道的是,在实际的实现中,如Linux内核中的协议栈,如果MAC层的队列(接口的缓冲区?)已满,并且有更多的数据包来自socket,请选择它放弃它们或分配更多内存?为什么?
感谢。
答案 0 :(得分:1)
正确的方法应该是流出来。这会将堆栈的IP推回到套接字层。 send
或sendto
API将阻塞或失败,从而建立流控制(套接字不应该比MAC层可以发送的更快发送)。
甚至应该丢弃数据包的唯一时间是解复用点。这是有两个分支要发送到其中一个被阻止的情况。在这里你必须丢弃数据包,因为一个分支可能无法阻止流量流向一个分支,因为另一个分支被阻塞。但是只有一个发送分支,你总是流出来。