我想了解在传输层使用套接字发送数据包时会发生什么。离开我计算机的所有数据包是否都首先到达我的 ISP 指定的地理位置?然后我的数据包是否通过我的 ISP 拥有的隧道传输,直到到达直接链接到原始服务器的隧道?它在哪个阶段到达 DNS?如果域名在离开我家之前没有转换为 IP,我的路由器如何知道包含用于 LAN 传输的数据包?
如果我听起来很幼稚,请原谅我,我只是在阅读 HTTP 的 RFC 规范,并试图将屏幕上的字符与真实事件联系起来。我所做的所有猜测都是推论,没有实际理解的基础。最好使用简单的语言,比喻会更好 :)
答案1
这更像是一个传输层问题。通过理解OSI模型。我之所以做出这种区分,是因为 OSI 模型具有physical layer
,因此当您问“...在物理层面上”时,这些词在网络技术中具有您可能不知道的特定含义,如果您向网络管理员提出这个问题,可能会导致一些混淆。
对你的问题的简短回答是,它离开你的家,经过一系列路由器(第一个在你家,然后是你的 ISP 的一些路由器,然后是其他网络的一些路由器),最终到达你的目的地。你和目的地之间几乎所有的路由器,就像 UPS 包裹递送过程中的一系列站点一样,让你的数据包一步一步(或“跳跃”)地“接近”目的地。究竟哪些路由器处理和帮助传递给定的数据包是在数据包传输过程中确定的,并且可以随时更改。还应该说,“每次跳跃都让你的数据包更接近”的含义只是一种尽力而为的事情,并不一定能保证——TCP 只是试图在传输过程中尽可能高效。
现在,这是一个简单化它实际上是如何工作的,但这个话题还有很多内容,无法在几段话内轻松回答。
因此,我向你推荐一个很棒的、相当详细的(假设你没有相关知识)TCP 解释,它是一系列立即安全!我推荐以下剧集作为该主题的精彩介绍和概述:
这些剧集首先会解释 TCP 的工作原理,然后介绍一些问题、挑战以及可能需要进行的未来更改/改进。这三集加起来需要 3-5 个小时,但我认为这足以真正深入地回答您的问题。您可以根据自己的兴趣多听(或少听)。
答案2
DNS 主要参与回答类似问题gethostbyname
(即查找与给定主机名对应的数字地址)。在少数情况下,您的计算机自己的 IP 堆栈会在不咨询 DNS 的情况下回答此类问题,通常是通过从本地 HOSTS 文件中获取地址。这曾经很常见,但现在已经变得相对罕见(HOSTS 文件在测试中仍然有用,并且被某些恶意软件用来将某些请求重定向到恶意软件作者选择的机器)。
当您向该地址发送数据包时,计算机的 IP 堆栈会确定从那里将数据包发送到何处。首先,它使用子网掩码来确定该地址是否为“本地”。如果是本地地址,它将使用 ARP 查找要将数据包发送到的以太网 MAC 地址(或其他地址,但现在主要是以太网)。如果地址不是本地地址,它将发送到默认网关地址。
假设它不是本地的,默认网关通常是您的路由器。您的路由器会将其发送到 ISP 的路由器,然后 ISP 会将其发送到另一个又一个路由器,直到它到达它应该去的地方。路由器之间有一些协议(RIP、RIPv2 等)来告诉彼此如何将数据包从一个地方发送到另一个地方。对于典型的家用路由器,事情很简单:任何非本地的东西都会到达一个地方。对于 ISP 的大型路由器,事情会稍微复杂一些——它通常会有几个其他地方可以发送您的数据包。RIP(及其朋友)为其提供了足够的信息来选择“正确”的那个(即,可能是最佳选择的那个)。
如果您想知道数据包去了哪里,大多数系统都提供了一个名为的程序tracert
,它可以追踪从您的机器到您指定的另一台机器的路由。
我看到@normalocity 已经发布了一个答案。不过,有一件事我要小心:他提到路由器让你的数据包更接近目的地。这是真的,但是仅有的这是一种虚拟意义上的,而不是物理意义上的。举个例子,有一次我使用 tracert 跟踪从我家里的机器到市中心大约 5 英里外的机器的路由。尽管两台机器都在科罗拉多州的科罗拉多斯普林斯,但我的数据包被路由到丹佛,然后到达圣何塞,然后再返回并到达另一台相当本地的机器。
答案3
您的问题包含太多部分。我将尝试简要回答每个部分。您必须深入研究每个部分才能了解更多。
DNS:并非所有数据包都发往 DNS。您的操作系统已经知道 DNS 服务器的 IP 地址(通过您的 ISP 配置),并通过联系该 DNS 服务器将 FQDN 转换为 IP 地址。
HTTP:因此,当你在浏览器中输入 www.foo.com 时,
- 你的操作系统通过联系已知的 DNS 服务器 IP 地址将 www.foo.com 解析为 IP 地址
- 通过 TCP 端口 80 连接到 www.foo.com 的 IP 地址并发送 HTTP 请求
路由:数据包如何到达另一个 IP 地址就是 IP 路由。阅读有关数据包交换网络的文章,了解逐跳路由。HTTP (TCP) 和 DNS 流量的路由方式相同(路由器不关心有效负载)。只是目的地会有所不同。
答案4
路由工作原理
- 接收或生成数据包,获取其目标 IP
- 遍历转发信息库 (FIB)(即路由表)中的每个条目,并找到匹配的最具体的条目。这里更具体意味着最高 CIDR 子网表示法。例如,如果两者都存在,则将选择 FIB 条目 192.168.2.1/28,而不是 192.168.2.1/24。
- 如果 FIB 中有两个完全相同的条目,则选择度量值较低的条目。
- 如果我们找到匹配的条目,则获取该条目的网关 IP 并将数据包发送到该 IP。
- 没有找到?将数据包发送到默认网关的 IP。
- 有多个默认网关吗?在它们之间循环,或者使用第一个并继续使用它,直到我们发现它不起作用,然后使用第二个(故障转移)
- 没有默认网关?丢弃数据包。
注意:
- 如果数据包的目的地是同一子网中的某个设备,则无需路由。因此,如果您位于 192.168.2.1/24 的 PC 将数据包发送到 192.168.2.2/24,则它不会通过默认网关或任何路由器发送该数据包。
- 任何接口都可以通过直接连接的方式为我们提供免费路由。因此,如果您有一个设置为 192.168.2.1/24(即子网掩码 255.255.255.0)的接口,您将获得一条免费路由。
- 为了实现此目的,Localhost 直接连接。
- 如果您运行 RIP、OSPF、BGP 之类的东西,它们可能会更新您的 FIB。
您的 ISP 的运营商级路由器有 FIB,并且过程相同。从一个路由器跳转到另一个路由器,经历相同的过程,直到到达目的地或数据包被丢弃。通常,您越往上走,FIB 就越大,并且来自 BGP 等的路由就越多。