在世界上各地,各類各樣的電腦運行着各自不一樣的操做系統爲你們服務,這些電腦在表達同一種信息的時候所使用的方法是千差萬別。就好像聖經中上帝打亂了各地人的口音,讓他們沒法合做同樣。計算機使用者意識到,計算機只是單兵做戰並不會發揮太大的做用。只有把它們聯合起來,電腦纔會發揮出它最大的潛力。因而人們就千方百計的用電線把電腦鏈接到了一塊兒。 可是簡單的連到一塊兒是遠遠不夠的,就好像語言不一樣的兩我的互相見了面,徹底不能交流信息。於是他們須要定義一些共通的東西來進行交流,TCP/IP就是爲此而生。TCP/IP不是一個協議,而是一個協議族的統稱。裏面包括了**IP協議,IMCP協議,TCP協議**,以及咱們更加熟悉的http、ftp、pop3協議等等。電腦有了這些,就好像學會了外語同樣,就能夠和其餘的計算機終端作自由的交流了。
提到協議分層,咱們很容易聯想到ISO-OSI的七層協議經典架構,可是TCP/IP協議族的結構則稍有不一樣。如圖所示
數據庫
TCP/IP協議族按照層次由上到下,層層包裝。編程
再往下則是硬件層次了,負責網絡的傳輸,這個層次的定義包括網線的制式,網卡的定義等等(這些咱們就不用關心了,咱們也不作網卡),因此有些書並不把這個層次放在tcp/ip協議族裏面,由於它幾乎和tcp/ip協議的編寫者沒有任何的關係。發送協議的主機從上自下將數據按照協議封裝,而接收數據的主機則按照協議從獲得的數據包解開,最後拿到須要的數據。這種結構很是有棧的味道,因此某些文章也把tcp/ip協議族稱爲tcp/ip協議棧。服務器
在學習協議以前,咱們應該具有一些基本知識。markdown
互聯網地址(ip地址)
網絡上每個節點都必須有一個獨立的Internet地址(也叫作IP地址)。如今,一般使用的IP地址是一個32bit的數字,也就是咱們常說的IPv4標準,這32bit的數字分紅四組,也就是常見的255.255.255.255的樣式。IPv4標準上,地址被分爲五類,咱們經常使用的是B類地址。具體的分類請參考其餘文檔。須要注意的是IP地址是網絡號+主機號的組合,這很是重要。網絡
域名系統
域名系統是一個分佈的數據庫,它提供將主機名(就是網址啦)轉換成IP地址的服務。架構
RFC
RFC是什麼?RFC就是tcp/ip協議的標準文檔,在這裏咱們能夠看到RFC那長長的定義列表,如今它一共有4000多個協議的定義,固然,咱們所要學習的,也就是那麼十幾個協議而已。socket
端口號(port)
注意,這個號碼是用在TCP,UDP上的一個邏輯號碼,並非一個硬件端口,咱們平時說把某某端口封掉了,也只是在IP層次把帶有這個號碼的IP包給過濾掉了而已。tcp
應用編程接口
如今經常使用的編程接口有socket和TLI。而前面的有時候也叫作「Berkeley socket」,可見Berkeley對於網絡的發展有多大的貢獻。模塊化
首先咱們應該瞭解到,像TCP/IP這樣的協議系統必須負責完成如下任務:
1. 把消息分解爲可管理的數據塊,而且這些數據塊可以有效的經過傳輸介質。
2. 與網絡適配器硬件鏈接。
3. 尋址,即發送端計算機必須可以定位到接收數據的計算機,接收計算機必須可以識別本身要接收的數據。
4. 將數據路由到目的計算機所在的子網,即便源子網和目的子網分處不一樣的物理網絡。
5. 執行錯誤控制、流量控制和確認;對可靠的通訊而言、發送和接收計算機必須可以發現並可以糾正傳輸錯誤,並控制數據流。
6. 從應用程序接收數據並傳輸到網絡。
7. 從網絡接收數據並傳輸到應用程序。post
爲了實現以上的功能,TCP/IP開發者使用了模塊化的設計,因此就制定了協議模型。
ISO制定的OSI參考模型的過於龐大、複雜招致了許多批評。與此對照,由技術人員本身開發的TCP/IP協議棧得到了更爲普遍的應用。如圖所示,是TCP/IP參考模型和OSI參考模型的對比示意圖。
TCP/IP協議棧是美國國防部高級研究計劃局計算機網(Advanced Research Projects Agency Network,ARPANET)和其後繼因特網使用的參考模型。ARPANET是由美國國防部(U.S.Department of Defense,DoD)贊助的研究網絡。最初,它只鏈接了美國境內的四所大學。隨後的幾年中,它經過租用的電話線鏈接了數百所大學和政府部門。最終ARPANET發展成爲全球規模最大的互連網絡-因特網。最初的ARPANET於1990年永久性地關閉。
TCP/IP參考模型分爲四個層次:應用層、傳輸層、網絡互連層和主機到網絡層。如圖所示。(四層模型只是標準模型,實際使用中並非惟一的模型,好比RFC 871中描述的ARPAnet模型有3層:網絡接口層、主機到主機層、處理/應用層。)
在TCP/IP參考模型中,去掉了OSI參考模型中的會話層和表示層(這兩層的功能被合併到應用層實現)。同時將OSI參考模型中的數據鏈路層和物理層合併爲主機到網絡層。下面,分別介紹各層的主要功能。
實際上TCP/IP參考模型沒有真正描述這一層的實現,只是要求可以提供給其上層-網絡互連層一個訪問接口,以便在其上傳遞IP分組。因爲這一層次未被定義,因此其具體的實現方法將隨着網絡類型的不一樣而不一樣。
網絡互連層是整個TCP/IP協議棧的核心。它的功能是把分組發往目標網絡或主機。同時,爲了儘快地發送分組,可能須要沿不一樣的路徑同時進行分組傳遞。所以,分組到達的順序和發送的順序可能不一樣,這就須要上層必須對分組進行排序。
網絡互連層定義了分組格式和協議,即IP協議(Internet Protocol)。
網絡互連層除了須要完成路由的功能外,也能夠完成將不一樣類型的網絡(異構網)互連的任務。除此以外,網絡互連層還須要完成擁塞控制的功能。
在TCP/IP模型中,傳輸層的功能是使源端主機和目標端主機上的對等實體能夠進行會話。在傳輸層定義了兩種服務質量不一樣的協議。即:傳輸控制協議TCP(transmission control protocol)和用戶數據報協議UDP(user datagram protocol)。
TCP協議是一個面向鏈接的、可靠的協議。它將一臺主機發出的字節流無差錯地發往互聯網上的其餘主機。在發送端,它負責把上層傳送下來的字節流分紅報文段並傳遞給下層。在接收端,它負責把收到的報文進行重組後遞交給上層。TCP協議還要處理端到端的流量控制,以免緩慢接收的接收方沒有足夠的緩衝區接收發送方發送的大量數據。
UDP協議是一個不可靠的、無鏈接協議,主要適用於不須要對報文進行排序和流量控制的場合。
TCP/IP模型將OSI參考模型中的會話層和表示層的功能合併到應用層實現。
應用層面向不一樣的網絡應用引入了不一樣的應用層協議。其中,有基於TCP協議的,如文件傳輸協議(File Transfer Protocol,FTP)、虛擬終端協議(TELNET)、超文本連接協議(Hyper Text Transfer Protocol,HTTP),也有基於UDP協議的。
IP協議是TCP/IP協議族中最爲核心的協議。它提供不可靠、無鏈接的服務,也即依賴其餘層的協議進行差錯控制。在局域網環境,IP協議每每被封裝在以太網幀中傳送。而全部的TCP、UDP、ICMP、IGMP數據都被封裝在IP數據報中傳送。如圖2-3所示:
圖2-3 TCP/IP報文封裝
圖2-4是IP頭部(報頭)格式:(RFC 791)。
其中:
●版本(Version)字段:佔4比特。用來代表IP協議實現的版本號,當前通常爲IPv4,即0100。
●報頭長度(Internet Header Length,IHL)字段:佔4比特。是頭部佔32比特的數字,包括可選項。普通IP數據報(沒有任何選項),該字段的值是5,即160比特=20字節。此字段最大值爲60字節。
●服務類型(Type of Service ,TOS)字段:佔8比特。其中前3比特爲優先權子字段(Precedence,現已被忽略)。第8比特保留未用。第4至第7比特分別表明延遲、吞吐量、可靠性和花費。當它們取值爲1時分別表明要求最小時延、最大吞吐量、最高可靠性和最小費用。這4比特的服務類型中只能置其中1比特爲1。能夠全爲0,若全爲0則表示通常服務。服務類型字段聲明瞭數據報被網絡系統傳輸時能夠被怎樣處理。例如:TELNET協議可能要求有最小的延遲,FTP協議(數據)可能要求有最大吞吐量,SNMP協議可能要求有最高可靠性,NNTP(Network News Transfer Protocol,網絡新聞傳輸協議)可能要求最小費用,而ICMP協議可能無特殊要求(4比特全爲0)。實際上,大部分主機會忽略這個字段,但一些動態路由協議如OSPF(Open Shortest Path First Protocol)、IS-IS(Intermediate System to Intermediate System Protocol)能夠根據這些字段的值進行路由決策。
●總長度字段:佔16比特。指明整個數據報的長度(以字節爲單位)。最大長度爲65535字節。
●標誌字段:佔16比特。用來惟一地標識主機發送的每一份數據報。一般每發一份報文,它的值會加1。
●標誌位字段:佔3比特。標誌一份數據報是否要求分段。
●段偏移字段:佔13比特。若是一份數據報要求分段的話,此字段指明該段偏移距原始數據報開始的位置。
●生存期(TTL:Time to Live)字段:佔8比特。用來設置數據報最多能夠通過的路由器數。由發送數據的源主機設置,一般爲3二、6四、128等。每通過一個路由器,其值減1,直到0時該數據報被丟棄。
●協議字段:佔8比特。指明IP層所封裝的上層協議類型,如ICMP(1)、IGMP(2) 、TCP(6)、UDP(17)等。
●頭部校驗和字段:佔16比特。內容是根據IP頭部計算獲得的校驗和碼。計算方法是:對頭部中每一個16比特進行二進制反碼求和。(和ICMP、IGMP、TCP、UDP不一樣,IP不對頭部後的數據進行校驗)。
●源IP地址、目標IP地址字段:各佔32比特。用來標明發送IP數據報文的源主機地址和接收IP報文的目標主機地址。
●可選項字段:佔32比特。用來定義一些任選項:如記錄路徑、時間戳等。這些選項不多被使用,同時並非全部主機和路由器都支持這些選項。可選項字段的長度必須是32比特的整數倍,若是不足,必須填充0以達到此長度要求。
TCP是一種可靠的、面向鏈接的字節流服務。源主機在傳送數據前須要先和目標主機創建鏈接。而後,在此鏈接上,被編號的數據段按序收發。同時,要求對每一個數據段進行確認,保證了可靠性。若是在指定的時間內沒有收到目標主機對所發數據段的確認,源主機將再次發送該數據段。
如圖2-5所示,是TCP頭部結構(RFC 79三、1323)。
圖2-5 TCP頭部結構
●源、目標端口號字段:佔16比特。TCP協議經過使用」端口」來標識源端和目標端的應用進程。端口號可使用0到65535之間的任何數字。在收到服務請求時,操做系統動態地爲客戶端的應用程序分配端口號。在服務器端,每種服務在」衆所周知的端口」(Well-Know Port)爲用戶提供服務。
●順序號字段:佔32比特。用來標識從TCP源端向TCP目標端發送的數據字節流,它表示在這個報文段中的第一個數據字節。
●確認號字段:佔32比特。只有ACK標誌爲1時,確認號字段纔有效。它包含目標端所指望收到源端的下一個數據字節。
●頭部長度字段:佔4比特。給出頭部佔32比特的數目。沒有任何選項字段的TCP頭部長度爲20字節;最多能夠有60字節的TCP頭部。
●標誌位字段(U、A、P、R、S、F):佔6比特。各比特的含義以下:
◆URG:緊急指針(urgent pointer)有效。
◆ACK:確認序號有效。
◆PSH:接收方應該儘快將這個報文段交給應用層。
◆RST:重建鏈接。
◆SYN:發起一個鏈接。
◆FIN:釋放一個鏈接。
●窗口大小字段:佔16比特。此字段用來進行流量控制。單位爲字節數,這個值是本機指望一次接收的字節數。
●TCP校驗和字段:佔16比特。對整個TCP報文段,即TCP頭部和TCP數據進行校驗和計算,並由目標端進行驗證。
●緊急指針字段:佔16比特。它是一個偏移量,和序號字段中的值相加表示緊急數據最後一個字節的序號。
●選項字段:佔32比特。可能包括」窗口擴大因子」、」時間戳」等選項。
UDP是一種不可靠的、無鏈接的數據報服務。源主機在傳送數據前不須要和目標主機創建鏈接。數據被冠以源、目標端口號等UDP報頭字段後直接發往目的主機。這時,每一個數據段的可靠性依靠上層協議來保證。在傳送數據較少、較小的狀況下,UDP比TCP更加高效。
如圖2-6所示,是UDP頭部結構(RFC 79三、1323):
●源、目標端口號字段:佔16比特。做用與TCP數據段中的端口號字段相同,用來標識源端和目標端的應用進程。
●長度字段:佔16比特。標明UDP頭部和UDP數據的總長度字節。
●校驗和字段:佔16比特。用來對UDP頭部和UDP數據進行校驗。和TCP不一樣的是,對UDP來講,此字段是可選項,而TCP數據段中的校驗和字段是必須有的。
在每一個TCP、UDP數據段中都包含源端口和目標端口字段。有時,咱們把一個IP地址和一個端口號合稱爲一個套接字(Socket),而一個套接字對(Socket pair)能夠惟一地肯定互連網絡中每一個TCP鏈接的雙方(客戶IP地址、客戶端口號、服務器IP地址、服務器端口號)。
如圖2-7所示,是常見的一些協議和它們對應的服務端口號。
圖2-7 常見協議和對應的端口號
須要注意的是,不一樣的應用層協議可能基於不一樣的傳輸層協議,如FTP、TELNET、SMTP協議基於可靠的TCP協議。TFTP、SNMP、RIP基於不可靠的UDP協議。
同時,有些應用層協議佔用了兩個不一樣的端口號,如FTP的20、21端口,SNMP的16一、162端口。這些應用層協議在不一樣的端口提供不一樣的功能。如FTP的21端口用來偵聽用戶的鏈接請求,而20端口用來傳送用戶的文件數據。再如,SNMP的161端口用於SNMP管理進程獲取SNMP代理的數據,而162端口用於SNMP代理主動向SNMP管理進程發送數據。
還有一些協議使用了傳輸層的不一樣協議提供的服務。如DNS協議同時使用了TCP 53端口和UDP 53端口。DNS協議在UDP的53端口提供域名解析服務,在TCP的53端口提供DNS區域文件傳輸服務。
第一層 物理層
第一層負責最後將信息編碼成電流脈衝或其它信號用於網上傳輸。它由計算機和網絡介質之間的實際界面組成,可定義電氣信號、符號、線的狀態和時鐘要求、數據編碼和數據傳輸用的鏈接器。如最經常使用的RS-232規範、10BASE-T的曼徹斯特編碼以及RJ-45就屬於第一層。全部比物理層高的層都經過事先定義好的接口而與它通話。如以太網的附屬單元接口(AUI),一個DB-15鏈接器可被用來鏈接層一和層二。
第二層 數據鏈路層
數據鏈路層經過物理網絡鏈路提供可靠的數據傳輸。不一樣的數據鏈路層定義了不一樣的網絡和協議特徵,其中包括物理編址、網絡拓撲結構、錯誤校驗、幀序列以及流控。物理編址(相對應的是網絡編址)定義了設備在數據鏈路層的編址方式;網絡拓撲結構定義了設備的物理鏈接方式,如總線拓撲結構和環拓撲結構;錯誤校驗向發生傳輸錯誤的上層協議告警;數據幀序列從新整理並傳輸除序列之外的幀;流控可能延緩數據的傳輸,以使接收設備不會由於在某一時刻接收到超過其處理能力的信息流而崩潰。數據鏈路層實際上由兩個獨立的部分組成,介質存取控制(Media Access Control,MAC)和邏輯鏈路控制層(Logical Link Control,LLC)。MAC描述在共享介質環境中如何進行站的調度、發生和接收數據。MAC確保信息跨鏈路的可靠傳輸,對數據傳輸進行同步,識別錯誤和控制數據的流向。通常地講,MAC只在共享介質環境中才是重要的,只有在共享介質環境中多個節點才能鏈接到同一傳輸介質上。IEEE MAC規則定義了地址,以標識數據鏈路層中的多個設備。邏輯鏈路控制子層管理單一網絡鏈路上的設備間的通訊,IEEE 802.2標準定義了LLC。LLC支持無鏈接服務和麪向鏈接的服務。在數據鏈路層的信息幀中定義了許多域。這些域使得多種高層協議能夠共享一個物理數據鏈路。
第三層 網絡層
網絡層負責在源和終點之間創建鏈接。它通常包括網絡尋徑,還可能包括流量控制、錯誤檢查等。相同MAC標準的不一樣網段之間的數據傳輸通常只涉及到數據鏈路層,而不一樣的MAC標準之間的數據傳輸都涉及到網絡層。例如IP路由器工做在網絡層,於是能夠實現多種網絡間的互聯。
第四層 傳輸層
傳輸層向高層提供可靠的端到端的網絡數據流服務。傳輸層的功能通常包括流控、多路傳輸、虛電路管理及差錯校驗和恢復。流控管理設備之間的數據傳輸,確保傳輸設備不發送比接收設備處理能力大的數據;多路傳輸使得多個應用程序的數據能夠傳輸到一個物理鏈路上;虛電路由傳輸層創建、維護和終止;差錯校驗包括爲檢測傳輸錯誤而創建的各類不一樣結構;而差錯恢復包括所採起的行動(如請求數據重發),以便解決發生的任何錯誤。傳輸控制協議(TCP)是提供可靠數據傳輸的TCP/IP協議族中的傳輸層協議。
第五層 會話層
會話層創建、管理和終止表示層與實體之間的通訊會話。通訊會話包括髮生在不一樣網絡應用層之間的服務請求和服務應答,這些請求與應答經過會話層的協議實現。它還包括建立檢查點,使通訊發生中斷的時候能夠返回到之前的一個狀態。
第六層 表示層
表示層提供多種功能用於應用層數據編碼和轉化,以確保以一個系統應用層發送的信息能夠被另外一個系統應用層識別。表示層的編碼和轉化模式包括公用數據表示格式、性能轉化表示格式、公用數據壓縮模式和公用數據加密模式。 公用數據表示格式就是標準的圖像、聲音和視頻格式。經過使用這些標準格式,不一樣類型的計算機系統能夠相互交換數據;轉化模式經過使用不一樣的文本和數據表示,在系統間交換信息,例如ASCII(American Standard Code for Information Interchange,美國標準信息交換碼);標準數據壓縮模式確保原始設備上被壓縮的數據能夠在目標設備上正確的解壓;加密模式確保原始設備上加密的數據能夠在目標設備上正確地解密。 表示層協議通常不與特殊的協議棧關聯,如QuickTime是Applet計算機的視頻和音頻的標準,MPEG是ISO的視頻壓縮與編碼標準。常見的圖形圖像格式PCX、GIF、JPEG是不一樣的靜態圖像壓縮和編碼標準。
第七層 應用層
應用層是最接近終端用戶的OSI層,這就意味着OSI應用層與用戶之間是經過應用軟件直接相互做用的。注意,應用層並不是由計算機上運行的實際應用軟件組成,而是由嚮應用程序提供訪問網絡資源的API(Application Program Interface,應用程序接口)組成,這類應用軟件程序超出了OSI模型的範疇。應用層的功能通常包括標識通訊夥伴、定義資源的可用性和同步通訊。由於可能丟失通訊夥伴,應用層必須爲傳輸數據的應用子程序定義通訊夥伴的標識和可用性。定義資源可用性時,應用層爲了請求通訊而必須斷定是否有足夠的網絡資源。在同步通訊中,全部應用程序之間的通訊都須要應用層的協同操做。 OSI的應用層協議包括文件的傳輸、訪問及管理協議(FTAM) ,以及文件虛擬終端協議(VIP)和公用管理系統信息(CMIP)等。