TCP 数据包的旅程和每一跳的变化(IP 地址和端口发生)

Journey of a TCP packet and changes (Ip address and port happens) in every hop

我试图了解在跃点期间 IP 数据包发生了什么样的结构变化。

请允许我举例说明我的问题。

traceroute -w 1 google.com

traceroute to google.com (216.58.199.174), 64 hops max, 52 byte packets
 1  192.168.0.1 (192.168.0.1)  1.055 ms  0.857 ms  0.822 ms
 2  10.0.0.1 (10.0.0.1)  2.038 ms  1.477 ms  1.540 ms
 3  * * *
 4  114.79.130.1.dvois.com (114.79.130.1)  3.091 ms  2.076 ms  2.329 ms
 5  10.241.1.6 (10.241.1.6)  3.245 ms  3.102 ms  3.358 ms
 6  10.240.254.140 (10.240.254.140)  4.388 ms  2.149 ms  2.319 ms
 7  10.240.254.1 (10.240.254.1)  3.067 ms  3.336 ms  2.852 ms
 8  10.241.1.1 (10.241.1.1)  2.542 ms  2.339 ms  3.231 ms
 9  1.186.191.10.dvois.com (1.186.191.10)  3.046 ms  3.076 ms  3.382 ms
10  216.239.62.212 (216.239.62.212)  3.290 ms  3.559 ms  3.466 ms
11  209.85.143.5 (209.85.143.5)  3.699 ms  3.250 ms  4.062 ms
12  bom05s08-in-f174.1e100.net (216.58.199.174)  3.739 ms  4.038 ms  3.803 ms

假设我正在向 google.com

发出请求

来自我的 machine 的 IP 数据包首先会在数据包中添加这个位。

  1. (我的 machine)源 IP 即假设它是 192.168.0.100
    • 还从发出请求的地方分配了一个端口号,为简单起见,假设它是 6000
  2. 目标IP即google.com IP 216.58.199.174(为了简单起见,也分配了目标端口,假设它是80
  3. 我的 mac 地址

IP数据包还包含其他细节,但我们只关注这3部分

现在我知道 IP 数据包是在其他设备/路由器的帮助下从源传输到目的地的(在 traceroute 输出中可以看到)

但是我不清楚IP包中的源IP和端口是否在Hop中更新。

我假设它确实如此因为来自服务器(google这里的服务器)的响应可以被中继回请求的预期发起者(即我的笔记本电脑浏览器 window)。

所以如果我的假设是正确的。那么事情是如何运作的

在第一次跳到我的路由器时,我的路由器将源 IP 更新为 192.168.0.1 并将源端口更新为 6001(假设) 在内部它维护一个反向条目 table 告诉如果我碰巧在 192.168.0.1 端口 6001 上收到响应,那么我必须将它路由到 192.168.0.100 端口 6000.

在每个跃点(跳到 114.79.130.1.dvois.com1.186.191.10.dvois.com 和其他)中同样明智,一个条目被更新,即源 IP 和源端口(在 IP 数据包中)和反向映射被维护以中继回复。

我的理解对吗?。还有一个发生在 MAC 中的事情。

看这里:https://en.wikipedia.org/wiki/Time_to_live 每跳 TTL 值都会减少。值为 0 时,数据包将被杀死。 L2 设备没有任何改变。 L3(路由器)设备重写 L2 信息(MAC) IP地址被NATs、FWs、Proxy等改变。通用路由器既不更改 IP 也不更改端口(源和目标)值。它改变了 TTL。它可能会重写服务条款。

嗯。

看。每个路由器都有一个网络范围的默认网关,因此如果它处理从 IP A 到某个远程 IP C 的数据包,则不需要重写任何内容。它只知道它必须将此数据包转发到接口,例如 3。 当然可能会有route cost等很多设置,但是一般都是这样的。 它不需要记住和存储你的table。它只有路由 table 与邻居路由器互通。

您需要查看网络层。应用程序将数据发送到传输层,例如TCP.

TCP 具有称为端口的地址,应用程序被分配给其中一个地址,在您的示例中为端口 6000。 TCP会对这些数据进行分段,将TCPheaders放在数据段上。 TCP headers 包括源和目标端口号。

TCP 会将数据段发送到第 3 层(IPv4 或 IPv6)。 IP 会将 TCP 段封装到 IP 数据包中。 IP 数据包 headers 将包含源 IP 地址和目标 IP 地址。

IP 会将 IP 数据包发送到第 2 层,例如以太网。并非所有第 2 层协议都使用 MAC 地址。 MAC 地址由 IEEE LAN 协议使用。其他第 2 层协议使用其他东西,或者根本不使用任何东西来寻址。以太网会将第 3 层 IP 数据包封装在第 2 层以太网帧中。以太网帧将具有源地址和目标地址 MAC。主机(您的计算机)将屏蔽源和目标第 3 层 IP 地址以确定目标地址是否在同一 LAN 上。如果目标在同一个 LAN 上,则帧将使用目标主机的 MAC 地址寻址,否则它们将使用配置的网关的 MAC 地址作为目标主机寻址。这将需要将第 3 层地址解析为第 2 层地址。 ARP(地址解析协议)将查看目标主机 MAC 地址是否在其 ARP 缓存中。如果没有,它将发送一个 ARP 请求以获取目标 MAC 地址。

然后第 2 层会将帧发送到第 1 层(物理接口)进行编码并放置在线路上。

当路由器接收到帧时,包含 MAC 地址的第 2 层帧从数据包中剥离并丢弃,从而丢失原始 MAC 地址。路由器将递减 TTL 并创建一个新的 header 校验和,并检查第 3 层 IP 数据包的目标地址。然后路由器将在其路由 table 中查找如何到达目标 IP 地址。如果在它的路由 table 中没有找到到目的 IP 地址的路由,则丢弃该数据包,否则路由器将把该数据包切换到下一个到达目的接口的接口,并为它创建一个新的二层帧新界面。如果下一个接口是 WAN 接口,它可能会使用不使用 MAC 地址的 PPP 之类的东西。

路径中的下一个路由器将获得新帧,并重复路由过程。这种情况会发生,直到数据包到达最后一个路由器,最后一个路由器将为目标 LAN 放置一个帧。目标主机将以与发送主机相反的顺序进行处理。目标主机将具有来自数据包和段的源第 3 层和第 4 层地址,并且它可以使用这些地址以与原始主机作为发件人相同的方式发回源。

路由器是三层设备,只看三层数据包,不看四层网段。路由器只会更改数据包的 TTL 和 Header 校验和字段。