当客户端位于一个局域网(LAN)内并使用私有 IP 地址(例如 192.168.1.10
)时,通常需要通过一个连接到公共网络的路由器进行外部通信。由于私有 IP 地址不能直接与互联网通信,路由器通常会通过 端口地址转换 (PAT) 或 网络地址转换 (NAT) 来处理流量,使得局域网内部的多个设备共享一个公共 IP 地址访问外部网络。
场景设置:
-
客户端(LAN 内部设备):
- IP 地址:
192.168.1.10
- 端口号:
50000
(客户端的随机端口)
- IP 地址:
-
路由器(网关设备):
- 公共 IP 地址:
203.0.113.1
(此为路由器与外部网络(如互联网)连接的 IP 地址)
- 公共 IP 地址:
-
目标服务器(互联网服务器):
- 公共 IP 地址:
198.51.100.10
- 端口号:
80
(例如 HTTP 服务)
- 公共 IP 地址:
过程描述:端口地址转换(PAT)
-
客户端发送请求(发起连接)
- 客户端(
192.168.1.10
)希望访问位于互联网上的服务器(198.51.100.10
)的 HTTP 服务(端口80
)。 - 客户端在本地应用程序中发起连接,向服务器的 IP 地址
198.51.100.10
发送一个 HTTP 请求,源端口号是客户端随机选择的50000
。
客户端发送的原始数据包:
- 源 IP 地址:
192.168.1.10
- 源端口号:
50000
- 目标 IP 地址:
198.51.100.10
- 目标端口号:
80
路由器接收到这个数据包后,由于客户端的 IP 地址是私有地址(
192.168.1.10
),路由器需要执行 NAT 操作。 - 客户端(
-
路由器进行 NAT/PAT 转换
- 路由器对数据包进行 源地址转换 (Source NAT),将私有 IP 地址
192.168.1.10
替换为路由器的公共 IP 地址203.0.113.1
。 - 同时,路由器还会为每个不同的内部客户端连接选择一个唯一的 外部端口号 ,以便将来能够区分多个来自不同客户端的连接。在这个例子中,路由器可能将
50000
端口号映射到10000
端口,作为该连接的公共端口号。
路由器转换后的数据包:
- 源 IP 地址:
203.0.113.1
(路由器的公共 IP) - 源端口号:
10000
(路由器映射的外部端口号) - 目标 IP 地址:
198.51.100.10
(服务器的 IP) - 目标端口号:
80
路由器将转换后的数据包发送到目标服务器
198.51.100.10
的 HTTP 服务端口80
。 - 路由器对数据包进行 源地址转换 (Source NAT),将私有 IP 地址
-
服务器响应请求
服务器
198.51.100.10
收到客户端请求后,返回相应的 HTTP 响应包。由于数据包的目标端口号是80
,服务器知道这个请求是一个 HTTP 请求,便处理该请求并发送回响应。服务器发送的响应数据包:
- 源 IP 地址:
198.51.100.10
(服务器的 IP) - 源端口号:
80
(HTTP 服务端口) - 目标 IP 地址:
203.0.113.1
(路由器的公共 IP) - 目标端口号:
10000
(映射的端口)
服务器的数据包将通过路由器发送回客户端。
- 源 IP 地址:
-
路由器进行逆向 NAT 转换
路由器收到来自服务器的数据包时,会进行 目标地址转换 (Destination NAT),将目标 IP 地址
203.0.113.1
和端口号10000
替换回正确的内部地址和端口号。路由器通过 NAT 表格查找该数据包的源端口号(
10000
),并将其映射回原始请求的客户端 IP 地址和端口号(192.168.1.10:50000
)。路由器转换后的数据包:
- 源 IP 地址:
198.51.100.10
(服务器的 IP) - 源端口号:
80
(HTTP 服务端口) - 目标 IP 地址:
192.168.1.10
(客户端的私有 IP) - 目标端口号:
50000
(客户端原始端口)
然后,路由器将数据包发送回客户端
192.168.1.10
的端口50000
。 - 源 IP 地址:
-
客户端接收响应
客户端
192.168.1.10
收到来自服务器的响应数据包,并成功与服务器完成通信。