http - 当我们在 TCP 数据包中有端口号时,为什么我们在 HTTP 的 HOST 标头中需要端口号?
问题描述
我知道HOST标头如何帮助我们在一个 IP 地址上拥有多个网站。在 HOST 标头中,我们可以选择指定“端口号”。(HTTP 默认为 80)
在 OSI 模型中,第 4 层负责处理“端口”,在重新组装数据包后,它可以将它们交给正确的应用程序/进程。
另一方面,HTTP 在 OSI 的第 7 层工作。所以在那一点上,我认为应用程序已经收到了正确的数据包并且知道端口号。
那么为什么HOST头有这个“端口号”部分,HOST头的这个“端口”如何帮助我们呢?
另外我想知道它们是否不同或可以不同?
解决方案
URL 中的端口与用于 TCP 连接的端口相同,并且与主机标头中的端口相同。
该协议是第 5/6 层,但绝对不是第 7 层。您可能会说它是第 6 层,但如果它是加密的,则可能不是,在这种情况下,TLS 将是 l5 和 http l6。
添加端口允许会话层指示操作系统使用哪个端口。
对于某些 L5 协议,应用程序知道默认端口,例如 http(80) https(443) ftp(21)。
但是,当您想通过不同的 L4 连接运行其中一个 L5 会话时,用户需要一种方法来指示 TCP 堆栈执行此操作。因此 http 的设计者决定在 URL 的末尾允许一个可选的 TCP 端口。
主机头中的端口告诉您客户端连接到哪个端点。例如 abc.com:80 和 abc.com:81 是不同的端点,但它们可以连接到同一个服务器实例。
虽然服务器确实可以通过查看套接字来确定用户连接到哪个端口,但服务器实现可能不支持这一点,或者将来可能需要保留它。
如果您的服务器需要主机头上的端口,则成为实现和需求的问题。
推荐阅读
- react-native - 看不懂React Native useEffect怎么用
- python - 使用简单列表填充嵌套字典
- python - Django:值的格式正确(YYYY-MM-DD),但日期无效
- java - 如何使用 RestTemplate 发布 Atom 条目和文件
- reactjs - 检测子参考何时发生变化
- python - 尝试使用 DataFrame 中的特定格式打印
- node.js - 如何将 base64 字符串转换为图像并使用节点 Js 将文件保存在我的工作区中?
- c# - SortedList 使用字符串表示法但按数字排序
- woocommerce-bookings - Woocommerce 预订类别视图
- python - C++调用Python如何处理SystemExit异常