端口是什么|深入理解什么是端口(port)

端口是什么(深入理解什么是端口(port))端口是什么|深入理解什么是端口(port)



每当看到有人的简历上写着熟悉 tcp/ip, http 等协议时, 我就忍不住问问他们: 你给我说说, 端口是啥吧! 可惜, 很少有人能说得让人满意... 所以这次就来谈谈端口(port), 这个熟悉的陌生人.

在此过程中, 还会谈谈间接层, naming service 等概念, IoC, 依赖倒置等原则以及 TCP 协议的一些重点知识.
常见端口在我们的日常开发过程中, 特别是后端的开发人员, 即便他没有真正理解端口的细节, 他还是会听过见过各类的端口, 这个东西几乎无处不在, 比如:
mysql 缺省用的 3306 端口,
redis 的 6379 端口,
tomcat 默认用的 8080 端口,
ssh 用的 22 端口,
等等...
当然我们最关注的还是 web 相关的端口, 涉及的主要为 80 和 443 两个端口, 下面就来重点说说.
端口是必须的吗?在本地 web 开发调试过程中, 我们可能都碰到过端口, 比如或许是/最著名的 8080 端口, 一般我们会这样去访问本地的 web 程序:
localhost:8080
但一旦 web 程序部署到了正式的网站中, 端口似乎就消失了, 正式的网址中就不需要端口了吗? 答案是否定的, 在这里起作用的是缺省值.
比如你访问我的网站: https://xiaogd.net, 这个 url 中似乎没有端口, 但其实是有的, 它有一个默认值 443, 所以完整的形式实际是这样的:
https://xiaogd.net:443.
你可以通过 Chrome 的开发人员调试工具看到这一点:
端口是什么|深入理解什么是端口(port)



可以看到, ip 地址后面跟着一个 443
如果你输入一个错误的端口, 比如 80, 像这样: https://xiaogd.net:80, 结果就是无法访问.
但是如果你改成 http://xiaogd.net:80, 它又可以访问了.
注意, 因为我服务器后台配置了 http 自动跳转 https 的 301 重定向, 所以最终浏览器会再次跳转到 https://xiaogd.net:443.
注意勾选 'Preserve log' 以保留日志, 可以看到第一个 80 端口的请求会被响应一个 301 跳转, 并指示跳转目标, 也即是 Location 字段中的 https 请求, 浏览器接收此跳转指示并重新发起 https 请求, 也即是图中第二个 xiaogd.net 的请求. 所以地址栏最终还是会变成 https 的, 特此说明.
此时如果你输入 http://xiaogd.net:443, 它又不能访问了...
那么原因是什么呢? 你找到规律了没有?
注意一个是 http, 一个是 https.
协议的缺省端口当你没有显式的在 url 中输入端口时, 浏览器实际上会根据所用的协议来为你指定一个缺省端口:
如果是 http 协议, 就使用 80 端口
如果是 https 协议, 就使用 443 端口
如果你自己输入端口呢? 那就用你输入的端口, 你输入啥就是啥, 输错了, 访问不了那就是你的责任了, 谁让你瞎搞来着?
本来不用你劳神的, 你偏要脱裤子放屁, 搞不好自然就是画蛇添足, 弄巧成拙了.
比如上面的用了 http 却输入了 443, 或者用了 https 却输入了 80, 就无法成功访问了.
另外, 如果你胡乱地输入一个比如 9527, http://xiaogd.net:9527, 自然也是无法访问的, 原因也很简单, 因为我的服务器上根本没有在 9527 端口上进行监听.
即便我有在 9527 端口上监听, 提供的也未必是 web 服务, 使用的协议可能既不是 http, 也不是 https, 所以你用浏览器试图去访问也可能会碰壁的.
当然了, 我是完全可以在服务器上的 9527 端口上再部署一个 web 服务的, 比如放一个 apache 或 tomcat server 之类的 web server 监听在那个端口上, 再放通防火墙, 安全组之类的, 也是可以访问的. 只是我没有这么去做而已.
那么为啥大家都不在那些奇奇怪怪的端口上提供 web 服务呢? 原因其实也很简单, 为了方便用户, 同时也减轻了用户的认知负担.
其实关于用户, 你只要记住两点就好了:
    用户是傻瓜
    用户是懒汉
深刻地理解了这一点, 你才可能成为一个好的程序员(包括但不限于产品经理, 设计师...)
其实呀, 何止了省略了端口呀, 你看看现在的地址栏, 不但 http, https 这些协议省了, 最末尾的斜杠 / 省了, 甚至连 www 都省了...
是的, 我也帮你们省了 www, 事实上你通过 https://www.xiaogd.net/ 也能访问到, 但如果通过 https://xiaogd.net/ 就能访问到, 又何苦去再去录入三个达不溜呢?
必须得承认, 缺省的存在是有很大的帮助的, 这其实是进步; 但另一方面, 这些缺省有时也会给不明就里的开发人员带来了百思特网一些困惑, 好像端口不是必要的, 但其实不是这样的.