標籤:
OSI模型包含7個層次:
(1)物理層(Physical Layer)
物理層是OSI參考模型的最低層,它利用傳輸介質為資料連結層提供物理串連。物理層的作用是通過傳輸介質發送和接收二進位位元流。
(2)資料連結層(Data Link Layer)
資料連結層是為網路層提供服務的,解決兩個相鄰結點之間的通訊問題,傳送的協議資料單元稱為資料幀。
(3)網路層(Network Layer)
網路層是為傳輸層提供服務的,傳送的協議資料單元稱為資料包或分組。該層的主要作用是解決如何使資料包通過各結點傳送的問題。
(4)傳輸層(Transport Layer)
傳輸層的作用是為上層協議提供端到端的可靠和透明的Data Transmission Service,包括處理差錯控制和流量控制等問題。該層向高層屏蔽了下層資料通訊的細節,使高層使用者看到的只 是在兩個傳輸實體間的一條主機到主機的、可由使用者控制和設定的、可靠的資料通路。
傳輸層傳送的協議資料單元稱為段或報文。
(5)會話層(Session Layer)
會話層主要功能是管理和協調不同主機上各種進程之間的通訊(對話),即負責建立、管理和終止應用程式之間的會話。
(6)展示層(Presentation Layer)
展示層處理流經結點的資料編碼的表示方式問題,以保證一個系統應用程式層發出的資訊可被另一系統的應用程式層讀出。資料壓縮和加密是展示層可提供的轉換功能之一。
(7)應用程式層(Application Layer)
應用程式層是OSI參考模型的最高層,是使用者與網路的介面。該層通過應用程式來完成網路使用者的應用需求,如檔案傳輸、收發電子郵件等。
TCP/IP分層模型:
(1)網路介面層
網路介面層包括用於協作IP資料在已有網路介質上傳輸的協議。實際上TCP/IP標準並不定義與ISO資料連結層和物理層相對應的功能。相反,它定義像位址解析通訊協定 (Address Resolution Protocol,ARP)這樣的協議,提供TCP/IP協議的資料結構和實際物理硬體之間的介面。
(2)網路互聯層
網間層對應於OSI七層參考模型的網路層。本層包含IP協議、RIP協議(Routing Information Protocol,路由資訊協議),負責資料的封裝、定址和路由。同時還包含網 間控制報文協議(Internet Control Message Protocol,ICMP)用來提供網路診斷資訊。
(3)傳輸層
傳輸層對應於OSI七層參考模型的傳輸層,它提供兩種端到端的通訊服務。其中TCP協議(Transmission Control Protocol)提供可靠的資料流運輸服務,UDP協議 (Use Datagram Protocol)提供不可靠的使用者資料報服務。
(4)應用程式層
應用程式層對應於OSI七層參考模型的應用程式層和表達層。網際網路的應用程式層協議包括Finger、Whois、FTP(檔案傳輸通訊協定)、Gopher、HTTP (超文字傳輸通訊協定 (HTTP))、 Telent(遠程終端協議)、SMTP(簡單郵件傳送協議)、IRC(網際網路中繼會話)、NNTP(網路新聞傳輸通訊協定)等。
用戶端與伺服器:
用戶端(client)是通訊的發起者;伺服器(server)程式則被動等待用戶端分清通訊。用戶端與伺服器組成了應用程式。
一個程式是作為用戶端還是伺服器,決定了它在與其對等端(Peer)建立通訊時使用的通訊端API形式。
通訊端:
Socket(通訊端)是一種抽象層應用程式通過它來發送和接受資料。現在TCP/IP協議族中的主要socket類型為流通訊端和資料通訊端。一個TCP/IP通訊端由一個IP地址、一個端對端協議(TCP或UDP協議)以及一個連接埠號碼唯一確定。
TCP通訊端編程:
1.伺服器初始化一個ServerSocket對象,指示通訊將要發生在那個連接埠上;
2.伺服器調用SErverSocket類的accept()方法。該方法會一隻等待,直到一個用戶端串連到伺服器上的指定連接埠;
3.在伺服器等待的同時,用戶端執行個體化一個Socket對象,指定要已連線的服務器名和連接埠號碼;
4.Socket類的構造器試圖將用戶端串連到指定的伺服器和連接埠號碼,如果通訊建立了,用戶端現在就有一個能夠與伺服器進行通訊的Socket對象;
5.在伺服器端,accept()方法返回一個將要串連到用戶端的通訊端的伺服器新通訊端的引用。
1 package Chap18; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.IOException; 6 import java.io.InputStreamReader; 7 import java.io.OutputStreamWriter; 8 import java.net.ServerSocket; 9 import java.net.Socket;10 /*11 * 服務端12 */ 13 public class Server {14 public static void main(String[] args) throws IOException {15 ServerSocket server = new ServerSocket(3001);16 Socket socket = server.accept();17 //寫18 BufferedReader reader = new BufferedReader(19 new InputStreamReader(socket.getInputStream()));20 char[] ch = new char[100];21 int len = reader.read(ch);22 System.out.println("從用戶端接收訊息:");23 System.out.println(new String(ch, 0, len));24 //讀25 BufferedWriter writer = new BufferedWriter(26 new OutputStreamWriter(socket.getOutputStream()));27 writer.write("你好我是伺服器");28 writer.flush();29 //釋放資源30 reader.close();31 writer.close();32 socket.close();33 server.close();34 }35 }
1 package Chap18; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.IOException; 6 import java.io.InputStreamReader; 7 import java.io.OutputStreamWriter; 8 import java.net.Socket; 9 import java.net.UnknownHostException;10 /*11 * 用戶端12 */13 public class Client {14 public static void main(String[] args) throws UnknownHostException, IOException {15 Socket socket = new Socket("127.0.0.1", 3001);16 //向伺服器寫入資料17 BufferedWriter writer = new BufferedWriter(18 new OutputStreamWriter(socket.getOutputStream()));19 writer.write("你好伺服器,我是用戶端");20 writer.flush();21 //從伺服器讀取資料22 BufferedReader reader = new BufferedReader(23 new InputStreamReader(socket.getInputStream()));24 25 char[] ch = new char[100];26 int len = reader.read(ch);27 System.out.println("從服務端接收到訊息:");28 System.out.println(new String(ch, 0, len));29 writer.close();30 reader.close();31 socket.close();32 }33 }
通訊端之間的相互連訊:一個Socket的InputStream和OutputStream屬性是兩台電腦進行相互連訊的途徑。
UDP通訊端編程:
作用:
將位元據從一台電腦發送到另一台電腦的非連線協定。這裡,資料被稱為資料包,它包含了資料將要發送到的目標伺服器和連接埠號碼。
資料報包的寄件者和接收者都使用java.net.DatagramSocket類分別發送和接收包。
DatagramSocket類的構造器:
1.DatagramSocket():建立一個DatagramSocket執行個體,並將該對象綁定到本機預設IP地址、本機所有可用連接埠中隨機播放的某個連接埠。
2.DatagramSocket(int prot):建立一個DatagramSocket執行個體,並將該對象綁定到本機預設IP地址、指定連接埠。
3.DatagramSocket(int port, InetAddress laddr):建立一個DatagramSocket執行個體,並將該對象綁定到指定IP地址、指定連接埠。
通過上面三個構造器中的任意一個構造器即可建立一個DatagramSocket執行個體,然後通過如下兩個方法來接收和發送資料:
receive(DatagramPacket p):從該DatagramSocket中接收資料報。
send(DatagramPacket p):以該DatagramSocket對象向外發送資料報。
DatagramPacket類的構造器:
接收資料報包的兩個構造器:
DatagramPacket(byte[] buf,int length):以一個空數組來建立DatagramPacket對象,該對象的作用是接收DatagramSocket中的資料。
DatagramPacket(byte[] buf, int offset, int length):以一個空數組來建立DatagramPacket對象,並指定接收到的資料放入buf數組中時從offset開始,最多放length 個位元組。
發送資料報包的四個構造器:
DatagramPacket(byte[] buf, int length, InetAddress addr, int port):以一個包含資料的數組來建立DatagramPacket對象,建立該DatagramPacket對象時還指定 了IP地址和連接埠--這就決定了該資料報的目的地。
DatagramPacket(byte[] buf, int length, SocketAddress address):與上一個構造器相似,但接收者名字和連接埠號碼儲存在SocketAddress參數中。
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port):建立一個用於發送的DatagramPacket對象,指定發送buf數組中從offset開 始,總共length個位元組。
DatagramPacket(byte[] buf, int offset, int length,SocketAddress address):與上一個構造器相似,但接收者名字和連接埠號碼儲存在SocketAddress參數中。
接收報文包:
1.建立一個足夠大的位元組數組,用於儲存要接收的包的資料;
2.使用該位元組數組執行個體化一個DatagramPacket對象;
3.DatagramSocket被執行個體化它被指定該通訊端要綁定到的本地主機上的一個連接埠;
4.調用DatagramSocket類的receive()方法,將DatagramPacket對象傳入該方法,這將導致執行線程阻塞,直到接收到一個資料報包或者發送了超市逾時。
發送報文包:
1.建立一個足夠大的位元組數組,用於儲存要發送的包資料,用該資料填充數組;
2.建立一個新的DatagramPacket對象,用於儲存上面的位元組數組,以及伺服器名和接收者的連接埠號碼;
3.DatagramSocket被執行個體化它被指定通訊端要綁定到本地主機的那個連接埠;
4.DatagramSocket類的send()方法被調用,傳入DatagramPacket對象。
Java網路編程