答案1
我会纠正你的图表,见下图。
在一般意义、电子工程意义上使用“数据包”这个词很有用,而不需要太多混乱的 ISO OSI“层”术语。
一个数据包包含诸如源 IP、目标 IP 等信息,之后还有一些其他字段,这些字段可能被称为 TCP 段,其中包括 TCP 源端口、TCP 目标端口等字段。
补充说明-
在稍微复杂一点的情况下,您可能有两个连接,并且同一个源 IP 访问同一个目标 IP 和目标端口。但一个连接会有一个本地 TCP 端口,另一个连接有另一个本地 TCP 端口。如果您在 Web 浏览器中打开多个选项卡并访问同一个 Web 服务器,则可能会发生这种情况。另一种情况是您有多个 NIC。请记住,IP 属于网络接口(这比说它们属于“计算机”更准确)。一台计算机可能有许多网络接口、许多 IP。连接发生在网络接口之间。
答案2
TCP 连接由(本地主机、本地端口、远程主机、远程端口)唯一标识。(从技术上讲,协议也是标准的一部分,但如果我们将自己限制为 TCP,那当然就是 TCP。)
与路由器的连接示例:
- 本地主机:192.168.2.100(或类似地址)
- 本地端口:50000
- 远程主机:216.58.208.46(Google)
- 远程端口:80
如果您打开与 Google 的另一个连接,它将使用不同的传出端口,因此仍然可以唯一地识别它。
这也是您的操作系统用来将响应数据包路由回正确应用程序的方法。
答案3
所有应用程序都将使用一个随机端口供“内部使用”。这被称为本地端口。
通过查看 Resmon.exe,在Network
选项卡下,您可以看到 TCP 连接列表。这是每个程序打开的 TCP 连接。这将显示:
- 图像(使用 TCP 连接的程序)
- PID(这是应用程序正在使用的个人识别码)
- 本地地址(99% 的时间里是你的机器的 IP)
- 本地端口(我们正在讨论的端口是分配给每个 TCP 连接的随机端口号,以便可以在 Windows 中识别它们)
- 远程地址(这是应用程序正在连接的服务器/设备)
- 远程端口(应用程序正在使用的端口)
- 数据包丢失和延迟(数据包丢失的百分比和...延迟 - 或者有些人可能知道的 Ping)
总体而言,每个应用程序/TCP 连接(因为某些应用程序可以有多个,例如具有多个选项卡的 Web 浏览器)都会获得一个随机本地端口,可用于每个打开的 TCP 连接。
编辑:
感谢@Hennes 识别出端口大于 1023 且小于 65536。
所有不超过 1023 的端口都被保留,例如端口 80 等。最大端口号为 65535。
答案4
服务器上的 Web 服务器进程正在侦听端口 80 上的连接,以查找其自身 IP 地址上的连接。连接指向 IP 地址和一个端口,而不是一个或另一个。这样您的计算机就可以毫无问题地连接到 3 个不同 IP 地址上的端口 80。
您的 PC 未在连接的本地端使用端口 80。操作系统将使用其指定范围内的下一个可用本地端口。对于 Windows,从 1024(旧版本)或 16536(新版本)开始的端口用于连接。Linux 机器倾向于使用高范围的端口,高于 38000 左右。
您可以使用以下命令在 Windows(powershell)中确认此行为:
netstat -a | findstr <the servers IP address>
或者在 Linux 中(以 root 身份):
netstat -ntup | grep <the servers IP address>
并注意本地端口。它不是端口 80。
此外,有些服务器只监听某个端口上的新连接(如 FTP),并打开新连接以实际传输数据或提供服务。不过,此行为完全取决于相关守护进程。如果服务想要使用其他方式跟踪单个会话,则可以自由地这样做,并将所有流量保持在单个端口上,如 TCP/80。
编辑:解决您的扩展问题:
您的浏览器通过域名和 IP 地址而不是端口号来识别站点。每个操作系统或应用程序运行时都提供了一个版本的 Berkeley Sockets 方法,GetHostByName(string name)
它使用该方法通过域名查找远程服务器。在 TCP 层,正如我所提到的,您没有在本地使用 TCP/80(只有服务器使用 80,MSN 的服务器不可能混淆它是否是 Google),因此不存在歧义。
值得注意的是,当程序使用端口发送数据时,它似乎将数据流发送到本地端口,但需要记住的是,在创建该端口期间,IP 主机之间建立了 TCP 连接,因此端口已经知道该本地端口连接到的(唯一)远程 IP 地址。