java網絡編程之基礎知識點總結

2020-12-20 愚公要移山1

一. 概述

本文是網絡編程系列的第一篇文章,所以不講代碼,主要是網絡編程的一些基礎知識,下面的這些知識點主要是對java網絡編程這本書的歸納與整理。有興趣的同學可以看看。

我們知道計算機之間的通信要經過一系列複雜的過程,計算機之間通過傳輸介質、通信設施和網絡通信協議互聯,實現資源共享和數據傳輸。而我們的網絡編程就是使用程序使網際網路的兩個(或多個)計算機之間進行數據傳輸。當然java語言,為了實現兩個計算機之間的數據傳輸,提供了一系列的接口,使得開發人員可以方便的實現。

不過在正式開始代碼編寫之前就先看看一些通信的基本知識。

二 、網絡體系結構

計算機之間的通信要經過一系列複雜的過程,必須將這兩臺計算機的物理邏輯和通信邏輯好好的規劃好。為此我們先看看計算機網絡的層次模型。然後再進行分析。

從上面這張圖我們對計算機之間的通信特點進行整理一下:

(1)計算機之間的網絡通信被分解為多個層,層與層之間用接口連接。

(2)通信的雙方具有相同的層次,層次實現的功能由協議數據單元(PDU)來描述。

(3)不同系統中的同一層構成對等層,對等層之間通過對等層協議進行通信。

(4)在通信的時候數據必須由一層依次傳遞到下一層,不能跨級傳輸。

為了促進計算機網絡的發展,國際標準化組織ISO在現有網絡的基礎上,提出了不基於具體機型、作業系統或公司的網絡體系結構,稱為開放系統互連參考模型,即OSI/RM。但是ISO制定的OSI參考模型過於龐大、複雜招致了許多批評。因此美國國防部提出了TCP/IP協議棧參考模型,簡化了OSI參考模型,獲得了廣泛的應用。

1、OSI參考模型

這裡首先介紹OSI參考模型,是國際標準化組織ISO提出的,把網絡通信的工作分為7層,分別是物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層和應用層。也是我們在大學計算機網絡課程中認識的那樣。下面一張圖來看看。

(1)物理層處於OSI的最底層,是開放系統的基礎,它的功能主要是為計算機提供傳送數據的通路以及傳輸數據。

(2)數據鏈路層的主要任務是實現計算機網絡中相鄰節點之間的可靠傳輸,把原始的、有差錯的物理傳輸數據加上數據鏈路協議以後,構成邏輯上可靠的數據鏈路。

(3)網絡層主要完成的功能主要包括路由選擇、網絡尋址、流量控制、擁塞控制、網絡互連等。實現兩個計算機節點之間的數據傳輸。

(4)傳輸層涉及源端節點到目的端節點之間可靠的信息傳輸。也就是說是採用TCP/IP還是採用UDP協議。他需要三次握手四次揮手。  

(5)會話層的主要功能是負責應用程式之間建立、維持和中斷會話,提供單工、半雙工和全雙工3種不同的通信方式,使系統和服務之間有序地進行通信。

(6)表示層關心所傳輸數據信息的格式定義,其主要功能是把應用層提供的信息變換為能夠共同理解的形式,提供字符代碼、數據格式、控制信息格式、加密等的統一表示。

(7)應用層是直接為應用進程提供服務的。其作用是多個系統應用進程相互通信的同時,完成一系列業務處理所需的服務。

2 、TCP/IP參考模型

TCP/IP參考模型採用4層的層級結構,每一層都呼叫它的下一層所提供的協議來完成自己的需求,這4個層次分別是:網絡接口層、網絡層(IP層)、傳輸層(TCP層)、應用層。

(1)網絡接口層:對應著OSI參考模型的物理層和數據鏈路層

(2)網絡層(IP層):是整個TCP/IP協議棧的核心。它的功能是把分組數據發往目標網絡或主機。可以完成將不同類型的網絡(異構網)互連的任務。除此之外,還需要完成擁塞控制的功能。

(3)傳輸層(TCP層):傳輸層負責在應用進程之間建立端到端的連接和可靠通信。TCP層涉及兩個協議,TCP和UDP。TCP協議提供面向連接的服務,提供按字節流的有序、可靠傳輸,可以實現連接管理、差錯控制、流量控制、擁塞控制等。也就是可靠傳輸。UDP協議提供無連接的服務,用於不需要或無法實現面向連接的網絡應用中。也就是不可靠傳輸。

(4)應用層:為各種網絡應用提供服務。

3、網絡協議

OSI參考模型和TCP/IP模型在不同的層次中有許多不同的網絡協議,如圖所示:

網絡協議之間的關係圖如下:

下面我們抽出來一些重要的協議看一下。其他的協議用到的時候再說。

(1)IP協議

IP協議的作用在於把各種數據包準備無誤的傳遞給對方。由於IP位址是稀有資源,不可能每個人都擁有一個IP位址,所以我們通常的IP位址是路由器給我們生成的IP位址,路由器裡面會記錄我們的MAC地址。而MAC地址是全球唯一的。舉例,IP位址就如同是我們居住小區的地址,而MAC地址就是我們住的那棟樓那個房間那個人。

(2)TCP協議

TCP層是位於IP層之上,應用層之下的中間層。有可靠的、像管道一樣的TCP連接,還有不可靠的包交換的UDP連結。那tcp協議之間的通信數據格式是什麼樣子的呢?也就是什麼樣的數據在傳輸,下面一張圖來看一下:

TCP報文段包括協議首部和數據兩部分,協議首部的固定部分是20個字節,首部的固定部分後面是選項部分。

下面是報文段首部各個欄位的含義,也是《計算機網絡》書中的說明:

源埠號以及目的埠號:各佔2個字節,埠是傳輸層和應用層的服務接口,用於尋找發送端和接收端的進程,一般來講,通過埠號和IP位址,可以唯一確定一個TCP連接,在網絡編程中,通常被稱為一個socket接口。序號:Seq序號,佔4個字節、32位。用來標識從TCP發送端向TCP接收端發送的數據字節流。發起方發送數據時對此進行標記。確認序號:Ack序號,佔4個字節、32位。包含發送確認的一端所期望收到的下一個序號。只有ACK標記位為1時,確認序號欄位才有效,因此,確認序號應該是上次已經成功收到數據字節序號加1,即Ack=Seq + 1。數據偏移:佔4個字節,用於指出TCP首部長度,若不存在選項,則這個值為20位元組,數據偏移的最大值為60位元組。保留欄位佔6位,暫時可忽略,值全為0。標誌位,6個URG(緊急):為1時表明緊急指針欄位有效ACK(確認):為1時表明確認號欄位有效PSH(推送):為1時接收方應儘快將這個報文段交給應用層RST(復位):為1時表明TCP連接出現故障必須重建連接SYN(同步):在連接建立時用來同步序號FIN(終止):為1時表明發送端數據發送完畢要求釋放連接接收窗口:佔2個字節,用於流量控制和擁塞控制,表示當前接收緩衝區的大小。在計算機網絡中,通常是用接收方的接收能力的大小來控制發送方的數據發送量。TCP連接的一端根據緩衝區大小確定自己的接收窗口值,告訴對方,使對方可以確定發送數據的字節數。校驗和:佔2個字節,範圍包括首部和數據兩部分。選項是可選的,默認情況是不選。三次握手與四次揮手(超級重要。面試必問)

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

TCP三次握手過程如下:

1. 第一次握手(客戶端發送請求)

男孩:「咱倆處對象吧」,並等待對方回復確認。

2. 第二次握手(服務端回傳確認)

女孩:告訴男孩說「可以」,

3. 第三次握手(客戶端回傳確認)

男孩說:「那就在一塊吧」,於是倆人有了情侶連結關係了。

注意:握手過程中傳送的包裡不包含數據,三次握手完畢後,客戶端與伺服器才正式開始傳送數據。

TCP四次揮手過程如下:

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

1. 女孩:要和男孩分手,並等待男孩回應

2. 男孩:回復女孩,先同意分手,不過還是又考慮了一段時間。

3. 男孩思考了一段時間,還是選擇了分手。

4. 女孩收到消息,於是倆人正式分手。

注意:為什麼連接的時候是三次握手,關閉的時候卻是四次揮手?

因為當服務端收到客戶端的SYN連接請求報文後,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當服務端收到FIN報文時,很可能並不會立即關閉socket,所以只能先回復一個ACK報文,告訴客戶端,「你發的FIN報文,我收到了」。只有等到服務端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送,故需要四步揮手。

(3)UDP協議

UDP,用戶數據報協議,它是TCP/IP協議簇中無連接的運輸層協議。

UDP是一個非連接的協議,傳輸數據之前源端和終端不建立連接,當它想傳送時就簡單地去抓取來自應用程式的數據,並儘可能快地把它扔到網絡上。由於傳輸數據不建立連接,因此也就不需要維護連接狀態,包括收發狀態等,因此一臺伺服器可同時向多個客戶端傳輸相同的消息。UDP信息包的標題很短,只有8個字節,相對於TCP的20個字節信息包的額外開銷很小。吞吐量不受擁擠控制算法的調節,只受應用軟體生成數據的速率、傳輸帶寬、源端和終端主機性能的限制。UDP使用儘量最大努力交付,即不保證可靠交付,因此主機不需要維持複雜的連結狀態表。UDP是面向報文的。發送方的UDP對應用程式交下來的報文,在添加首部受就向下交付給IP層。既不拆分,也不合併,而是保留這些報文的邊界,因此,應用程式需要選擇合適的報文大小。 2.2.3.1 UDP協議格式

UDP協議由兩部分組成:首部和數據。其中,首部僅有8個字節,包括源埠和目的埠、長度(UDP用於數據報的長度)、校驗和。

(4) TCP與UDP的區別

TCP基於連接,UDP是無連接的;對系統資源的要求,TCP較多,UDP較少;UDP程序結構較簡單;TCP是流模式,而UDP是數據報模式;TCP保證數據正確性,而UDP可能丟包;TCP保證數據順序,而UDP不保證;(5)HTTP協議

HTTP,超文本傳輸協議,它是網際網路上應用最為廣泛的一種網絡協議。HTTP是一種應用層協議,它是基於TCP協議之上的請求/響應式的協議。

對於從客戶端到伺服器的每一個請求,都有4個步驟:

默認情況下,客戶端在埠80打開與伺服器的一個TCP連接,URL中還可以指定其他埠。客戶端向伺服器發送消息,請求指定路徑上的資源。這個資源包括一個首部,可選地(取決於請求的性質)還可以有一個空行,後面是這個請求的數據。伺服器向客戶端發送響應。響應以響應碼開頭,後面是包含數據的首部、一個空行以及所請求的文檔或錯誤消息。伺服器關閉連接。HTTP報文

HTTP協議是基於TCP協議之上的請求/響應式協議,下面主要介紹HTTP報文的格式,HTTP報文主要有請求報文和響應報文兩種。

首先看HTTP請求報文的格式

下圖是谷歌瀏覽器內訪問伺服器查看的HTTP請求例子:

HTTP響應報文格式

HTTP請求方法和響應狀態碼

在上面的HTTP請求報文例子中,我們可以看到請求方法是GET,這表示請求讀取由URL所標誌的信息,除了GET,還有其他幾種常用的方法。

在HTTP響應報文的例子中,我們可以看到狀態碼是200,表示響應成功。下表是其他狀態碼,總共5大類,33種。

HTTP和HTTPS的區別

HTTP協議被用於在Web瀏覽器和網站伺服器之間傳遞信息。HTTP協議以明文方式發送內容,不提供任何方式的數據加密,如果攻擊者截取了Web瀏覽器和網站伺服器之間的傳輸報文,就可以直接讀懂其中的信息,因此HTTP協議不適合傳輸一些敏感信息,比如信用開號、密碼等。

為了解決HTTP協議的這一缺陷,需要使用另一種協議:安全套接字層超文本傳輸協議HTTPS。為了數據傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證伺服器的身份,並為瀏覽器和伺服器之間的通信加密。

HTTPS和HTTP的區別主要為以下四點:

https協議需要到ca申請證書,一般免費證書很少,需要繳費。http是超文本傳輸協議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協議。http和https使用的是完全不同的連接方式,用的埠也不一樣,前者是80,後者是443。http的連接很簡單,是無狀態的;https協議是有ssl+http協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。

相關焦點

  • JAVA基礎學習|JAVA中的包總結!
    該包提供了Java語言進行程序設計的基礎類,它是默認導入的包。該包裡面的Runnable接口和Object、Math、String、StringBuffer、System、Thread以及Throwable類需要重點掌握,因為它們應用很廣。
  • 你必須掌握的 21 個 Java 核心技術!
    面向對象編程的概念這是一個java的核心概念,對於任何java開發者都需要熟練掌握。Java中很多特性或者說知識點都是和java面向對象編程概念相關的。在我的理解,一個好的開發者不僅僅需要了解這些特性(知識點)本身。
  • 編程入門先學什麼?零經驗的人學編程難嗎
    學會了基礎語言,那高級語言都可以很快上手,我們面對新的程式語言時,只需簡單了解該語言的語法特點,就可以輕鬆應對和應用了。一名程式設計師的高級境界,是在反覆的實踐、觀察、分析、比較、總結中潛移默化積累的,絕不是一篇文章或者兩三小時的講解就能夠說清楚的。要學會編程思想、找到編程感覺,必須從實實在在的編程實際工作中去實踐和體驗。
  • 動力節點Java學院2021年Java學習路線圖最新出爐啦
    Java在程式語言排行榜中一直牢牢佔據榜首位置,幾乎所有的大中型網際網路的應用系統在伺服器端開發首選都是Java編程,正因如何吸引這不少年輕人投入該行業,Java雖不想其它程式語言那麼複雜,但是知識體系還是很龐大的,因此想要學好並非容易之事,不少想要跨入Java編程行業的同學們通過網絡搜索各式各樣的學習資料
  • Java基礎面試題簡單總結
    Java基礎方面:1、作用域public,private,protected,以及不寫時的區別答:區別如下:寫時默認為friendly 2、Anonymous Inner Class (匿名內部類)Java 程式語言只有值傳遞參數。當一個對象實例作為一個參數被傳遞到方法中時,參數的值就是對該對象的引用。
  • Java學到什麼程度才能叫精通?
    下面是我總結的一些初中級Java程式設計師必備的知識:總結:初中級 Java 程式設計師必須掌握的知識。熟練掌握數據結構、算法、作業系統、計算機網絡等基礎知識。《JAVA網絡編程 第4版》: 可以系統的學習一下網絡的一些概念以及網絡編程在Java中的使用。《Java核心技術卷1+卷2》(推薦): 很棒的兩本書,建議有點Java基礎之後再讀,介紹的還是比較深入的,非常推薦。這兩本書我一般也會用來鞏固知識點,是兩本適合放在自己身邊的好書。
  • 「原創」Java並發編程系列09|基礎乾貨
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫本文為何適原創並發編程系列第9篇。現在,我們進入正題:介紹並發編程的基礎性概念。
  • Java 編程,哪些書值得推薦?
    可當時的我並沒有看完,讀的過程感覺怪怪的,不知道是翻譯的問題還是知識點本身就太晦澀了。自己知識欠缺,不能太深刻體會作者的用心良苦。所以,2020年入行的你,我就不推薦這本書了。想看的話,可以找找電子版。
  • 編程零基礎想做一名程式設計師,該怎麼學習?首先要學習什麼?
    如果想做一個程式設計師,在沒有基礎的情況下,買書自學是一個辦法,但是大多數人會因為沒有相關的基礎知識,導致看書看得一知半解,因為有不同的語言,不同的開發環境,在你不了解的時候,買的書不一定合適。比較速成的辦法還是去報名一個培訓班,系統的學習一下基礎知識,然後選擇一個發展方向,再具體的針對性的買點書籍來學習。遇到不懂的問題的時候,儘量少的去百度,谷歌上直接找答案,而是去各種論壇或官方網站了解比較底層的原理,然後思考解決方案,這樣才能知其然知其所以然。
  • java如何快速入門?
    別只是看Java的基礎技能書籍如果你學習Java的唯一目的是通過第二天的考試,那就當我沒說這個話,把所有能學的東西都記下來,這樣你就可以拿到及格分了。然而,如果你真的很認真地學習Java並想在這方面做得更好,那麼最好的方法不是通過閱讀,而是通過實踐獲取知識,然後以代碼的形式執行所學內容。
  • 吐血總結:高數重要基礎知識點(高階導數定義及公式)
    高數重要基礎知識點——高階導數定義及公式總結。18考生注意看,打好數學基礎。高數作為最難,分值比例最大的一個科目必須要放在首位複習,知識點的掌握也要到位。 吐血總結:高數重要基礎知識點(高階導數定義及公式)
  • JAVA並發編程:並發問題的根源及主要解決方法
    比如java中簡單的一條語句count += 1。映射到CPU指令有三條,讀取count變量指令,變量加1指令,變量寫回指令。雖然在高級語言(java)看來它就是一條指令,但實際上卻是三條CPU指令,並且這三條指令的原子性無法保證。也就是說,可能在執行到任意一條指令的時候被打斷,CPU被其他線程搶佔了。
  • JAVA基礎之Applet
    下面是一個Applet版的HelloWorld文件名:HelloWorld.javaimport java.applet.Applet; import java.awt.Graphics; public class HelloWorld extends Applet { String title; public void init(){ title="Hello
  • 5月編程最新語言指數排名 java不再是第一 php才是未來最好語言
    前幾天谷歌CEO皮查伊在會議展示了人工智慧的成果,在人工智慧上谷歌領先世界,這次的展示讓人工智慧重新改變的人們認識,也直接導致人工智慧程式語言Python的熱度在5月排名第一。從5月排名指數上看出來java首次被Python超越成為第一寶座,PHP挺近第四位,緊接這才是c#。每個人都說PHP是世界上最好的語言,在PHP每次指數都不斷提高下,不久將來PHP才是最好語言。
  • 開課吧:自學程式語言學哪種比較好?編程學習建議!
    自學編程受到入門基礎知識的限制,不建議學習一些底層語言,比如C,C++,這兩門語言涉及到的指針,內存的知識非常抽象,很容易反措,並且這兩門語言與底層硬體密切相關,如果沒有系統的學過計算機體系結構的知識,不容易深入。
  • 跟我學java編程—Java的Scanner類
    語句「import java.util.*;」,用於導入包含Scanner的類庫,Scanner包含在Java 核心類庫util中,要使用Scanner類,必須導入java.util庫,類庫導入關鍵字為import。
  • 為什麼Java語言比CPP競爭編程要慢?
    最重要的因素是開始競爭性編程時選擇合適的語言。通常,我們選擇語法簡短,執行速度非常快或我們熟悉的語言,並且我們知道特定語言的所有工作模式,無論是Java還是C ++。大多數程式設計師使用C ++進行競爭性編程,也有許多老程式設計師轉而使用C ++。
  • 最好的程式語言?美國出數據了,Java吃香,PHP敗了
    編碼江湖,長期以來就不存在什麼武林盟主,相反的,各類程式語言則在自己擅長的領域獨領風騷,誰要敢挑頭立盟主,就會死於滿天的口水之中。如今一組來自美國的數據,卻再次引起了「世界上最好程式語言」之爭。目前Rasp-berry Pi等新興平臺已經將其作為開發基礎。它的缺點也很多,速度慢、移動領域表現糟糕、由於是動態語言,因此需要進行更多測試,且會帶來某些只在特定運行時中出現的錯誤。Python在美國人才市場的表現如何呢?
  • 關於java圖標是個咖啡的N種猜測
    為什麼java的圖標是個咖啡杯呢?小編也很好奇,於是收集了一些關於為什麼是咖啡杯的各種猜測,你認為哪個最靠譜?(圖片來源於網絡侵刪)第一個版本2000年度的JavaOne國際會議大廳,一陣濃鬱的咖啡香氣撲鼻。
  • 蘋果,安卓開發,手機app,C語言JAVA的關係
    首先,android開發,繞不開的就是JAVA編程,因為android的底層就是java,再底層就是C語言,可以這樣理解:java是一種程式語言,android應用用java開發,而c語言是另一種程式語言,也可以在android開發,但是需要通過java去調用C語言。