深入理解Java-網絡編程全面總結

編程語言 Java 通信 美國 java特種兵 java特種兵 2017-09-18

一、計算機網絡

計算機網絡20世紀60年代出現,經歷了20世紀70年代、80年代和90年代的發展,進入21世紀後,計算機網絡已經成為信息社會的基礎設施,深入到人類社會的方方面面,與人們的工作、學習和生活息息相關。

網絡體系結構

計算機網絡是個複雜的系統,按照人們解決複雜問題的方法,把計算機網絡實現的功能分到不同的層次上,層與層之間用接口連接。通信的雙方具有相同的層次,層次實現的功能由協議數據單元(PDU)來描述。不同系統中的同一層構成對等層,對等層之間通過對等層協議進行通信,理解彼此定義好的規則和約定。

計算機網絡體系結構是計算機網絡層次和協議的集合,網絡體系結構對計算機網絡實現的功能,以及網絡協議、層次、接口和服務進行了描述,但並不涉及具體的實現。接口是同一節點內相鄰層之間交換信息的連接處,也叫服務訪問點(SAP)。

深入理解Java-網絡編程全面總結

計算機網絡層次模型

二、OSI參考模型

世界上第一個網絡體系結構由IBM公司提出(1974年,SNA),以後其他公司也相繼提出自己的網絡體系結構如:Digital公司的DNA,美國國防部的TCP/IP等,多種網絡體系結構並存,其結果是若採用IBM的結構,只能選用IBM的產品,只能與同種結構的網絡互聯。

為了促進計算機網絡的發展,國際標準化組織ISO於1977年成立了一個委員會,在現有網絡的基礎上,提出了不基於具體機型、操作系統或公司的網絡體系結構,稱為開放系統互連參考模型,即OSI/RM (Open System Interconnection Reference Model)。OSI模型把網絡通信的工作分為7層,分別是物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層和應用層。

OSI模型層次功能

1、國際標準化組織ISO在1979年建立了一個分委員會來專門研究一種用於開放系統的體系結構,提出了開放系統互連OSI模型,這是一個定義連接異種計算機的標準主體結構。

2、OSI簡介:OSI採用了分層的結構化技術,共分七層,物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層。

3、OSI參考模型的特性:是一種異構系統互連的分層結構;提供了控制互連繫統交互規則的標準骨架;定義一種抽象結構,而並非具體實現的描述;不同系統中相同層的實體為同等層實體;同等層實體之間通信由該層的協議管理;相信層間的接口定義了原語操作和低層向上層提供的服務;所提供的公共服務是面向連接的或無連接的數據服務;直接的數據傳送僅在最低層實現;每層完成所定義的功能,修改本層的功能並不影響其他層。

4、物理層:提供為建立、維護和拆除物理鏈路所需要的機械的、電氣的、功能的和規程的特性;有關的物理鏈路上傳輸非結構的位流以及故障檢測指示。

5、數據鏈路層:在網絡層實體間提供數據發送和接收的功能和過程;提供數據鏈路的流控。

6、網絡層:控制分組傳送系統的操作、路由選擇、擁護控制、網絡互連等功能,它的作用是將具體的物理傳送對高層透明。

7、傳輸層:提供建立、維護和拆除傳送連接的功能;選擇網絡層提供最合適的服務;在系統之間提供可靠的透明的數據傳送,提供端到端的錯誤恢復和流量控制。

8、會話層:提供兩進程之間建立、維護和結束會話連接的功能;提供交互會話的管理功能,如三種數據流方向的控制,即一路交互、兩路交替和兩路同時會話模式。

9、表示層:代表應用進程協商數據表示;完成數據轉換、格式化和文本壓縮。

10、應用層:提供OSI用戶服務,例如事務處理程序、文件傳送協議和網絡管理等。

三、TCP/IP參考模型

TCP/IP參考模型共分為4層,分別是:網絡訪問層、網際互聯層、傳輸層(主機到主機)、和應用層。

各層的功能如下:

1. 應用層:應用層對應於OSI參考模型的高層,為用戶提供所需要的各種服務。

2. 傳輸層:傳輸層對應於OSI參考模型的傳輸層,為應用層實體提供端到端的通信功能,保證了數據包的順序傳送及數據的完整性。

3. 網際互聯層:網際互聯層對應於OSI參考模型的網絡層,主要解決主機到主機的通信問題。它所包含的協議設計數據包在整個網絡上的邏輯傳輸。

4. 網絡接入層(即主機-網絡層):網絡接入層與OSI參考模型中的物理層和數據鏈路層相對應。它負責監視數據在主機和網絡之間的交換。

主要協議有:

1、應用層:FTP、Telnet、DNS、SMTP等.

2、傳輸層:傳輸控制協議(TCP)和用戶數據報協議(UDP).

3、網際互聯層:網際協議(IP)、互聯網組管理協議(IGMP)和互聯網控制報文協議(ICMP)。

4、網絡接入層(即主機-網絡層):地址解析協議(ARP)。

深入理解Java-網絡編程全面總結

OSI 和 TCP/IP模型對比

四、常見網絡協議

上面主要介紹了OSI參考模型和TCP/IP模型的相關內容下面主要介紹傳輸層的TCP、UDP協議和應用層的HTTP協議。

TCP:Transmission Control Protocol 傳輸控制協議TCP是一種面向連接(連接導向)的、可靠的、基於字節流的運輸層(Transport layer)通信協議,由IETF的RFC 793說明(specified)。在簡化的計算機網絡OSI模型中,它完成第四層傳輸層所指定的功能,UDP是同一層內另一個重要的傳輸協議。

  • TCP報文段格式

TCP雖然是面向字節流的,但TCP傳送的數據單元卻是報文段。

TCP報文段首部的前20個字節是固定的,後面有4N字節是根據需要而增加的選項,因此,TCP首部的最小長度是20字節。

深入理解Java-網絡編程全面總結

TCP報文段

首部固定部分各字段的意義如下:

1.源端口和目的端口,各佔2個字節。

2.序號:佔4個字節,序號範圍為0到2的32次方-1,序號增加到2的32次方-1之後,下一個序號變為0,在一個TCP連接中傳送的字節流中的每一個字節都按順序編號。首部中的序號字段值指的是本報文段所發送的數據的第一個字節的序號。可對4GB的數據進行編號。在一般情況下可保證當序號重複使用時,舊序號的數據早已通過網絡到達終點了。

3.確認號:佔4字節,是期望收到對方下一個報文段的第一個數據字節的序號。記住:若確認號是N,則表明:到序號N-1為止的所有數據都已正確收到。

4.數據偏移:佔4位,它指出TCP報文段的數據起始處距離TCP報文段的起始處有多遠,這個字段實際上是指出TCP報文段的首部長度。

6.保留:佔6位。保留為今後使用,目前置為0

7.緊急URG(URGent):當URG=1時,表明緊急字段有效,告訴系統此報文中有緊急數據,應儘快傳送。於是發送方TCP就把緊急數據插入到本報文段數據的最前面,而在緊急數據後面的數據仍是普通數據。這時要與首部中緊急指針字段配合使用。

8.確認ACK(ACKnowlegment)僅當ACK=1時確認號字段才有效,TCP規定,連接建立後所有傳送的報文段都必須把ACK置1.

9.推送PSH(PuSH):當兩個應用進程進行交互式的通信時,有時在一端的應用進程希望在鍵入一個命令後立即就能收到對方的響應。在這種情況下,TCP就可以使用推送操作。

10.復位RST(ReSeT):當RST=1時,表明TCP連接中出現嚴重錯誤,必須釋放連接,然後再重新建立運輸連接。

11.同步SYN,在連接建立時用來同步序號,當SYN=1而ACK=0時,表明這是一個連接請求報文段。對方若同意時,則應在響應的報文段中使SYN=1和ACK=1,因此,SYN置1就表示這是一個連接請求或連接接受報文。

12.終止FIN,用來釋放一個連接,當FIN=1時,表示此報文段的發送方的數據已發送完畢,並要求釋放運輸連接。

13.窗口,佔2個字節,窗口指的是發送本報文段的一方的接收窗口,不是自己的發送窗口,告訴對方:從本報文段首部中的確認號算起,接收方目前允許對方發送的數據量。窗口值作為接受方讓發送方設置其發送窗口的依據。

14.校驗和,佔2字節。校驗和字段檢驗的範圍包括首部和數據這兩部分。

15.緊急指針:佔2個字節,緊急指針僅在URG=1時才有意義,它指出本報文段中的緊急數據的字節數。當所有緊急數據處理完畢時,TCP就告訴應用程序恢復到正常操作。值得注意的是,即使窗口為0時也可發送緊急數據。

  • 三次握手與四次揮手

TCP是面向連接的協議,因此每個TCP連接都有3個階段:連接建立、數據傳送和連接釋放。連接建立經歷三個步驟,通常稱為“三次握手”。

TCP三次握手過程如下:

深入理解Java-網絡編程全面總結

TCP三次握手.jpg

  • 第一次握手:

    客戶端發送一個TCP的SYN標誌位置1的包指明客戶打算連接的服務器的端口,以及初始序號X,保存在包頭的序列號(Sequence Number)字段裡。

  • 第二次握手:

    服務器發回確認包(ACK)應答。即SYN標誌位和ACK標誌位均為1同時,將確認序號(Acknowledgement Number)設置為客戶的I S N加1以.即X+1。

  • 第三次握手.

    客戶端再次發送確認包(ACK) SYN標誌位為0,ACK標誌位為1.並且把服務器發來ACK的序號字段+1,放在確定字段中發送給對方.並且在數據段放寫ISN的+1

TCP四次揮手過程如下:

深入理解Java-網絡編程全面總結

四次揮手.png

由於TCP連接是全雙工的,因此每個方向都必須單獨進行關閉。這原則是當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的連接。收到一個 FIN只意味著這一方向上沒有數據流動,一個TCP連接在收到一個FIN後仍能發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。

  1. TCP客戶端發送一個FIN,用來關閉客戶到服務器的數據傳送。

  2. 服務器收到這個FIN,它發回一個ACK,確認序號為收到的序號加1。和SYN一樣,一個FIN將佔用一個序號。

  3. 服務器關閉客戶端的連接,發送一個FIN給客戶端。

  4. 客戶端發回ACK報文確認,並將確認序號設置為收到序號加1。

UDP協議

UDP協議是英文UserDatagramProtocol的縮寫,即用戶數據報協議,主要用來支持那些需要在計算機之間傳輸數據的網絡應用。包括網絡視頻會議系統在內的眾多的客戶/服務器模式的網絡應用都需要使用UDP協議。UDP協議從問世至今已經被使用了很多年,雖然其最初的光彩已經被一些類似協議所掩蓋,但是即使是在今天,UDP仍然不失為一項非常實用和可行的網絡傳輸層協議。

HTTP協議

現在使用的HTTP協議是HTTP/1.1版本,1997年之前採用的是HTTP1.0版本。HTTP連接在1.0版本中採用非持續連接工作方式,1.1版本採用的是持續連接工作方式,持續連接是指服務器在發送響應後仍然在一段時間內保持這條由TCP運輸層協議建立起來的連接,使客戶機和服務器可以繼續在這條連接上傳輸HTTP報文。

是否採用持續連接工作方式,1.0中默認是關閉的,需要在HTTP頭加入"Connection:Keep-Alive",才能啟用Keep-Alive。HTTP1.1中默認啟用Keep-Alive,如果加入"Connection:close",才關閉。目前大部分瀏覽器都是用HTTP1.1協議,也就是說默認都會發起Keep-Alive的連接請求了,所以是否能完成一個完整的Keep- Alive連接就看服務器設置情況。

HTTPS和HTTP的區別

https協議需要到ca申請證書,一般免費證書很少,需要交費。 http是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議 http和https使用的是完全不同的連接方式用的端口也不一樣,前者是80,後者是443。

http的連接很簡單,是無狀態的 HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議 要比http協議安全 HTTPS解決的問題:

1 . 信任主機的問題. 採用https 的server 必須從CA 申請一個用於證明服務器用途類型的證書. 改證書只有用於對應的server 的時候,客戶度才信任次主機. 所以目前所有的銀行系統網站,關鍵部分應用都是https 的. 客戶通過信任該證書,從而信任了該主機. 其實這樣做效率很低,但是銀行更側重安全. 這一點對我們沒有任何意義,我們的server ,採用的證書不管自己issue 還是從公眾的地方issue, 客戶端都是自己人,所以我們也就肯定信任該server.

2 . 通訊過程中的數據的洩密和被竄改

一般意義上的https, 就是 server 有一個證書.

  • a) 主要目的是保證server 就是他聲稱的server. 這個跟第一點一樣.

  • b) 服務端和客戶端之間的所有通訊,都是加密的. i. 具體講,是客戶端產生一個對稱的密鑰,通過server 的證書來交換密鑰. 一般意義上的握手過程. ii. 加下來所有的信息往來就都是加密的. 第三方即使截獲,也沒有任何意義.因為他沒有密鑰. 當然竄改也就沒有什麼意義了.

少許對客戶端有要求的情況下,會要求客戶端也必須有一個證書.

  • a) 這裡客戶端證書,其實就類似表示個人信息的時候,除了用戶名/密碼, 還有一個CA 認證過的身份. 應為個人證書一般來說上別人無法模擬的,所有這樣能夠更深的確認自己的身份.

  • b) 目前少數個人銀行的專業版是這種做法,具體證書可能是拿U盤作為一個備份的載體.像我用的交通銀行的網上銀行就是採取的這種方式。 HTTPS 一定是繁瑣的. a) 本來簡單的http協議,一個get一個response. 由於https 要還密鑰和確認加密算法的需要.單握手就需要6/7 個往返. i. 任何應用中,過多的round trip 肯定影響性能. b) 接下來才是具體的http協議,每一次響應或者請求, 都要求客戶端和服務端對會話的內容做加密/解密. i. 儘管對稱加密/解密效率比較高,可是仍然要消耗過多的CPU,為此有專門的SSL 芯片. 如果CPU 信能比較低的話,肯定會降低性能,從而不能serve 更多的請求.

五、Java網絡編程

1,什麼是Socket

網絡上的兩個程序通過一個雙向的通訊連接實現數據的交換,這個雙向鏈路的一端稱為一個Socket。Socket通常用來實現客戶方和服務方的連接。Socket是TCP/IP協議的一個十分流行的編程界面,一個Socket由一個IP地址和一個端口號唯一確定。

但是,Socket所支持的協議種類也不光TCP/IP一種,因此兩者之間是沒有必然聯繫的。在Java環境下,Socket編程主要是指基於TCP/IP協議的網絡編程。

2,Socket通訊的過程

Server端Listen(監聽)某個端口是否有連接請求,Client端向Server 端發出Connect(連接)請求,Server端向Client端發回Accept(接受)消息。一個連接就建立起來了。Server端和Client 端都可以通過Send,Write等方法與對方通信。

對於一個功能齊全的Socket,都要包含以下基本結構,其工作過程包含以下四個基本的步驟:

  (1) 創建Socket;

  (2) 打開連接到Socket的輸入/出流;

  (3) 按照一定的協議對Socket進行讀/寫操作;

  (4) 關閉Socket.(在實際應用中,並未使用到顯示的close,雖然很多文章都推薦如此,不過在我的程序中,可能因為程序本身比較簡單,要求不高,所以並未造成什麼影響。)

3,創建Socket

創建Socket

java在包java.net中提供了兩個類Socket和ServerSocket,分別用來表示雙向連接的客戶端和服務端。這是兩個封裝得非常好的類,使用很方便。其構造方法如下:

Socket(InetAddress address, int port);

Socket(InetAddress address, int port, boolean stream);

Socket(String host, int prot);

Socket(String host, int prot, boolean stream);

Socket(SocketImpl impl)

Socket(String host, int port, InetAddress localAddr, int localPort)

Socket(InetAddress address, int port, InetAddress localAddr, int localPort)

ServerSocket(int port);

ServerSocket(int port, int backlog);

ServerSocket(int port, int backlog, InetAddress bindAddr)

  其中address、host和port分別是雙向連接中另一方的IP地址、主機名和端 口號,stream指明socket是流socket還是數據報socket,localPort表示本地主機的端口號,localAddr和 bindAddr是本地機器的地址(ServerSocket的主機地址),impl是socket的父類,既可以用來創建serverSocket又可 以用來創建Socket。count則表示服務端所能支持的最大連接數。

六丶總結

到這裡,Java網絡編程部分的內容就結束了,不足之處還望大家多多包涵,希望大家可以瞭解什麼是Java - 網絡編程全面總結,覺得收穫的話可以點個關注收藏轉發一波喔,謝謝大佬們支持。(吹一波,233~~)

1、多寫多敲代碼,好的代碼與紮實的基礎知識一定是實踐出來的

2、可以去騰訊課堂的圖靈學院學習一下java架構實戰案例,還挺不錯的。

最後,每一位讀到這裡的網友,感謝你們能耐心地看完。希望在成為一名更優秀的Java程序員的道路上,我們可以一起學習、一起進步。

想了解和學習以上課程可加群656951213, 驗證:(009)必過!!

深入理解Java-網絡編程全面總結

相關推薦

推薦中...