HTTP 的源端口是如何确定的? NAT中是不是有冲突? [关闭]

Posted

技术标签:

【中文标题】HTTP 的源端口是如何确定的? NAT中是不是有冲突? [关闭]【英文标题】:How is source port for HTTP determined? Is there ever collision in NAT? [closed]HTTP 的源端口是如何确定的? NAT中是否有冲突? [关闭] 【发布时间】:2013-03-20 10:27:44 【问题描述】:

我知道,当发出 HTTP 请求时,数据包会从客户端上看似随机的高编号端口(例如 4575)发送到服务器上的端口 80。然后服务器将回复发送到相同的高编号端口,路由器知道将其路由到客户端计算机,一切都完成了。

我的问题是:返回端口(本例中为 4575)是如何确定的? 是随机的吗?如果有,在什么范围内?有什么限制吗?例如,如果 LAN 中的两台计算机向同一个网站发送具有相同源端口的 HTTP 请求,会发生什么情况?路由器如何知道将哪一台路由到哪台计算机?又或者这种情况很少见,没人愿意防备?

【问题讨论】:

我很高兴听到反对者解释他们为什么不喜欢这个问题。 我没有投反对票 - 但我的猜测是这真的“不是一个编程问题” - 至少在表面上是这样。 即使这不是一个编程问题,它也可能非常有用,尤其是为了获得一个总体思路。此外,在编写脚本或其他自定义代码时会变得很方便 【参考方案1】:

NAT 将通过它自己的内部方式来决定/确定 NAT 连接/会话的 出站 端口。这意味着,它将根据 NAT 的实现而有所不同。这意味着任何返回的响应都将返回到同一个出站端口。

至于你的问题:

例如,如果 LAN 中的两台计算机发送 HTTP 对同一个网站使用相同源端口的请求?

它将为每个分配不同的出站端口。因此,它可以在收到的响应中区分这两者。 NAT 将创建/维护已转换端口的映射,为新会话创建新的出站端口号。因此,即使有两个不同的“内部”会话,来自两台不同的机器,在相同端口号上,它也会映射到传出端的两个不同端口号.因此,当数据包从各个端口返回时,它会知道如何将它们转换回内部 LAN 上的正确地址/端口。

图表:

【讨论】:

当NAT在路由器上并且请求来自计算机时,NAT如何设置源端口?请求不是在路由器知道它的存在之前就通过源端口发送到路由器吗? 是的 - 但是,NAT 然后在它和外部服务器之间使用 不同 源端口。关键是原始源使用一个端口,而 NAT 使用不同的端口。 NAT 在这两个端口号之间进行转换。这就是它可以区分来自不同内部 IP 地址的两个相同端口的方法。 这里,我给你画了一张[蹩脚]图来说明:bradgoodman.com/nat.png【参考方案2】:

这取决于 NAT 和协议。例如,我在一个完整的锥形 NAT 后面写这个消息,这个特定的 NAT 被配置(可能是硬连线)总是将一个 UDP 私有传输地址 UDP X:x 映射到公共传输地址 UDP Y:x。使用 STUN 服务器(谷歌有一些免费的 stun 服务器)、便宜的 NAT、2 台笔记本电脑、wire Shark 和一个非常轻巧的 STUN 客户端,它使用像 777 这样的硬编码端口,很容易阐明这种情况。只有第一个呼叫将通过并映射到原始端口,第二个呼叫将被阻止。 NAT 是一种黑客攻击,其中一些非常糟糕,以至于它们实际上在返回时覆盖了公共传输地址,不仅在标头中,甚至在传输的数据中,这有点疯狂。 ICE 协议必须对公共地址进行异或运算才能绕过此问题。

【讨论】:

以上是关于HTTP 的源端口是如何确定的? NAT中是不是有冲突? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何设置路由器的NAT端口映射

iOS:如何获取 http 连接的源端口

获取NAT转换的IP和某些本地端口的端口

浅谈NAT概念及原理,配置NAT 网络地址转换---PAT端口地址转换;

iptables nat 技术转发

iptables转发技术(NAT)