NAT/NAPT技术
NAT的全称是network address translation,网络地址转换。NAT 能在对外通信时够将源 IP 转为新源 IP,对内通信时将目的ip转换成新目的ip,实现这个操作,靠的是地址转换表
但NAT的说法其实是不准确的,因为多个内网主机和同一个服务器通信,这时路由器的地址转换表中的多个条目,其源ip地址被转换成的的新源ip是相同的,那接收响应时目的ip就不知道转换成哪一个新目的ip,因为有多个条目,所以得引入端口,这就是NAPT,全名网络地址端口转换,相当于是NAT的完善版,加上端口后,就可以区分内网中的多个主机了
NAPT过程详解
拿客户端A作为例子,客户端B同理,客户端B主要用来体现NAPT的转换方式下可以解决内网中多个主机访问同一服务器的问题。
客户端A在网络层组装好了一个ip报文,其源ip地址10.0.0.10,端口1025,目的ip 163.221.120.9,目的端口80,然后根据目的ip查路由表,命中网关条目,下一跳ip就是10.0.0.1,还有对应发送接口,一起交给数据链路层,网卡驱动查arp缓存,得到网关的mac地址,然后封装mac头和尾,从发送接口发出,单播,其他主机网卡接收一看mac头里的目的mac地址,就丢包,然后网关收到后触发硬件中断,网卡驱动从网卡接收缓冲区中根据ip报头中的ip报文总长度将mac帧读出,然后去掉mac头和尾,IP报文交给ip层,IP层根据目的ip查路由表,这一次命中的也是默认网关,当网关查路由表命中网关条目时,就需要进行地址转换,下一跳ip我比如说是 202.244.174.1,还有对应发送接口,发送接口网卡的ip是202.244.174.37,然后IP层会将ip报文的源ip 10.0.0.10转换成202.244.174.37,源端口变成动态分配的端口,并在地址转换表中添加该次的转换,四元组{源IP 10.0.0.10 ,源端口 1025,目的ip 163.221.120.9,目的端口 80}和 {源ip 202.244.174.37,源端口 1025 ,目的ip 163.221.120.9 ,目的端口 80} 的映射关系条目,然后将转换后的IP报文、下一跳ip、发送接口都交给数据链路层,查arp缓存得到下一跳ip 202.244.174.1对应mac地址,然后封装mac头和尾,写进对应发送接口的网卡发送缓冲区中,最后发送到以太网中,这个网关的一个IP地址是202.244.174.1,我假如说的另一个网卡的ip 是163.221.120.88,那该网关接收到mac帧后,触发硬件中断,解包到ip层,然后查路由表,这次目的ip就在直连网络中,所以命中直连网络条目,网关命中直连网络条目就不用进行地址转换了,下一跳ip就是目的ip 163.221.120.9,还得到对应发送接口 ,然后将ip报文和下一跳ip和发送接口都交给数据链路层,数据链路层查arp缓存得到下一跳ip的mac地址,封装mac头和尾,将mac帧写进发送网卡的发送缓冲区,然后写TDT寄存器通知网卡,网卡发送到以太网中,163.221.120.9服务器收到了之后走协议栈,然后构建响应ip报文,其{源ip 163.221.120.9,源port 80,目的ip 202.244.174.37,目的端口 1025},然后查路由表,命中网关条目,得到下一跳ip 163.221.120.88,发送接口,交给数据链路层添加mac头,从发送接口发出,网关收到后,触发硬件中断解包到ip层,目的ip查路由表命中直连网络,下一跳IP是目的ip202.244.174.37,发送接口对应ip 202.244.174.1,然后封装mac头,发到以太网,网关接收到后,触发硬件中断,解包到IP层,因为网关本身是路由器,实际的目的ip肯定不是网关,所以查地址转换表,然后修改IP报文中的目的ip和目的端口,修改完之后根据目的ip查路由表,命中直连网络,于是下一跳ip是目的ip10.0.0.10,发送接口对应ip 10.0.0.1,一并交给数据链路层,最后主机A收到响应
总结:
1、地址转换发生在网关查路由表命中网关条目时
2、地址转换就是将源ip换成发送接口ip,源port换成动态分配的port,然后将四元组映射加进地址转换表中
NAPT对套接字的影响
tcp套接字
服务器监听套接字是三元组,这就不说了,客户端通信套接字标识的五元组是(客户端—服务器),也就是{tcp,本地IP 10.0.0.10 ,本地端口 1025,对方ip 163.221.120.9,对方端口 80},看服务器端,标识通信套接字的五元组是(某网关发送接口--服务器),也就是{tcp,对方ip 202.244.174.37,对方1025 ,本地ip 163.221.120.9 ,本地端口 80}
udp套接字
假如是udp套接字,那没什么影响,因为udp套接字是无连接的,用三元组标识,没有对方的ip和port
代理服务器
正向代理

反向代理
