ipconfig下的IPv4地址是什麼意思?

我上網是通過有線adsl,流程如下:

接網線 ------ 本地連接可用 ------ 設置PPPoE ------ 輸入ISP ------ 寬頻連接可用

然後在cmd窗口輸入ipconfig命令,它會返回IPv4地址:

PPP 適配器 寬頻連接:
IPv4 地址 . . . . . . . . . . . . . . : xxx.xxx.xxx.xxx
乙太網適配器 本地連接:
自動配置的 IPv4 地址 . . . . . . . . . : xxx.xxx.xxx.xxx

我還在百度搜索IP,它也會返回一個IP。

我有兩個問題:

  1. 首先,這三個IP都不一樣,那這三個IP分別是用來做什麼的,相互之間有什麼區別?
  2. 其次,下面是用python寫的一段socket代碼(摘自廖雪峰python 2教程)

import time, socket, threading

def tcplink(sock, addr):
print "Accept new connection from %s:%s..." % addr
sock.send("Welcome!")
while True:
data = sock.recv(1024)
time.sleep(1)
if data == "exit" or not data: break
sock.send("Hello, %s!" % data)
sock.close()
print "Connection from %s:%s closed" % addr

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("xxx.xxx.xxx.xxx", 9999))
s.listen(5)
print "Waiting for connection..."

while True:
sock, addr = s.accept()
t = threading.Thread(target = tcplink, args = (sock, addr))
t.start()

我嘗試分別把三個IP都綁定在s上,除了百度返回給我IP,其它兩個都可以運行。這是為什麼?如果我綁定了IP,別的客戶端可以訪問我么?


看到這個題目時,覺得和另外一個問題有異曲同工之妙,相輔相成,所以先回答了那個問題,有了那些基礎概念,再來回答這個問題如水到渠成,回答鏈接:

http://www.zhihu.com/question/51295773/answer/127512085

在那篇回答里描述了,區域網、廣域網、互聯網的差別,引入了三個名詞:LAN_IP,WAN_IP,Global_IP,其實我已經回答了題主的問題,你的三個IP和我的三個名詞一一對應。

綁定本地網卡的IP地址為LAN_IP,為本地路由器分配,只能在家庭區域網里遨遊。

綁定PPP虛擬介面的IP地址為WAN_IP,為運營商分配,可以在家庭區域網、運營商WAN里遨遊。用戶使用此IP上網,所以在區域網與運營商邊界處(路由器)無需做LAN_IP 與 WAN_IP的地址轉換(NAT)。

如果PPP撥號是在路由器上,用戶使用LAN_IP上網,則需要做NAT。

當WAN_IP包到達運營商WAN與Internet邊界時,需要做一次WAN_IP與Global_IP 的地址轉換,才可以允許進入互聯網,否則肉包子打狗有去無回啊!

第二個問題,為何無法綁定Global_IP,因為Global_IP與你隔著十萬八千里,沒有綁定你本地介面任何一個,怎麼會成功呢?

綁定LAN_IP,只有區域網的機器可以訪問你的IP;綁定WAN_IP理論上運營商可以訪問你,你自己的機器可以訪問,區域網的其它主機也無法訪問。


嗯,我來回答你的兩個問題。
第一個問題:
IP1是你網卡的本地乙太網的ip,介面是物理的,IP為私網。作用為物理通訊。
IP2是你PPPOE撥號上網的ip,電腦虛擬出來的介面,ip為私網。作用為認證、上網。
IP3是你互聯網出口的ip,ip是公網ip,主要作用讓你在互聯網有個合法的身份(IP)。
第二個問題:
因為這兩個ip都在你電腦的本地,且已經配置,所以可以運行。百度的IP是在你互聯網的出口那裡(路由器),所以你無法綁定。
如果你綁定了IP,別的客戶端可以訪問你,但關鍵是看誰訪問你。


百度搜索ip顯示出的是你的公網出口ip,該ip並不能標識你的主機,該ip是公用的,所以不能綁定該ip;
寬頻連接的ipv4地址是你在該區域isp提供的ip,可以理解為一個比較大的局部網路,但在該網路內,該ip此時分配給了你的主機,因此綁定該ip可以綁定你的主機。
本地連接是你電腦的內部區域網ip,與上一個寬頻連接的ip有所不同,你會發現兩個ip的網段不一樣,同樣該ip在該網路內也可以標識你的主機。

無論你綁定哪個ip,從其它網路是不能訪問到你的主機的,因為你的主機沒有分配到一個公網ip,外網的請求不能根據ip發送到你的主機。

建議你看一下計算機網路基礎這本書。


首先,網卡的ip 就是你實際物理網卡上配置的ip,ppp的ip,就是你的運營商分配給你的ip,這裡的ppp設備,就是一個虛擬的設備,只是物理層復用物理網卡而已,至於百度上看到的ip,我基本可以斷定你用的是移動鐵通 廣電 華數 之類小運營商的寬頻


bind函數兩個參數ipaddress和port,表示監聽的IP和埠,如果ipaddress是0.0.0.0表示監聽整個所有的ip地址發來的數據. 在你自己的電腦上測試的話,你綁定到127.0.0.1表示只接受來自本機的數據
如果想讓別的機器訪問你的主機,比如你在另外一台電腦上編寫了個client,py程序, 如果這台機器和你連的是一個網(通過一個路由器),你可以將client.py中的s.connect(("127.0.0.1", 9999))改成s.connect(("192.168.1.X", 9999)),具體你要看你的機器的內網IP是多少.如果這台機器和你連的不是一個網,你可以在路由器中配置開啟DMZ,並且把DMZ主機IP地址修改成你的電腦的內網IP,一般來講你在瀏覽器中進入192.168.1.1 然後找轉發規則那一欄,裡面有DMZ設置的(TP-LINK的路由器)


推薦閱讀:

IP層接收到比MTU大的數據包會先分片再重組,隨後在傳遞給上層協議(比如UDP)處理嗎?
TCP協議的滑動窗口具體是怎樣控制流量的?
為什麼路由器明明隔離廣播域,仍然可以全網廣播比如ARP協議?
IP地址和MAC地址的區別和聯繫是什麼?
TCP連接建立後,下行和上行經過的路由器是一樣的嗎?

TAG:Python | 計算機網路 | IP地址 | Socket | TCPIP |