路由器是如何实现内外网转换的?

当客户端位于一个局域网(LAN)内并使用私有 IP 地址(例如 192.168.1.10)时,通常需要通过一个连接到公共网络的路由器进行外部通信。由于私有 IP 地址不能直接与互联网通信,路由器通常会通过 端口地址转换 (PAT)网络地址转换 (NAT) 来处理流量,使得局域网内部的多个设备共享一个公共 IP 地址访问外部网络。

场景设置:

  • 客户端(LAN 内部设备):

    • IP 地址:192.168.1.10
    • 端口号:50000(客户端的随机端口)
  • 路由器(网关设备):

    • 公共 IP 地址:203.0.113.1(此为路由器与外部网络(如互联网)连接的 IP 地址)
  • 目标服务器(互联网服务器):

    • 公共 IP 地址:198.51.100.10
    • 端口号:80(例如 HTTP 服务)

过程描述:端口地址转换(PAT)

  1. 客户端发送请求(发起连接)

    • 客户端(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 操作。

  2. 路由器进行 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

  3. 服务器响应请求

    服务器 198.51.100.10 收到客户端请求后,返回相应的 HTTP 响应包。由于数据包的目标端口号是 80,服务器知道这个请求是一个 HTTP 请求,便处理该请求并发送回响应。

    服务器发送的响应数据包:

    • 源 IP 地址:198.51.100.10(服务器的 IP)
    • 源端口号:80(HTTP 服务端口)
    • 目标 IP 地址:203.0.113.1(路由器的公共 IP)
    • 目标端口号:10000(映射的端口)

    服务器的数据包将通过路由器发送回客户端。

  4. 路由器进行逆向 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

  5. 客户端接收响应

    客户端 192.168.1.10 收到来自服务器的响应数据包,并成功与服务器完成通信。

相关推荐
迎風吹頭髮3 小时前
UNIX下C语言编程与实践58-UNIX TCP 连接处理:accept 函数与新套接字创建
c语言·网络·unix
猫头虎7 小时前
如何查看局域网内IP冲突问题?如何查看局域网IP环绕问题?arp -a命令如何使用?
网络·python·网络协议·tcp/ip·开源·pandas·pip
hello_25010 小时前
动手模拟docker网络-bridge模式
网络·docker·桥接模式
武文斌7710 小时前
项目学习总结:LVGL图形参数动态变化、开发板的GDB调试、sqlite3移植、MQTT协议、心跳包
linux·开发语言·网络·arm开发·数据库·嵌入式硬件·学习
爱吃喵的鲤鱼10 小时前
仿mudou——Connection模块(连接管理)
linux·运维·服务器·开发语言·网络·c++
爱吃小胖橘11 小时前
Unity网络开发--超文本传输协议Http(1)
开发语言·网络·网络协议·http·c#·游戏引擎
萧鼎11 小时前
Python schedule 库全解析:从任务调度到自动化执行的完整指南
网络·python·自动化
7哥♡ۣۖᝰꫛꫀꪝۣℋ12 小时前
网络层--数据链路层
网络·tcp/ip·智能路由器
_清浅12 小时前
计算机网络【第四章-网络层】
网络·计算机网络·智能路由器
沐浴露z13 小时前
【深入理解计算机网络08】网络层之IPv4
网络·计算机网络·网络编程·信息与通信·408