Socket學習網路基礎準備


本節引言:

為了照顧沒學過Java Socket的初學者,或是說捋一捋Android開發中涉及到的網路協定相關的概念, 畢竟面試的時候,面試官來了句給我說下網路協定有幾層?那麼IP協定在哪層? Socket是什麼鬼? 分哪幾種? TCP和UDP協定又在哪一層?有什麼差別...嗯,這...所以學習本節概念性的理論還是很有 必要的!那麼話不多說,開始本節內容~


1.OSI七層網路模型淺析

當然,我們不是專業搞網路工程的,只要知道有哪些層,大概是拿來幹嘛的就可以了!

OSI七層網路模型(由下往上)

  • 物理層(Physical):設備之間的資料通訊提供傳輸媒體及互連設備,為資料傳輸提供可靠的 環境。可以理解為網路傳輸的實體媒體部分,例如網卡,網路線,集線器,中繼器,調變解調器等! 在這一層,資料尚未被組織,僅作為原始的位元流或電氣電壓處理,這一層的單位是:bit位元
  • ##資料鏈結層(Datalink):可以理解為資料通道,主要功能是如何在不可靠的實體線路上進行 資料的可靠傳遞,改層作用包括:實體位址尋址,資料的成幀,流量控制,資料檢錯以及重發等! 另外這個資料連結指的是:實體層要為終端設備間的資料通訊提供傳輸媒體及其連線。媒體是 長期的,連結是有生存期的。在連接生存期內,收發兩端可以進行不等的一次或多次數據通訊。 每次通訊都要經過建立通訊聯絡和拆除通訊聯絡兩個過程!這種建立起來的資料收發關係~ 此層的設備有:網卡,網橋,網路交換器,另外該層的單位為:訊框
  • 網路層(Network):主要功能是將網路位址翻譯成對應的實體位址,並決定如何將資料從發 送方路由到接收方,所謂的路由與尋徑:一台終端可能需要與多台終端通信,這樣就產生的了 把任兩台終端設備資料連結起來的問題!簡單點說就是:建立網路連線和為上層提供服務! 該層的設備有:路由!該層的單位為:封包,另外IP協定就在這一層!
  • 傳輸層(Transport):向上面的應用層提供通訊服務,面向通訊部分的最高層,同時也是 使用者功能中的最低層。接收會話層數據,必要時將數據分割,並將這些數據交給網絡 層,並且保證這些資料段有效的到達對端!所以這層的單位是:資料段;而這層有兩個很重要 的協定是:TCP傳輸控制協定UDP用戶資料報協定,這也是本章節核心講解的部分!
  • 會話層(Session):負責在網路中的兩個節點之間建立、維持和終止通訊。建立通信鏈接, 保持會話過程通訊連結的暢通,同步兩個節點之間的對話,決定通訊是否中斷以及通訊中斷時 決定從何處重新發送,即不同機器上的使用者之間會話的建立及管理!
  • 表示層(Presentation):對來自應用層的指令和資料進行解釋,對各種語法賦予相應 的意義,並依照一定的格式傳送給會話層。其主要功能為"處理使用者資訊的表示問題,如編碼、 資料格式轉換與加密解密,壓縮解壓縮"等
  • 應用程式層(Application):OSI參考模型的最高層,為使用者的應用程式提供網路服務。 它在其他6層工作的基礎上,負責完成網絡中應用程式與網絡操作系統之間的聯繫,建立與結束用戶之間的聯繫,並完成網絡用戶提出的各種網絡服務及應用所需的監督、管理和服務等各種協議。此外,該層也負責協調各個應用程式間的工作。應用層提供給使用者的服務和協定有:檔案服務、目錄服務、檔案傳輸服務(FTP)、遠端登入服務(Telnet)、電子郵件服務(E-mail)、列印服務、安全服務、網路管理服務、資料庫服務等。

好的上面我們淺述了OSI七層網路模型,以下總結下:

OSI是一個理想的模型,一般的網路系統只涉及其中的幾層,在七層模型中,每一層都提供一個特殊 的網路功能,從網路功能角度觀察:

  • 下面4層(物理層、資料鏈結層、網路層和傳輸層)主要提供資料傳輸和交換功能, 即以節點到節點之間的通訊為主
  • 第4層作為上下兩部分的橋樑,是整個網路體系結構中最關鍵的部分;
  • 上3層(會話層、表示層和應用層)則以提供使用者與應用程式之間的資訊和資料處理功能為主。

簡言之,下4層主要完成通訊子網路的功能,上3層主要完成資源子網路的功能。

—以上內容參考自:OSI七層模型詳解


2.TCP/IP四層模型

1.jpg

TCP/IP是一組協定的代名詞,它還包括許多協議,組成了TCP/IP協定簇。 TCP/IP協定簇分為四層,IP位於協定簇的第二層(對應OSI的第三層),TCP位於協定簇的第三層 (對應OSI的第四層)。 TCP/IP通訊協定採用了4層的層級結構,每一層都呼叫它的下一層所提供 的網路來完成自己的需求。這4層分別為:

  • 應用程式層:應用程式間溝通的層,如簡單電子郵件傳輸(SMTP)、檔案傳輸協定(FTP)、 網路遠端存取協定(Telnet)等。
  • 傳輸層:在此層中,它提供了節點間的資料傳送服務,如傳輸控制協定(TCP)、 用戶資料報協定(UDP)等,TCP和UDP加入傳輸資料並將它傳送到下一層中, 這一層負責傳送數據,並且確定數據已被送達並接收。
  • 網路互連層:負責提供基本的資料封包傳送功能,讓每個封包都能夠到達目 的主機(但不檢查是否被正確接收),如網際協定(IP)。
  • 主機到網路層:對實際的網路媒體的管理,定義如何使用實際網路 (如Ethernet、Serial Line等)來傳送資料。

3.TCP/UDP區別講解

#好吧,前兩點侃侃而談,只是給大家普及下OSI七層模型和TCP/ IP四層模型的概念,接下來要說的是 和我們Socket開發相關的一些概念名詞了!

1)IP位址

2.png

2)連接埠

#1. 用來區分不同的應用程式

2. 端口號的範圍為0-65535,其中0-1023未系統的保留端口,我們的程式盡可能別使用這些端口!

3. IP位址和連接埠號碼組成了我們的Socket,Socket是網路運行程式間雙向通訊連結的終點, 是TCP和UDP的基礎!

4. 常用協定使用的連接埠:HTTP:80,FTP:21,TELNET:23

3.png

3 )TCP協定與UDP協定的比較:

TCP協定流程詳解:

首先TCP/IP是一個協定簇,裡麵包含很多協定的。 UDP只是其中的一個。之所以命名為TCP/IP協議, 因為TCP,IP協議是兩個很重要的協議,就用他兩命名了。

下面我們來講解TCP協定和UDP協定的差異:

TCP(Transmission Control Protocol,傳輸控制協定)是面向連線的協議,即在收發數據錢 ,都需要與對面建立可靠的鏈接,這也是面試經常會問到的TCP的三次握手以及TCP的四次揮手三次握手: 建立一個TCP連線時,需要客戶端和服務端總共發送3個包以確認連線的建立, 在Socket程式設計中,這個過程由客戶端執行connect來觸發,具體流程圖如下:

4.png

  • 第一次握手:Client將標誌位元SYN置為1,隨機產生一個值seq=J,並將該封包傳送給Server, Client進入SYN_SENT狀態,等待Server確認。
  • 第二握手:Server收到封包後由標誌位SYN=1知道Client請求建立連接,Server將標誌位 SYN和ACK都置為1,ack=J+1,隨機產生一個值seq=K,並將該封包傳送給Client以確認連線請求 ,Server進入SYN_RCVD狀態。
  • 第三次握手:Client收到確認後,檢查ack是否為J+1,ACK是否為1,如果正確則將標誌位元ACK 置為1,ack=K+1,並將該封包傳送給Server,Server檢查ack是否為K+1,ACK是否為1,如果正確則 連線建立成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨後Client與Server之間可以 開始傳輸資料了。

四次揮手: 終止TCP連接,就是指斷開一個TCP連線時,需要客戶端和服務端總共發送4個包以確認連線的斷開。 在Socket程式設計中,這個過程由客戶端或服務端任一方執行close來觸發,具體流程圖如下:

5.png

  • 第一次揮手:Client發送一個FIN,用來關閉Client到Server的資料傳送,Client進入 FIN_WAIT_1狀態
  • 第二揮手:Server收到FIN後,發送一個ACK給Client,確認序號為收到序號+1(與SYN相同, 一個FIN佔用一個序號),Server進入CLOSE_WAIT狀態。
  • 第三次揮手:Server發送一個FIN,用來關閉Server到Client的資料傳送,Server進入LAST_ACK 狀態。
  • 第四次揮手:Client收到FIN後,Client進入TIME_WAIT狀態,接著發送一個ACK給Server,確認序號為收到序號+1,Server進入CLOSED狀態,完成四次揮手。 另外也可能是同事發起主動關閉的情況:

6.png

另外還可能有一個常見的問題就是:為什麼建立連線是三次握手,而關閉連線卻是四次揮手呢? 答:因為服務端在LISTEN狀態下,收到建立連線請求的SYN封包後,把ACK和SYN放在一個封包裡 發送給客戶端。而關閉連線時,當收到對方的FIN報文時,僅僅表示對方不再發送資料了但是還 能接收數據,己方也未必全部數據都發送給對方了,所以己方可以立即close,也可以發送一些 資料給對方後,再發送FIN報文給對方來表示同意現在關閉連接,因此,己方ACK和FIN一般都會 分開發送。


UDP協定詳解

UDP(User Datagram Protocol)用戶資料報協議,非連接的協議,傳輸資料之前源端和終端不 建立連接,當它想傳送時就簡單地去抓取來自應用程式的數據,並儘可能快地把它扔到網路上。 在發送端,UDP傳送資料的速度只是受應用程式產生資料的速度、電腦的能力和傳輸頻寬 的限制;在接收端,UDP把每個訊息段放在佇列中,應用程式每次從佇列中讀取一個訊息段。 相較之下TCP就是無需建立鏈接,結構簡單,無法保證正確性,容易丟包

——上述內容部分摘自:

TCP/IP三次握手與四次揮手

TCP和UDP的差異(轉)


4.Java中對於網路提供的幾個關鍵類別:

針對不同的網路通訊層次,Java提供給我們的網路功能有四大類:

  • InetAddress: 用於標識網路上的硬體資源
  • URL: 統一資源定位符,透過URL可以直接讀取或寫入網路上的資料
  • Socket和ServerSocket: 使用TCP協定實作網路通訊的Socket相關的類別
  • Datagram: 使用UDP協議,將資料保存在資料封包中,透過網路進行通訊

本節我們只介紹前兩個類,Socket與Datagram到TCP和UDP的章節再講解!

~InetAddress的使用範例

範例程式碼

public class InetAddressTest {
	public static void main(String[] args) throws Exception{
		//获取本机InetAddress的实例:
		InetAddress address = InetAddress.getLocalHost();
		System.out.println("本机名:" + address.getHostName());
		System.out.println("IP地址:" + address.getHostAddress());
		byte[] bytes = address.getAddress();
		System.out.println("字节数组形式的IP地址:" + Arrays.toString(bytes));
		System.out.println("直接输出InetAddress对象:" + address);
	}
}

執行結果圖

7.png

~URL:這個就不用說了吧,忘了可以看會前面Http協定講解那裡~


本節小結:

本節全是概念,看起來可能夠嗆的是把,不過看不懂也沒關係,知道七層模型每層叫 什麼,大概拿來幹嘛,還有TCP三次握手和四次揮手,就可以了!當然,這只是為了 應付面試~實際開發我們哪會糾結這個...直接Socket是吧~嗯,下節我們就來開始學習 Android中的Socket通訊~謝謝~