將地理位置不同的具有獨(dú)立功能的多態(tài)計(jì)算機(jī)及其外部設(shè)備,通過通信線路連接起來,在網(wǎng)絡(luò)操作系統(tǒng)、網(wǎng)絡(luò)管理軟件及網(wǎng)絡(luò)通信協(xié)議的管理和協(xié)調(diào)下,實(shí)現(xiàn)資源共享和信息傳遞的資源系統(tǒng)
網(wǎng)絡(luò)模型概述
計(jì)算機(jī)網(wǎng)絡(luò)之間以何種規(guī)則進(jìn)行通信,就是網(wǎng)絡(luò)模型研究問題。
網(wǎng)絡(luò)模型一般是指
OSI(Open System Interconnection開放系統(tǒng)互連)七層參考模型
TCP/IP四層參考模型
主機(jī)至網(wǎng)絡(luò)層(物理層 , 數(shù)據(jù)鏈路層) , 網(wǎng)際層 , 傳輸層 , 應(yīng)用層(應(yīng)用層 , 表示層 , 會話層)
網(wǎng)絡(luò)模型7層概述:
1.物理層:主要定義物理設(shè)備標(biāo)準(zhǔn),如網(wǎng)線的接口類型、光纖的接口類型、各種傳輸介質(zhì)的傳輸速率等。它的主要作用是傳輸比特流(就是由1、0轉(zhuǎn)化為電流強(qiáng)弱來進(jìn)行傳輸,到達(dá)目的地后在轉(zhuǎn)化為1、0)。 這一層的數(shù)據(jù)叫做比特。
2.數(shù)據(jù)鏈路層:主要將從物理層接收的數(shù)據(jù)進(jìn)行MAC地址(網(wǎng)卡的地址)的封裝與解封裝。常把這一層的數(shù)據(jù)叫做幀。在這一層工作的設(shè)備是交換機(jī),數(shù)據(jù)通過交換機(jī)來傳輸。
3.網(wǎng)絡(luò)層:主要將從下層接收到的數(shù)據(jù)進(jìn)行IP地址(例192.168.0.1)的封裝與解封裝。在這一層工作的設(shè)備是路由器,常把這一層的數(shù)據(jù)叫做數(shù)據(jù)包。
4.傳輸層:定義了一些傳輸數(shù)據(jù)的協(xié)議和端口號(WWW端口80等),如:TCP(傳輸控制協(xié)議,傳輸效率低,可靠性強(qiáng),用于傳輸可靠性要求高,數(shù)據(jù)量大的數(shù)據(jù)),UDP(用戶數(shù)據(jù)報(bào)協(xié)議,與TCP特性恰恰相反,用于傳輸可靠性要求不高,數(shù)據(jù)量小的數(shù)據(jù),如QQ聊天數(shù)據(jù)就是通過這種方式傳輸?shù)模?br>主要是將從下層接收的數(shù)據(jù)進(jìn)行分段和傳輸,到達(dá)目的地址后再進(jìn)行重組。常常把這一層數(shù)據(jù)叫做段。
5.會話層:通過傳輸層(端口號:傳輸端口與接收端口)建立數(shù)據(jù)傳輸?shù)耐?。主要在你的系統(tǒng)之間發(fā)起會話或者接受會話請求(設(shè)備之間需要互相認(rèn)識可以是IP也可以是MAC或者是主機(jī)名)
6.表示層:主要是進(jìn)行對接收的數(shù)據(jù)進(jìn)行解釋、加密與解密、壓縮與解壓縮等(也就是把計(jì)算機(jī)能夠識別的東西轉(zhuǎn)換成人能夠能識別的東西(如圖片、聲音等)。
7.應(yīng)用層: 主要是一些終端的應(yīng)用,比如說FTP(各種文件下載),WEB(IE瀏覽),QQ之類的(可以把它理解成我們在電腦屏幕上可以看到的東西.就是終端應(yīng)用)。
IP(確定某個計(jì)算機(jī))、端口號(確定一個應(yīng)用,如飛秋)、傳輸協(xié)議(UDP、TCP)
規(guī)定網(wǎng)絡(luò)地址的協(xié)議,叫做IP協(xié)議。它所定義的地址,就被稱為IP地址,標(biāo)示一臺計(jì)算機(jī)的唯一性。
目前,廣泛采用的是IP協(xié)議第四版,簡稱IPv4。這個版本規(guī)定,網(wǎng)絡(luò)地址由32個二進(jìn)制位組成。
習(xí)慣上,我們用分成四段的十進(jìn)制數(shù)表示IP地址,從0.0.0.0一直到255.255.255.255。
互聯(lián)網(wǎng)上的每一臺計(jì)算機(jī),都會分配到一個IP地址。這個地址分成兩個部分,前一部分代表網(wǎng)絡(luò),后一部分代表主機(jī)。比如,IP地址172.16.254.1,這是一個32位的地址,假定它的網(wǎng)絡(luò)部分是前24位(172.16.254),那么主機(jī)部分就是后8位(最后的那個1)。處于同一個子網(wǎng)絡(luò)的電腦,它們IP地址的網(wǎng)絡(luò)部分必定是相同的,也就是說172.16.254.2應(yīng)該與172.16.254.1處在同一個子網(wǎng)絡(luò)。
但是,問題在于單單從IP地址,我們無法判斷網(wǎng)絡(luò)部分。還是以172.16.254.1為例,它的網(wǎng)絡(luò)部分,到底是前24位,還是前16位,甚至前28位,從IP地址上是看不出來的。
那么,怎樣才能從IP地址,判斷兩臺計(jì)算機(jī)是否屬于同一個子網(wǎng)絡(luò)呢?這就要用到另一個參數(shù)"子網(wǎng)掩碼"(subnet mask)。
所謂"子網(wǎng)掩碼",就是表示子網(wǎng)絡(luò)特征的一個參數(shù)。它在形式上等同于IP地址,也是一個32位二進(jìn)制數(shù)字,它的網(wǎng)絡(luò)部分全部為1,主機(jī)部分全部為0。比如,IP地址172.16.254.1,如果已知網(wǎng)絡(luò)部分是前24位,主機(jī)部分是后8位,那么子網(wǎng)絡(luò)掩碼就是11111111.11111111.11111111.00000000,寫成十進(jìn)制就是255.255.255.0。
知道"子網(wǎng)掩碼",我們就能判斷,任意兩個IP地址是否處在同一個子網(wǎng)絡(luò)。方法是將兩個IP地址與子網(wǎng)掩碼分別進(jìn)行AND運(yùn)算(兩個數(shù)位都為1,運(yùn)算結(jié)果為1,否則為0),然后比較結(jié)果是否相同,如果是的話,就表明它們在同一個子網(wǎng)絡(luò)中,否則就不是。
IP地址 = 網(wǎng)絡(luò)地址 主機(jī)地址
A類IP地址:第一段號碼為網(wǎng)絡(luò)地址,剩下的三段號碼為本地計(jì)算機(jī)的號碼
1.0.0.1—127.255.255.254
(1)10.X.X.X是私有地址(私有地址就是在互聯(lián)網(wǎng)上不使用,而被用在局域網(wǎng)絡(luò)中的地址)
(2)127.X.X.X是保留地址,用做循環(huán)測試用的。
B類IP地址:前二段號碼為網(wǎng)絡(luò)地址,剩下的二段號碼為本地計(jì)算機(jī)的號碼
128.0.0.1—191.255.255.254 172.16.0.0—172.31.255.255是私有地址。
C類IP地址:前三段號碼為網(wǎng)絡(luò)地址,剩下的一段號碼為本地計(jì)算機(jī)的號碼
192.0.0.1—223.255.255.254 192.168.x.X是私有地址
D類 224.0.0.1—239.255.255.254
E類 240.0.0.1—247.255.255.254
127.0.0.1 回環(huán)地址,可用于測試本機(jī)的網(wǎng)絡(luò)是否有問題. ping 127.0.0.1
DOS命令 ipconfig:查看本機(jī)IP地址
xxx.xxx.xxx.255 廣播地址
UDP:
將數(shù)據(jù)源和目的封裝成數(shù)據(jù)包中,不需要建立連接;
每個數(shù)據(jù)報(bào)的大小在限制在64k;
因無連接,是不可靠協(xié)議;
不需要建立連接,速度快
TCP:
建立連接,形成傳輸數(shù)據(jù)的通道;
在連接中進(jìn)行大數(shù)據(jù)量傳輸;
需要連接所以是可靠協(xié)議;
必須建立連接,效率會稍低
端口號(確定一個應(yīng)用,如飛秋)
TCP與UDP段結(jié)構(gòu)中端口地址都是16比特,可以有在0—65535范圍內(nèi)的端口號。對于這65536個端口號有以下的使用規(guī)定:
(1)端口號小于256的定義為常用端口,服務(wù)器一般都是通過常用端口號來識別的。任何TCP/IP實(shí)現(xiàn)所提供的服務(wù)都用1—1023之間的端口號,是由ICANN來管理的;
(2)客戶端只需保證該端口號在本機(jī)上是惟一的就可以了。客戶端口號因存在時間很短暫又稱臨時端口號;
(3)大多數(shù)TCP/IP實(shí)現(xiàn)給臨時端口號分配1024—5000之間的端口號。大于5000的端口號是為其他服務(wù)器預(yù)留的
套接字=IP 端口
網(wǎng)絡(luò)編程也稱套接字編程
網(wǎng)絡(luò)上具有唯一標(biāo)識的IP地址和端口號組合在一起才能構(gòu)成唯一能識別的標(biāo)識符套接字。
Socket原理機(jī)制:
通信的兩端都有Socket。
網(wǎng)絡(luò)通信其實(shí)就是Socket間的通信。
數(shù)據(jù)在兩個Socket間通過IO傳輸。
為了方便我們對IP地址的獲取和操作,java提供了一個類InetAddress 供我們使用,此類表示互聯(lián)網(wǎng)協(xié)議 (IP) 地址。InetAddress(Inet4Address、Inet6Address)
static InetAddress getLocalHost() 返回本地主機(jī)的地址。 String getHostAddress() 返回文本表示中的IP地址字符串。 static InetAddress getByAddress(byte[] addr) 返回給定的原始IP地址 InetAddress對象。 byte[] getAddress() 返回該對象的 InetAddress原IP地址。 InetAddress in = getByName();//根據(jù)主機(jī)名或IP參數(shù) InetAddress返回對象String ip = in.getHostAddress();//獲取IPString hn = in.getHostName();//獲取主機(jī)名InetAddress lh = InetAddress.getLocalHost();//String getHostAddress() 返回文本表示中的IP地址字符串。
public class lx1 { public static void main(String[] args) throws Exception{ DatagramSocket fuwuduan = new DatagramSocket(6666); DatagramPacket kongbao = new DatagramPacket(new byte[1024], 1024); fuwuduan.receive(kongbao); byte[] shuju = kongbao.getData(); int len =kongbao.getLength(); String fasongdizhi = kongbao.getAddress().getHostAddress(); System.out.println(fasongdizhi "客戶端:" new String(shuju,0,len)); fuwuduan.close(); }}public class lx2 { public static void main(String[] args) throws IOException { DatagramSocket kehuduan = new DatagramSocket(); Scanner sc = new Scanner(System.in); System.out.println("聊天內(nèi)容:"); String talk = sc.nextLine(); byte[] bytes = talk.getBytes(); InetAddress lh = Inet4Address.getLocalHost(); String kehuduanAddress = lh.getHostAddress(); DatagramPacket shujubao = new DatagramPacket(bytes,bytes.length,lh,6666); kehuduan.send(shujubao); kehuduan.close(); }}
java針對TCP協(xié)議提供了兩個Socket類 1.客戶端 Socket java.net.Socket包下 Socket(InetAddress address,int port);//服務(wù)器ip,服務(wù)端端口 Socket(String host,int port);//服務(wù)端ip字符串,服務(wù)端端口 Socket s = Socket("192.168.11.123",6666); //發(fā)送數(shù)據(jù) 獲取通道中的流 OutputStream out = s.getOutputStream(); out.write("服務(wù)端,我來了".getBytes()); s.close(); 2.服務(wù)端 ServerSocket ServerSocket ss = new ServerSocket(6666); Socket sk = ss.accept();//阻塞時方法 阻塞此處 等待客戶端連接 連接上以后才會執(zhí)行下面代碼 一旦連接就返回該套接字 InputStream in = sk.getInputStream(); byte[] bytes = new byte[1024]; int len = in.read(bytes);//阻塞方法,未收到發(fā)過來的消息是不會往下走 報(bào)錯 String s = new String(bytes); System.out.println(s); ss.close();1.自定義結(jié)束標(biāo)記2:使用shutdownInput,shutdownOutput方法。//客戶端上傳文件結(jié)束后 直接結(jié)束流對象// public void shutdownOutput()//sk.shutdownOutput() ;
來源:https://www.icode9.com/content-1-386601.html