標籤:
在學習和使用Android網路編程時,我們接觸的僅僅是上層協議和介面如Apache的httpclient或者Android內建的httpURlconnection等等。對於這些介面的底層實現我們也有必要進一步的瞭解,這就要我們瞭解網路通訊層了,提到網路通訊層不得不說起ISO-OSI的七層協議經典架構,:
的左邊部分就是osi架構模型了, ISO/OSI模型,即開放式通訊系統互聯參考模型(Open System Interconnection Reference Model),是國際標準組織(ISO)提出的一個試圖使各種電腦在世界範圍內互連為網路的標準架構,簡稱OSI。圖最右邊則是TCP/IP協議模型了,TCP/IP協議模型(Transmission Control Protocol/Internet Protocol),包含了一系列構成互連網基礎的網路通訊協定(對應的中間部分),是Internet的核心協議,通過20多年的發展已日漸成熟,並被廣泛應用於區域網路和廣域網路中,目前已成為事實上的國際標準。TCP/IP協議簇是一組不同層次上的多個協議的組合,通常被認為是一個四層協議系統,與OSI的七層模型相對應。所以平常我們所提起的tcp/ip協議它並不是指一個具體的協議而是一個網路傳輸協議集合模型的統稱。對應於標準的osi模型它制定了自己的四層協議系統,每一層都包含了多個不同的通訊協定。
那麼TCP/IP到底是怎樣工作的又為什麼需要它呢?在世界上各地,各種各樣的電腦運行著各自不同的作業系統為大家服務,這些電腦在表達同一種資訊的時候所使用的方法是千差萬別。就好像聖經中上帝打亂了各地人的口音,讓他們無法合作一樣。電腦使用者意識到,電腦只是單兵作戰並不會發揮太大的作用。只有把它們聯合起來,電腦才會發揮出它最大的潛力。於是人們就想方設法的用電線把電腦串連到了一起。但是簡單的連到一起是遠遠不夠的,就好像語言不同的兩個人互相見了面,完全不能交流資訊。因而他們需要定義一些共通的東西來進行交流,TCP/IP就是為此而生。
下面我們就來看下具體的TCP/IP協議系統的分層,
看到上面層次圖,如果你之前有瞭解過,可能會讀上面的Socket抽象層表示疑惑,不打緊後面會介紹。我們可以看到TCP/IP層共四層:鏈路層、網路層、運輸層以及應用程式層,概念上是沒有中的socket抽象層。
(1). 鏈路層
也稱作資料連結層或網路介面層(在第一個圖中為網路介面層和硬體層),通常包括作業系統中的裝置驅動程式和電腦中對應的網路介面卡。它們一起處理與電纜(或其他任何傳輸媒介)的物理介面細節。ARP(位址解析通訊協定)和RARP(逆位址解析通訊協定)是某些網路介面(如乙太網路和令牌環網)使用的特殊協議,用來轉換IP層和網路介面層使用的地址。具體的細節可以轉到這邊文章《Android網路編程系列 一 TCP/IP協議族之鏈路層》
(2). 網路層
也稱作互連網層(在第一個圖中為網際層),處理分組在網路中的活動,例如分組的選路。在TCP/IP協議族中,網路層協議包括IP協議(網際協議),ICMP協議(Internet互連網控制報文協議),以及IGMP協議(Internet組管理協議)。
IP是一種網路層協議,提供的是一種不可靠的服務,它只是儘可能快地把分組從源結點送到目的結點,但是並不提供任何可靠性保證。同時被TCP和UDP使用。TCP和UDP的每組資料都通過端系統和每個中間路由器中的IP層在互連網中進行傳輸。
ICMP是IP協議的附屬協議。IP層用它來與其他主機或路由器交換錯誤判文和其他重要訊息。
IGMP是Internet組管理協議。它用來把一個UDP資料報多播到多個主機。
具體的細節可以轉到這邊文章《Android網路編程系列 一 TCP/IP協議族之網際層》
(3). 傳輸層
主要為兩台主機上的應用程式提供端到端的通訊。在TCP/IP協議族中,有兩個互不相同的傳輸協議:TCP(傳輸控制通訊協定)和UDP(使用者資料包通訊協定)。
TCP為兩台主機提供高可靠性的資料通訊。它所做的工作包括把應用程式交給它的資料分成合適的小塊交給下面的網路層,確認接收到的分組,設定發送最後確認分組的逾時時鐘等。由於運輸層提供了高可靠性的端到端的通訊,因此應用程式層可以忽略所有這些細節。為了提供可靠的服務,TCP採用了逾時重傳、發送和接收端到端的確認分組等機制。
UDP則為應用程式層提供一種非常簡單的服務。它只是把稱作資料報的分組從一台主機發送到另一台主機,但並不保證該資料報能到達另一端。一個資料報是指從發送方傳輸到接收方的一個資訊單元(例如,發送方指定的一定位元組數的資訊)。UDP協議任何必需的可靠性必須由應用程式層來提供。
具體的細節可以轉到這邊文章《Android網路編程系列 一 TCP/IP協議族之傳輸層》
(4). 應用程式層
應用程式層負責處理特定的應用程式細節。
(5). socket抽象層
對於中顯示 socket抽象層 這是一個很重要的 層次,是直接負責應用程式層和傳輸層通訊的,它的作用就是使得上層(應用程式層)通訊更方便更安全。實則就是對傳輸層的封裝對應用程式層的介面提供,這裡現就不擴充了,下一篇文章將重點介紹 socket抽象層
。
TCP/IP協議系統的每一層在資料轉送工作中分工都很明確,我們可以看其資料通訊圖:
首先,是最上層的應用程式層,使用者將應用資料通過應用程式層協議如http、ftp等封裝好必要的用戶端資料資訊傳遞到下一層(傳輸層),這時候傳輸層的tcp或udp協議就會為其攜帶上用戶端連接埠等資訊。封裝好了接著傳遞到網際層,在這裡就會為資料攜帶上用戶端的IP等資訊。再接著講資料發送到鏈路層,這一層為待傳送的資料加入一個乙太網路協議頭,並進行CRC編碼,為最後的資料轉送做準備同時還為資料攜帶了目標主機的mac地址(每個乙太網路卡mac地址都是唯一的)。再往下則是硬體層次了,負責網路的傳輸,這個層次的定義包括網線的制式,網卡的定義等等.
瞭解了資料發送,接下了看看目標主機對資料的接收過程,如:
上面提到了客戶機在傳輸資料在鏈路層會為資料攜帶上目標主機的mac地址,所有就可以根據這個資料攜帶的IP地址和mac地址在互連網中尋找到當目的主機,接著當目標主機收到一個乙太網路資料幀時,資料就開始從協議棧中由底向上升,同時去掉各層協議加上的報文首部。每層協議盒都要去檢查報文首部中的協議標識,以確定接收資料的上層協議。這個過程稱作分用(Demultiplexing)。協議是通過目的連接埠號碼、源I P地址和源連接埠號碼進行解包的。
以上呢就是關於TCP/IP協議通訊的大致流程了,接下來為了更好的吸收和理解這些知識點,你有必要瞭解以下基本概念:
- ip地址
網路上每一個節點都必須有一個獨立的Internet地址(也叫做IP地址)。現在,通常使用的IP地址是一個32bit的數字,也就是我們常說的IPv4標準,這32bit的數字分成四組,也就是常見的255.255.255.255的樣式。IPv4標準上,地址被分為五類,我們常用的是B類地址。具體的分類請參考其他文檔。需要注意的是IP地址是網路號+主機號的組合,這非常重要。
- DNS
網域名稱系統是一個分布的資料庫,它提供將主機名稱(就是網址啦)轉換成IP地址的服務。 DNS 是電腦網域名稱系統 (Domain Name System 或Domain Name Service) 的縮寫,它是由解析器以及網域名稱伺服器組成的。網域名稱伺服器是指儲存有該網路中所有主機的網域名稱和對應IP地址,並具有將網域名稱轉換為IP地址功能的伺服器。
- RFC
RFC是什嗎?RFC就是tcp/ip協議的標準文檔,在這裡我們可以看到RFC那長長的定義列表,現在它一共有4000多個協議的定義,當然,我們所要學習的,也就是那麼十幾個協議而已。
- 連接埠號碼(port)
注意,這個號碼是用在TCP,UDP上的一個邏輯號碼,用於區別開主機上不同應用程式。伺服器一般都是通過知名連接埠號碼來識別的。例如,對於每個TCP/IP實現來說,FTP伺服器的TCP連接埠號碼都是21,每個Telnet伺服器的TCP連接埠號碼都是23,每個TFTP (簡單檔案傳送協議)伺服器的UDP連接埠號碼都是69。任何TCP/IP實現所提供的服務都用知名的1~1023之間的連接埠號碼。這些知名連接埠號碼由Internet號分配機構(Internet Assigned Numbers Authority, IANA)來管理。知名連接埠號碼介於1~255之間;256~1023之間的連接埠號碼通常都是由Unix系統佔用,以提供一些特定的Unix服務;1024~5000連接埠號碼用於用戶端分配臨時連接埠號碼;大於5000的連接埠號碼是為其他伺服器預留的。
- 應用編程介面
現在常用的編程介面有socket和TLI。這就是上面所提到socket抽象層。
Android網路編程系列 一 TCP/IP協議族