在學習和使用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抽象層。