【问题标题】:Does different port number of different ip and transport protocol on the same machine differ同一台机器上不同ip和传输协议的不同端口号是否不同
【发布时间】:2013-08-20 09:29:30
【问题描述】:

假设我有一个网卡,它有两个地址 10.0.1.1 和 10.0.1.2,我有四个进程,每个进程都有一个套接字,1 使用 tcp 和 10.0.1.1:30,2 使用 udp 和 10.0 .1.1:30, 3 使用 tcp 和 10.0.1.2:30, 4 使用 udp 10.0.1.2:30。

这四个套接字是否都接收相同的数据包或谁与谁不同? 四个socket在一个进程中会影响结果吗?

【问题讨论】:

    标签: sockets networking tcp udp ip


    【解决方案1】:

    套接字不仅由它们的 IP/端口对标识,而且由它们的传输标识。这就是为什么在创建套接字时必须在绑定之前指定套接字类型的原因。因此,将 TCP 套接字和 UDP 套接字都绑定到相同的 IP/端口对是完全可以的,因为它们的传输方式不同。 UDP 数据包不能路由到 TCP 套接字,反之亦然(尽管它们可以路由到 RAW 套接字)。无论是在同一个过程中还是在不同的过程中使用它们都没有区别。

    【讨论】:

    • 那么,如果我将一个 tcp 套接字和一个原始套接字绑定到同一个 IP/端口,那么它们将收到相同的包还是会竞争相同的包?
    • 这取决于 RAW 套接字使用的协议。如果它使用 TCP,其中一个绑定将失败,因为它们试图绑定到同一个 TCP IP/端口,一次只能绑定一次。
    • 协议之外的端口不存在。如果你愿意,你可以有一个带有字母端口的协议。 TCP和UDP之间没有端口冲突的概念,因为端口不是一个独立的概念。听说过 IP 插座吗?我不这么认为。这就是原因。
    • @dspjm 原始套接字没有端口。
    【解决方案2】:

    EJP 给出了正确的答案。此外,即使所有套接字都在同一个进程中,但它们仍然会接收到不同的数据包。

    【讨论】:

    • 或者同一个线程,或者同一个类,或者同一个对象,或者同一个CPU,或者......'No'意味着没有。你不需要限定它。
    【解决方案3】:

    你有:

    TCP 10.0.1.1:30 UDP 10.0.1.1:30 TCP 10.0.1.2:30 UDP 10.0.1.2:30

    它们都是不同的。用于其中一个的数据包不可能传递给另一个。

    原因:

    1. TCP 和 UDP 端口占用不同的命名空间。
    2. 每个 IP 地址都有自己的一组端口。

    所以没有重叠、歧义、共享……

    【讨论】:

    • 谢谢你的回答,说的很清楚了,不过Remy的回答好像更详细....
    • 同意。我已经改进了一点。
    • 我不认为每个 IP 地址都有自己的一组端口。每个地址族都有自己的一组端口。因此,我们将为以下每种组合设置一组端口:TCP 用于 IPv4 地址,TCP 用于 IPv6 地址,UDP 用于 IPv4 地址,UDP 用于 IPv6 地址。每组由 64K 个数字组成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多