我开始学习Linux网络和数据包过滤。 In the iptables documentation声明:
因此,假设主机上有3个服务器应用程序。 服务器A和B是TCP服务器, C是UDP服务器。 是真的,如果我们收到一个UDP数据包,在IP级别,这个数据包是为应用程序A,B,C交付的吗?或者应用程序套件A& B根本不会收到这个包吗?
答案 0 :(得分:3)
TCP服务器和UDP服务器以非常不同的方式运行。
最多一个TCP服务器将侦听给定的TCP端口(为简单起见,忽略了极端情况)。目的地为该端口的连接请求(封装在IP分组中)被一个进程“接受”(更准确地说,由具有对应于恰好一个侦听端点的文件描述符的进程接受)。 [remote_address,remote_port]和[local_address,local_port]的组合是唯一的。 TCP服务器实际上并不接收“数据包”,它接收的数据流与承载数据的基础数据包没有任何特定关系(数据包“边界”对接收进程不是直接可见的)。而且,既不是连接请求也不与任何现有连接相关联的TCP数据包将被丢弃。
使用UDP,每个UDP数据报在逻辑上是独立的,并且可以由多个侦听进程接收。也就是说,多个进程可以绑定到同一个UDP端点并接收发送给它的数据报。通常,每个数据报对应一个IP数据包,尽管数据报有可能被分成多个数据包进行传输。
因此,在您的示例中:不,正在侦听TCP请求的服务器(“TCP服务器”)将永远不会收到UDP数据包。 TCP和UDP的端口名称空间完全独立。
答案 1 :(得分:0)
数据包的传送取决于其目的端口。
让我们假设服务器A,B和C分别正在侦听端口1111,2222和3333,因此当到达目的地端口2222的数据包时,它将被传送到服务器B.
答案 2 :(得分:0)
我的问题没有很好地表达,不幸的是。当我看到答案时,我明白了。这是我正在寻找的解释,它来自http://www.cs.unh.edu/cnrg/people/gherrin/linux-net.html#tth_chAp6:
>当进程调度程序发现有网络任务要做时,它会运行网络的下半部分。此函数从积压队列中弹出数据包,将它们与已知协议(通常为IP)匹配,并将它们传递给该协议的接收函数。 IP层检查数据包是否存在错误并对其进行路由;数据包将进入传出队列(如果是用于其他主机)或传输到传输层(例如TCP或UDP)。该层再次检查错误,查找与数据包中指定的端口关联的套接字,并将数据包放在该套接字的接收队列的末尾。