我正在开发一款需要在 GPRS/3G 网络上的智能手机上运行的应用。我正在执行位操作,因此每个字节都会通过 HTTP 标头浪费掉是糟糕。我所在地区的移动提供商大量使用代理等。Websockets 就无法工作。
端口 80 和 443 上的 HTTP 似乎总是可以,但这是否意味着我可以在同一端口上创建到服务器的 TCP 套接字连接并启动双向通信?我不认为 WhatsApp、Viber 等移动应用程序使用 HTTP 连接,但我没有找到有关其实现的任何详细信息,以及它们是否会采取任何措施使网络在 3G 上完美运行,或者它是否只是按原样运行。
答案1
TCP 和 HTTP 是不同的东西。
TCP 是传输层。根据定义,它负责在其上承载应用层协议(在您的情况下为 HTTP)。TCP 不通过端口运行。它是端口的仲裁者。换句话说,当您连接到 HTTP 服务器时,您将通过 TCP 端口 80 进行连接。当您连接到 HTTPS 时,您将通过 TCP 端口 443 进行连接。
HTTP 和 HTTPS 可以在任何 TCP 端口上运行。80 和 443 只是常用端口。您可以让任何应用程序侦听这些端口(如果您愿意)。因此,是的,您可以使用其他协议(而不是 HTTP)通过端口 80 连接到您的服务器,但前提是服务器配置为使用该其他协议侦听该端口,并且 HTTP 或 HTTPS 配置为不是使用这些端口(假设您在其上运行 Web 服务器)。
现在,您提到您的提供商正在使用代理。您可以通过端口 80 或 443 建立非 HTTP/HTTPS 连接吗?这取决于代理的智能程度。如果它正在执行数据包检查,它可能会验证 HTTP 标头以确保通过这些端口的流量确实是 HTTP 流量。有办法伪造它,但这取决于代理检查流量的深度。如果代理阻止 HTTP/HTTPS 端口上的非 HTTP/HTTPS 流量,那么您除了向您的提供商抱怨(或根据情况支付更高的费用)之外,别无他法。
至于各种移动应用程序如何通信,这完全取决于供应商如何编写它们。大多数移动应用程序分别通过端口 80 或 443 使用 HTTP 或 HTTPS,因为大多数移动应用程序只是带外壳的 Web 应用程序。但没有规定说它们必须这样做,除非你以某种方式嗅探数据包,否则你无法真正知道。
我希望我已经回答了你的问题。
答案2
如果我正确理解了您的问题,我可能会将其改写为:“如果网络基础设施允许 HTTP 流量在某个端口上传递,那么它是否也允许纯 TCP(没有完全符合 HTTP 标准的操作甚至没有伪造的 HTTP 标头)在该端口上传递?”
不幸的是,答案是“这取决于您尚未发现的有关相关网络如何过滤流量的细节”。当然,有些网络基础设施仅根据端口号过滤流量,因此任何通过端口 80 或 443 的 TCP 流量都可能有效,无论 TCP 负载是否看起来或表现得像 HTTP。
但是,其他网络会插入 HTTP 代理或进行深度数据包检查,以查看流量是否真的有 HTTP 标头,这些类型的网络会阻止不合法的 HTTP 流量。您可以通过放置假的代理来绕过其中一些过滤器……
GET / HTTP/1.0\r\n\r\n
…在每个客户端到服务器 TCP 流的开头,还有一个假的……
HTTP/1.0 200 OK\r\n\r\n
…在每个服务器到客户端 TCP 流的开头。但这种伪造可能不足以使其通过完整的 HTTP 代理工作。