1. 程式人生 > >計算機網路——在路由器設定NAT的情況下實現主機之間的通訊

計算機網路——在路由器設定NAT的情況下實現主機之間的通訊

我在學習計算機網路的時候發現很多主機的IP地址都是192.168.0.0/24格式的,這讓我感到疑惑,難道兩臺計算機會具有相同的IP地址嗎?隨著學習的深入,我才發現是因為引入NAT(Network Address Translation)機制,有關NAT的知識可以參考博文 https://www.cnblogs.com/dongzhuangdian/p/5105844.html ,這裡我不多做贅述。

NAT機制雖然能擴大IP的地址範圍,但也有個缺點,就是會遮蔽內網的主機,你無法通過公有網路直接訪問到內網的某臺計算機。

要想實現訪問內網的某臺計算機,你必須能夠設定連線內網路由器的NAT表。

1.查詢計算機IP設定


在這裡插入圖片描述
檢視該表可以發現,主機的網路關口(預設閘道器)是 192.168.0.1 ,私有IP是192.168.0.101
然後我們在瀏覽器中輸入網路關口IP地址192.168.0.1,可以看到下面的資訊
在這裡插入圖片描述
WAN口狀態指示的是外網的IP資訊,而LAN口狀態指示的當前內網的IP資訊。
我們可以看到,我們當前內網在因特網中是以IP 58.198.64.221 地址存在的,這個IP就是公有IP。

2.設定NAT表
在這裡插入圖片描述
通過以上的設定之後,如果從外網發來的報文,請求報文的目的埠號是65400的話,那麼這個報文就會被送向內網IP 192.168.0.101 這個主機的12300埠。這個主機就是我們當前的主機。

3.設定伺服器主機


我在臺式機上執行如下python程式碼:

from socket import *
serverPort = 12300
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind(('', serverPort))
print('The server is ready')
while True:
    recivedMessage, clientAddress = serverSocket.recvfrom(2048)
    print('接收到: ' + recivedMessage.decode())
    print(clientAddress)
    message = 'OK!'
    serverSocket.sendto(message.encode(),clientAddress)

這裡我用的UDP協議,用TCP也是一樣的。我讓這個程序作為伺服器,開啟埠12300,然後監聽網路資料,顯示收到的資料和傳送方的地址資訊,然後反饋資訊“OK!”給傳送方。執行該指令碼,顯示如下資訊:
在這裡插入圖片描述

4.設定客戶機
在另一臺電腦上執行如下python程式碼:

from socket import *
serverName = '58.198.64.221'
serverPort = 65400
clientPort = 5488
clientSocket = socket(AF_INET, SOCK_DGRAM)
clientSocket.bind(('', clientPort))
while True:
	message = input('INPUT A SENTENCE:')
	clientSocket.sendto(message.encode(),(serverName, serverPort))
	modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
	print(modifiedMessage.decode())
	print(serverAddress)
clientSocket.close()

這裡我用自己的膝上型電腦作為客戶機訪問桌上型電腦,觀察上述程式碼,我們設定伺服器的IP地址為58.198.64.221,也就是桌上型電腦的外網IP,然後埠號為65400。因為我們已經通過路由器設定NAT表,所以送往 58.198.64.211:65400的報文就會被送到 192.168.0.101:12300 。也就是我們桌上型電腦的伺服器埠。我們設定客戶機的套接字埠為5488,用來測試回顯。這個指令碼會不斷向伺服器(桌上型電腦)傳送網路,然後接受伺服器的反饋資訊,並顯示反饋資訊。
執行客戶機腳步,並輸入一些資訊:
在這裡插入圖片描述
我們在指令碼中輸入:hello! 你好呀
發現反饋瞭如下資訊:
OK!
{‘58.198.64.221’, 65400}
說明伺服器已經接受到了客戶機發送的資訊,並顯示了我們之前設定的反饋資訊OK!,以及伺服器的IP資訊。
我們觀察伺服器終端,可以看到如下資訊:
在這裡插入圖片描述
伺服器,也就是我們的桌上型電腦成功接收到了資訊,並顯示了接收資訊hello!你好呀,而且我們觀察IP地址資訊可以看到,資訊來自於 58.198.64.221:5488 。因為我的筆記本用無線網接入的是和桌上型電腦相同的網路,所以顯示的IP地址也是58.198.64.221,然後埠號就是我們之前在客戶機指令碼中設定的5488 。

這說明我們成功實現了兩臺主機通過因特網進行資訊互動!

想想當時還是有點小激動的。

因為是相同的IP,所以相當於客戶機的報文在因特網中轉了一圈又回到了原來發送的路由器,但路由器並不會記得這是不是之前發出的報文。