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
代理服務器
正向代理

反向代理
