Java 網絡程式設計(一) 網絡基礎知識
網絡基礎知識
網絡程式設計的目的:直接或間接地通過網絡協定與其他計算機進行通訊。
網絡程式設計中有兩個主要的問題:
1.如何準确地定位網絡上一台或多台主機。
2.找到主機後如何可靠高效地進行資料傳輸。
目前較為流行的網絡程式設計模型是用戶端/伺服器(C/S)結構。
即通信雙方一方作為伺服器等待客戶提出請求并予以相應。客戶則在需要服務時向伺服器提出申請。
伺服器始終運作,監聽網絡端口,一旦有客戶請求,就會啟動一個服務線程來響應該客戶,同時自己繼續監聽服務視窗,使後來的客戶也能及時得到服務。
IP位址
IP網絡中每台主機都必須有一個唯一的IP位址,IP位址是一個邏輯位址。
英特網上的IP位址具有全球唯一性。
32位,四個位元組,常用點分十進制的格式表示。
例如:192.168.0.200
協定
為進行網絡中的資料交換(通信)而建立的規則、标準或約定。(=語義+文法+規則)。
不同層具有各自不同的協定。
ISO/OSI七層參考模型
網絡體系結構解決異質性問題采用的是分層的方法——把複雜的網絡互聯問題劃分為若幹個較小的、單一的問題,在不同層上予以解決。
OSI(Open System Interconnection)參考模型将網絡的不同功能劃分為7層:
應用層:處理網絡應用
表示層:資料表示
會話層:主機間通信
傳輸層:端到端的連接配接
網絡層:尋址和最短路徑
資料鍊路層:媒體通路(接入)
實體層:二進制傳輸

通信實體的對等層之間不允許直接通信,各層之間是嚴格的單向依賴,上層(Service user)使用下層提供的服務,下層(Service provider)向上層提供服務。
對等層通信的實質:對等層實體之間虛拟通信,下層向上層提供服務,實際通信在最底層完成。
OSI各層所使用的協定:
應用層:Telnet、FTP、HTTP、DNS、SMTP、POP3
傳輸層:TCP、UDP
TCP:面向連接配接的可靠的傳輸協定。
UDP:是無連接配接的,不可靠的傳輸協定。
網絡層:IP、ICMP、IGMP
端口
在網際網路上傳輸的資料都包含有用來識别目的地的IP位址和端口号。
IP位址用來辨別網絡上的計算機,而端口号用來指明該計算機上的應用程式。
端口是一種抽象的軟體結構(包括一些資料結構和I/O緩沖區)。
應用程式通過系統調用與某端口建立連接配接(binding)後,傳輸層傳給該端口的資料都被相應的程序所接收,相應程序發給傳輸層的資料都通過該端口輸出。
端口用一個整數型辨別符來表示,即端口号。
端口号跟協定相關,TCP/IP傳輸層的兩個協定TCP和UDP是完全獨立的兩個軟體子產品,是以各自的端口号也互相獨立,端口通常稱為協定端口(protocol port),簡稱端口。
端口使用一個16位的數字來表示,它的範圍是0~65535,1024以下的端口号保留給預定義的服務。例如,http使用80端口。
資料封裝
一台計算機要發送資料到另一台計算機,資料首先必須打包,打包的過程稱為封裝。
封裝就是在資料前面加上特定的協定頭部。
OSI參考模型中,對等層協定之間的交換的資訊單元稱為協定資料單元(PDU, Protocol Data Unit)。
OSI參考模型中的每一層都要依靠下一層提供的服務。
為了提供服務,下層把上層的PDU作為本層的資料封裝,然後加入本層的頭部(和尾部)。頭部中含有完成資料傳輸所需的控制資訊。
這樣,資料自上而下遞交的過程實際上就是不斷封裝的過程。到達目的地後自下而上遞交的過程就是不斷拆封的過程。由此可知,在實體線路上傳輸的資料,其外面實際上被包封了多層“信封”。
兩類傳輸協定:TCP,UDP
TCP
TCP是Transfer Control Protocol(傳輸控制協定)的簡稱,是一種面向連接配接的保證可靠傳輸的協定。
在TCP/IP協定中,
IP層主要負責網絡主機的定位,資料傳輸的路由,由IP位址可以唯一确定Internet上的一台主機。
而TCP層則提供面向應用的可靠的或非可靠的資料傳輸機制,這是網絡程式設計的主要對象,一般不需要關心IP層是如何處理資料的。
通過TCP協定傳輸,得到的是一個順序的無差錯的資料流。
發送方和接收方的成對的兩個socket之間必須建立連接配接,以便在TCP協定的基礎上進行通信。
當一個socket(通常都是server socket)等待建立連接配接時,另一個socket可以要求進行連接配接,一旦這兩個socket連接配接起來,它們就可以進行雙向資料傳輸,雙方都可以進行發送或接收操作。
TCP是一個基于連接配接的協定,它能夠提供兩台計算機之間的可靠的資料流。
HTTP、FTP、Telnet等應用都需要這種可靠的通信通道。
UDP
UDP是User Datagram Protocol的簡稱,是一種無連接配接的協定。
UDP是從一台計算機向另一台計算機發送稱為資料報的獨立資料包的協定,該協定并不保證資料報是否能正确地到達目的地,它是一個非面向連接配接的協定。
每個資料報都是一個獨立的資訊,包括完整的源位址或目的位址,它在網絡上以任何可能的路徑傳往目的地,是以能否到達目的地,到達時間以及内容的正确性都是不能保證的。
TCP和UDP的比較
使用UDP時,每個資料報中都給出了完整的位址資訊,是以無需建立發送方和接收方的連接配接。
對于TCP協定,由于它是一個面向連接配接的協定,在socket之間進行資料傳輸之前必然要建立連接配接,是以在TCP中多了一個連接配接建立的時間。
使用UDP傳輸資料時是有大小限制的,每個被傳輸的資料報必須限定在64KB之内。
TCP沒有這方面的限制,一旦連接配接建立起來,雙方的socket就可以按統一的格式傳輸大量的資料。
UDP是一個不可靠的協定,發送方所發送的資料報并不一定以相同的次序到達接收方。
TCP是一個可靠的協定,它確定接收方完全正确地擷取發送方所發送的全部資料。
可靠的傳輸是要付出代價的,對資料内容正确性的檢驗必然占用計算機的處理時間和網絡的帶寬。是以TCP傳輸的效率不如UDP高。
TCP在網路通信上有極強的生命力,例如遠端連接配接(Telnet)和檔案傳輸(FTP)都需要不定長度的資料被可靠地傳輸。
相比之下UDP操作簡單,而且僅需要較少的監護,是以通常用于區域網路高可靠性的分散系統中client/server應用程式。
此處推薦書籍《TCP/IP詳解》,分三卷。
TCP/IP模型
TCP/IP模型包括四個層次:
應用層
傳輸層
網絡層
網絡接口
TCP/IP與OSI參考模型的對應關系:
JDK中的網絡類
通過java.net包中的類,java程式能夠使用TCP或UDP協定在網際網路上進行通訊。
Java通過擴充已有的流式輸入/輸出接口和增加在網絡上建立輸入/輸出對象特性這兩個方法支援TCP/IP。
Java支援TCP和UDP協定族。
TCP用于網絡的可靠的流式輸入/輸出。
UDP支援更簡單的、快速的、點對點的資料報模式。
作者:Agoly 出處:https://www.cnblogs.com/qmfsun/ 本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。 如果文中有什麼錯誤,歡迎指出。以免更多的人被誤導。 |