摘自:http://topic.csdn.net/u/20090630/13/f3c5c6cc-020c-48ac-b1b7-df73820746ab.html?33795
作者:jinxfei
IP地址的記法:
IP地址由四個(gè)字節(jié)構(gòu)成,為了方便閱讀和書(shū)寫(xiě),每個(gè)字節(jié)用0-255的數(shù)字表示,字節(jié)之間用'.'分割,如:
10.10.152.235
有時(shí)候我們會(huì)看到這樣的IP:
10.10.152.235/24,
后面的/24表示子網(wǎng)掩碼,24表示子網(wǎng)掩碼上有24個(gè)1,等價(jià)于255.255.255.0 。
IP地址和子網(wǎng)掩碼按位 與,得到的是 網(wǎng)絡(luò)號(hào)(Network ID),
剩余的部分是子網(wǎng)內(nèi)的 主機(jī)號(hào)(host ID,當(dāng)然,這個(gè)名字小有問(wèn)題,因?yàn)楝F(xiàn)在有IP的可不僅僅是主機(jī),暫且這么稱呼吧),
特殊的IP地址段:
127.x.x.x
這是大家最熟悉不過(guò)的本地loopback地址,在windows和linux上等價(jià)于localhost。
我們習(xí)慣于使用127.0.0.1,實(shí)際上,
如果你在命令行下ping 127.0.0.1-127.255.255.254之間的任意地址,結(jié)果都是一樣的,它們是等價(jià)的。
正常的網(wǎng)絡(luò)包從ip層進(jìn)入鏈路層,然后發(fā)送到網(wǎng)絡(luò)上,
而發(fā)向loopback地址的包,直接在IP層短路了,也就是發(fā)到IP層的包直接被IP層接收了,不再向下發(fā)送。
私網(wǎng)地址段:
10.x.x.x、192.168.x.x、172.16.x.x~172.31.x.x、169.254.x.x
這些私網(wǎng)地址段是不允許出現(xiàn)在Internet上的,主用保留用于企業(yè)內(nèi)部組網(wǎng)使用,
這可以在一定程度上緩解IP地址不夠用的問(wèn)題。
大型企業(yè)的OA網(wǎng)用10地址段的比較多,因?yàn)檫@是一個(gè)A類地址段,包含的IP很多。
小公司用192.168.0地址段的比較多。
而169.254則主要是分配給DHCP服務(wù)使用的。
保留地址段:
128.0.x.x、191.255.x.x、192.0.0.x、233.255.255.x
這些地址被保留起來(lái),不做分配且沒(méi)有明確的用途。
其它特殊IP:
255.255.255.255是全局廣播地址,
主機(jī)號(hào)全部為1的地址是子網(wǎng)廣播地址,如:192.168.1.255
主機(jī)號(hào)全部為0的地址是代表該子網(wǎng)的網(wǎng)絡(luò)地址,如:192.168.1.0
一個(gè)非常特殊的IP:0.0.0.0
這個(gè)IP相當(dāng)于java中的this,代表當(dāng)前設(shè)備的IP。
我們?cè)趈ava編程中使用ServerSocket做網(wǎng)絡(luò)偵聽(tīng),通常只需要如下代碼:
ServerSocket serverSock=new ServerSocket(8888);
serverSock.accept();
假如我的主機(jī)ip為:10.10.152.8,
用以上代碼做偵聽(tīng),127.0.0.1:8888或者10.10.152.8:8888都可以連上,
但大家有沒(méi)有想過(guò)過(guò),這個(gè)ServerSocket到底使用哪個(gè)IP在做偵聽(tīng)?
如果我們將以上代碼改成顯式綁定:
ServerSocket ss=new ServerSocket();
String ip="10.10.152.8";
int port=8888;
InetSocketAddress addr=new InetSocketAddress(ip,port);
ss.bind(addr);
ss.accept();
你會(huì)發(fā)現(xiàn),127.0.0.1:8888是無(wú)法訪問(wèn)的,
而如果將ip改成127.0.0.1,那么10.10.152.8:8888是無(wú)法訪問(wèn)的。
實(shí)際上,背后的秘密就在與0.0.0.0這個(gè)IP,他可以代表本機(jī)的所有IP地址,
但這個(gè)IP并不是真是存在的,我們ping不通它,如果將ip改成0.0.0.0:
ServerSocket ss=new ServerSocket();
String ip="0.0.0.0";
int port=8888;
InetSocketAddress addr=new InetSocketAddress(ip,port);
ss.bind(addr);
ss.accept();
我們會(huì)發(fā)現(xiàn),這和默認(rèn)行為是一樣的,127.0.0.1:8888或者10.10.152.8:8888都可以連上
posted on 2009-07-02 16:06
狼人 閱讀(714)
評(píng)論(2) 編輯 收藏 所屬分類:
Java