TCP/IP四層協議系統
鏈路層,有時也稱做數據鏈路層或網絡接口層,一般包括操做系統中的設備驅動程序和計算機中對應的網絡接口卡。它們一塊兒處理與電纜(或其餘任何傳輸媒介)的物理接口細節。算法
網絡層,有時也稱做互聯網層,處理分組在網絡中的活動,例如分組的選路。在TCP/IP協議族中,網絡層協議包括IP協議(網際協議),ICMP協議(Internet互聯網控制報文協議),以及IGMP協議(Internet組管理協議)。緩存
運輸層主要爲兩臺主機上的應用程序提供端到端的通訊。在TCP/IP協議族中,有兩個互不相同的傳輸協議:TCP(傳輸控制協議)和UDP(用戶數據報協議)。服務器
TCP爲兩臺主機提供高可靠性的數據通訊。它所作的工做包括把應用程序交給它的數據分紅合適的小塊交給下面的網絡層,確認接收到的分組,設置發送最後確認分組的超時時鐘等。因爲運輸層提供了高可靠性的端到端的通訊,所以應用層能夠忽略全部這些細節
UDP則爲應用層提供一種很是簡單的服務。它只是把稱做數據報的分組從一臺主機發送到另外一臺主機,但並不保證該數據報能到達另外一端。任何須需的可靠性必須由應用層來提供
應用層負責處理特定的應用程序細節。幾乎各類不一樣的TCP/IP實現都會提供下面這些通用的應用程序:
Telnet 遠程登陸。
FTP 文件傳輸協議。
SMTP 簡單郵件傳送協議。
SNMP 簡單網絡管理協議
鏈路層
Internet協議族中的最底層協議,鏈路層協議 在TCP/IP協議族中,鏈路層主要有三個目的:網絡
爲IP模塊發送和接收IP數據報
爲ARP模塊發送ARP請求和接收ARP應答
爲RARP發送RARP請求和接收RARP應答
TCP/IP支持多種不一樣的鏈路層協議,這取決於網絡所使用的硬件,如以太網、令牌環網、FDDI(光纖分佈式數據接口)及RS-232串行線路等分佈式
以太網鏈路層協議 , 兩個串行接口鏈路層協議 ( S L I P 和 P P P ), 以及大多數實現都包含的環回( l o o p b a c k )驅動程序oop
SLIP:串行線路IP
測試
它是一種在串行線路上對IP數據報進行封裝的簡單形式,下面的規則描述了SLIP協議定義的幀格式:操作系統
IP數據報以一個稱做END( 0xc0)的特殊字符結束,同事爲了防止數據報到來以前的線路噪聲被當成數據報內容,大多數實如今數據報的開始出也傳一個END字符(若是有線路噪聲,那麼END字符將技術這份錯誤的報文,這樣當前的報文得以正確的傳輸,而前一個錯誤報文交給上層後,會發現其內容毫無心義而被丟棄)
若是IP報文中某個字符爲END,那麼就要連續傳輸兩個字節0xdb和oxdc來取代它。oxdb這個特殊字符被稱做SLIP的ESC字符
若是IP報文中的某個字符爲SLIP的ESC字符,那麼就要連續傳輸兩個字節0xdb和oxdd來取代它
SLIP是一種簡單的幀封裝方法,其中有一些缺陷:code
每一端必須知道對象的IP地址,沒有辦法把本端的IP地址通知給另外一端
數據幀中沒有類型字段,若是一條串行線路用於SLIP,那麼它不能同時使用其餘協議
SLIP沒有再數據幀中加上檢驗和,若是SLIP傳輸的報文被線路噪聲影響而發生錯誤,只能經過上層協議來發現(另外一種方法是新型的調制解調器能夠檢測並糾正錯誤報文)
儘管存在這些缺點, SLIP仍然是一種普遍使用的協議cdn
PPP:點對點協議
PPP點對點協議修改了SLIP協議中的全部缺陷,PPP包括如下三個部分:
1 ) 在串行鏈路上封裝IP數據報的方法。PPP既支持數據爲8位和無奇偶檢驗的異 步模式 (如大多數計算機上都廣泛存在的串行接口),還支持面向比特的同步連接
創建、配置及測試數據鏈路的鏈路控制協議( LCP : LinkControlProtocol )。它容許通訊雙方進行協商,以肯定不一樣的選項
針對不一樣網絡層協議的網絡控制協議( NCP : NetworkControlProtocol )體系。當前RFC定義的網絡層有IP、OSI網絡層、DECnet以及AppleTalk
PPP比SLIP具備下面這些優勢:
PPP支持在單根串行線路上運行多張協議,不僅是IP協議
每一幀都有循環冗餘檢驗
通訊雙方能夠進行IP地質的動態協商(使用IP網絡控制協議)
與CSLIP相似,對於TCP和IP報文首部進行壓縮
鏈路控制協議能夠對多個數據鏈路選項進行設置
爲這些優勢付出的代價是在麼一幀的首部增長3個字符,當創建鏈路時要發送幾幀協商數據,以及更爲複雜的實現
環回接口
大多數的產品都支持環回接口( Loopback Interface),以容許運行在同一臺主機上的客戶程序和服務器程序經過TCP/IP進行通訊
A類網絡號127就是爲環回接口預留的,根據慣例,大多數系統把IP地址127.0.0.1分配給這個接口,並命名爲localhost
一個傳給環回接口的IP數據報不能再任何網絡上出現:一旦傳輸層檢測到目的端地址是環回地址時,應該能夠省略部分傳輸層和所 有網絡層的邏輯操做。可是大多數的產品仍是照樣完成傳輸層和網絡層的全部過程,只是當I P 數據報離開網絡層時把它返回給本身
下圖爲環回接口處理IP數據報的過程
圖中須要指出的關鍵點是:
傳給環回地址(通常是127.0.0.1 )的任何數據均做爲IP輸入
傳給廣播地址或多播地址的數據報復制一份傳給環回接口,而後送到以太網上
任何傳給該主機IP地 址的數據均送到環回接口
最大傳輸單元MTU
以太網和802.3對數據幀的長度都有一個限制,其最大值分別是1500和1492字節。鏈路層的這個特性稱做MTU,最大傳輸單元,不一樣類型的網絡大可能是都有一個上限
若是IP層有一個數據報要傳,並且數據的長度比鏈路層的MTU還大,那麼IP層就須要進行分片,把數據報分紅若干片,這樣每一片都小於MTU
點到點的鏈路層(如SLIP和PPP)的MTU並不是指的是網絡媒體的物理特性。相反,它是一個邏輯限制,目的是爲交互使用提供足夠快的響應時間
IP:網際協議
在網絡中,每臺計算機都有一個惟一的地址,方便別人找到它,這個地址稱爲IP地址 IP是TCP/IP協議族中最爲核心的協議,全部的TCP/UDP/ICMP及IGMP數據都以IP數據報格式傳輸
IP提供不可靠、無鏈接的數據報傳送服務:
不可靠
( u n r e l i a b l e)指的是它不能保證 I P 數據報能成功地到達目的地。 IP提供最好的傳輸服務
若是發生某種錯誤時,如某個路由器暫時用完了緩衝區,IP有一個簡單的錯誤吹算法:丟棄該數據報,而後發送ICMP消息報給信源端
任何要求的可靠性必須由上層來提供(如TCP)
無鏈接
指的是IP並不維護任何關於後續數據報的狀態信息。每一個數據報的處理是相互獨立的
IP數據報能夠不按順序接收,若是一信源向相同的信宿發送兩個連續的數據報(先是A而後是B),每一個數據報都是獨立地進行路由選擇,可能選擇不一樣的路線,所以B可能在A到達以前先到達
IP首部
普通的IP首部長爲20個字節,除非含有選項字段 IP數據報格式及首部中的各字段,如圖所示:
最高位在左邊,記爲0bit,最低位在右邊,記爲31bit
版本:目前的協議版本號是4,由於IP有時也稱做IPV4
首部長部:首部佔32bit字的數目,包括任何選項。因爲它是一個 4比特字段,所以 首部最長爲60個字節
服務類型:包括一個3bit的優先權子字段(如今已被忽略),4bit的TOS子字段和1bit未用位必須置0,4bit的TOS分別表明:最小時延、最大吞吐量、最高可靠性和最小費用,4bit中只能置其中1bit
總長度:該字段用以指示整個IP數據包的長度,最長爲65535字節,包括頭和數據
標識符:惟一標識主機發送的每一份數據報
標誌:分爲3個字段,依次爲保留位、不分片位和更多片位
保留位:通常被置爲0
不分片位:表示該數據報是否被分片,若是被置爲1,則不能對數據報進行分片,若是要對其進行分片處理,就應將其置爲0
更多片位:除了最後一個分片,其餘每一個組成數據報的片都要將該位置設置爲1.
段偏移量:該分片相對於原始數據報開始處位置的偏移量
TTL(Time to Live生存時間):該字段用於表示IP數據包的生命週期,能夠防止一個數據包在網絡中無限循環地發下去。TTL的意思是一個數據包在被丟棄以前在網絡中的最大週轉時間。該數據包通過的每個路由器都會檢查該字段中的值,當TTL的值爲0時此數據包會被丟棄。TTL對應於一個數據包經過路由器的數目,一個數據包每通過一個路由器,TTL將減去1
協議號:用以指示IP數據包中封裝的是哪一個協議
首部校驗和:檢驗和是16位的錯誤檢測字段。目的主機和網絡中的每一個網關都要從新計算報頭的校驗和,若是首部在傳輸過程當中沒有發生任何差錯, 那麼接收方計算的結果應該爲全1,若是結果不是全1(即檢驗錯誤),那麼IP久丟棄收到的數據報,可是不生成差錯報文,由上層去發現數據並進行重傳
源IP地址:該字段用於表示數據包的源地址,指的是發送該數據包的設備的網絡地址
目標IP地址:該字段用於表示數據包的目標的地址,指的是接收節點的網絡地址
任選項:是數據報中的一個可變長的可選信息,選項字段一直都是以32bit做爲接線,在必要時插入值爲0填充字節,這樣保證IP首部始終是32bit的整數倍
IP路由選擇
大多數主機採用的IP路由選擇機制:
若是目的主機與源主機直接相連(如點對點鏈路)或都在一個共享網絡上(以太網或令牌環網),那IP數據報就直接送到目的主機上,不然主機把數據報發往一默認的路由器上,由路由器來轉發該數據報
路由表中的每一項都包含下面這些信息:
目的IP地址:它既能夠是一個完整的主機地址,也能夠是一個網絡地址,由該表目中的標誌字段來指定
標誌:其中一個標誌指明目的IP地址是網絡地址仍是主機地址,另外一個標誌指明下一站路由器是否爲真正的下一站路由器仍是一個直接相連的接口
爲數據報的傳輸指定一個網絡接口
IP路由選擇是逐跳地進行的,IP並不知道到達任何目的地的完整路徑(除了那些魚主機直接相連的目的),全部的IP路由選擇只爲數據報傳輸提供下一站路由器的IP地址,它假定下一站路由器比發送數據報的主機更接近目的,並且下一站路由器與該主機是直接相連的
IP路由選擇主要完成如下這些功能:
搜索路由表,尋找能與目的IP地址徹底匹配的表目(網絡號和主機號都要匹配) ,若是找到,則把報文發送給該表目指定的下一站路由器或直接鏈接的網絡接口(取決於標誌字段的值)
搜索路由表,尋找能與目的網絡號相匹配的表目。若是找到,則把報文發送給該表目指定的下一站路由器或直接鏈接的網絡接口(取決於標誌字段的值)。目的網絡上的全部主機均可以經過這個表目來處置
搜索路由表 , 尋找標爲「默認(default )」 的表目。若是找到 , 則把報文發送給該表目指定的下一站路由器
若是上面這些步驟都沒有成功,那麼該數據報就不能被傳送。若是不能傳送的數據報來自本機,那麼通常會向生成數據報的應用程序返回一個「主機不可達」或「網絡不可達」的錯誤
爲一個網絡指定一個路由器,而沒必要爲每一個主機指定一個路由器,這是IP路由選擇機制的另外一個基本特性。這樣作能夠極大地縮小路由表的規模,好比Internet上的路由器有隻有幾千個表目,而不會是超過100萬個表目
IP地址的分類
IP地址的網絡部分是由Internet地址分配機構來統一分配的,這樣能夠保證IP的惟一性
ip地址中全爲1的ip即255.255.255.255,它稱爲限制廣播地址,若是將其做爲數據包的目標地址能夠理解爲發送到全部網絡的全部主機
ip地址中全爲0的ip即0.0.0.0,它表示啓動時的ip地址,其含義就是還沒有未分配時的ip地址
127是用來進行本機測試的,除了127.255.255.255外,其它的127開頭的地址都表明本機
如圖所示,紅色爲網絡部分,綠色爲主機部分
子網尋址
如今全部的主機都要求支持子網編址
若是把IP當作單純的一個網絡號和一個主機號組成,A類和B類地址爲主機號分配了太多的空間,可容納的主機數分別爲 2^24-2 和 2^16-2(除了全 0 和全 1),然而一個網絡中人們並不安排這麼多的主機
如今把主機號再分紅一個子網號和一個主機號,如對一個 B 類地址,前 16 位爲網絡號,將後 16 位主機號拆分爲 8 位子網號和 8 爲主機號。子網對外部路由器來講隱藏了內部網絡組織(校園或公司內部)的細節。這樣外部路由器僅須要知道下一跳路由的子網號,而無需知道具體的主機號,能夠大大縮減路由表的規模
子網掩碼
子網掩碼(subnet mask)又叫子網絡遮罩,它是一種用來指明一個IP地址的哪些位標識的是主機所在的子網,以及哪些位標識的是主機位的掩碼。 子網掩碼不能單獨存在,它必須結合IP地址一塊兒使用。 子網掩碼只有一個做用,就是將某個IP地址劃分紅網絡地址和主機地址兩部分
子網掩碼也是32個二進制位
對應IP的網絡部分用1表示
對應IP地址的主機部分用0表示
IP地址和子網掩碼作邏輯與運算獲得網絡地址
0和任何數相與都是0
1和任何數相與都等於任何數自己
兩種不一樣的B類地址子網掩碼的例子,如圖:
A B C 三類地址都有本身默認的子網掩碼
A類 255.0.0.0
B類 255.255.0.0
C類 255.255.255.0
給定IP地址和子網掩碼後,主機就能夠肯定IP數據報的目的是:
本子網上的主機
本網絡中其餘子網中的主機
其餘網絡上的主機
TCP:傳輸控制協議
TCP提供一種面向鏈接的、可靠的字節流服務 TCP提供全雙工服務,即數據可在同一時間雙向傳播
面向鏈接指的是兩個使用TCP的應用(一般是客戶端和服務端)在彼此交換數據以前必須先創建一個TCP鏈接,保證雙向的接收和發送都是正常的
TCP經過下列方式來提供可靠性:
應用數據被分割成TCP認爲最適合發送的數據塊,由TCP傳遞給IP的信息單位成爲報文段或段(Segment)
當TCP發出一個段後,它啓動一個定時器,等待目的端確認收到這個報文段,若是不能及時收到一個確認,將重發這個報文段
當TCP收到發自TCP鏈接另外一端的數據,它將發送一個確認,這個確認不是當即發送,一般將推遲幾分之一秒
TCP將保持它首部和數據的檢驗和。這是一個端到端的檢驗和,目的是檢測數據在傳輸過程當中的任何變化。若是收到段的檢驗和有差錯, TCP將丟棄這個報文段和不確認收到此報文段(但願發端超時並重發)
既然TCP報文段做爲IP數據報來傳輸,而IP數據報的到達可能會失序,所以TCP報文段的到達也可能會失序,若是必要,TCP將對收到的數據進行從新排序,將收到的數據以正確的順序交給應用層
既然IP數據報會發生重複, TCP的接收端必須丟棄重複的數據
TCP還能提供流量控制。TCP鏈接的每一方都有固定大小的緩衝空間,TCP的接收端只容許另外一端發送接收端緩衝區所能接納的數據,這將方式較快主機導致較慢主機的緩衝區溢出
TCP數據包封裝
源端口號和目標端口號
,計算機經過端口號識別訪問哪一個服務,好比http服務或ftp服務,發送方端口號是進行隨機端口,目標端口號決定了接收方哪一個程序來接收
源端口號:發送TCP進程對應的端口號
目標端口號:目標端接收進程的端口號
32位序列號
:0~2^32-1範圍內,32位序列號 TCP用序列號對數據包進行標記,以便在到達目的地後從新重裝,假設當前的序列號爲 s,發送數據長度爲 l,則下次發送數據時的序列號爲 s + l。在創建鏈接時一般由計算機生成一個隨機數做爲序列號的初始值
32位確認號
:0~2^32-1範圍內,對發送端的確認信息,告訴發送端這個序號以前的數據段都收到了。確認應答號,它等於下一次應該接收到的數據的序列號。假設發送端的序列號爲 s,發送數據的長度爲 l,那麼接收端返回的確認應答號也是 s + l。發送端接收到這個確認應答後,能夠認爲這個位置之前全部的數據都已被正常接收
首部長度
:TCP 首部的長度,單位爲 4 字節。若是沒有可選字段,那麼這裏的值就是 5。表示 TCP 首部的長度爲 20 字節
控制位
:TCP的鏈接、傳輸和斷開都受這六個控制位的指揮
PSH(push急迫位) 緩存區將滿,馬上傳輸速度
RST(reset重置位) 鏈接斷了從新鏈接
URG(urgent緊急位) 緊急信號。只在 URG(urgent緊急) 控制位爲 1 時有效。表示緊急數據的末尾在 TCP 數據部分中的位置。一般在暫時中斷通訊時使用(好比輸入 Ctrl + C)
ACK(acknowledgement 確認)爲1表示確認號。確認序列號有效位,代表該數據包包含確認信息
SYN(synchronous創建聯機) 同步序號位 TCP創建鏈接時要將這個值設爲1,爲1時,請求創建鏈接
FIN發送端完成位,提出斷開鏈接的一方把FIN置爲1表示要斷開鏈接,爲1時,數據報送完畢,請求斷開鏈接
窗口值
:說明本地可接收數據段的數目,這個值的大小是可變的。當網絡通暢時將這個窗口值變大加快傳輸速度,當網絡不穩定時減小這個值能夠保證網絡數據的可靠傳輸。它是來在TCP傳輸中進行流量控制的
窗口大小
:用於表示從應答號開始可以接受多少個 8 位字節。若是窗口大小爲 0,能夠發送窗口探測
16位校驗和
:主要用來實現差錯控制的,TCP校驗和的計算包括TCP首部、數據和其它填充字節。在發送TCP數據段時,由發送端計算校驗和,當到達目的地時又進行一次檢驗和計算。若是兩次校驗 和一致說明數據是正確的,不然 將認爲數據被破壞,接收端將丟棄該數據
TCP的三次握手
爲了創建一條TCP鏈接,通過如下過程:
第一次握手主機A經過一個標識爲SYN標識位的數據段發送給主機B請求鏈接,經過該數據段告訴主機B但願創建鏈接,須要B應答,並告訴主機B傳輸的起始序列號
第二次握手是主機B用一個確認應答ACK和同步序列號SYNC標誌位的數據段來響應主機A,一是發送ACK告訴主機A收到了數據段,二是通知主機A從哪一個序列號作標記。
第三次握手是主機A確認收到了主機B的數據段並能夠開始傳輸實際數據。
這三個報文段完成鏈接的創建,這個過程也稱爲三次握手
TCP的四次揮手
創建一個鏈接須要三次握手,而終止一個鏈接要通過 4次握手,這是TCP的半關閉形成的
一個TCP鏈接是全雙工(即數據在兩個方向上能同時傳遞),所以每一個方向必須單獨地進行關閉。這原則就是當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的連接,當一端收到一個FIN,它必須通知應用層另外一端已經終止了那個方向的數據傳送,發送FIN一般是應用層進行關閉的結果
收到一個FIN只意味着在這一方向上沒有數據流動。一個TCP 鏈接在收到一個FIN後仍能發送數據
首先進行關閉的一方(即發送第一個FIN )將執行主動關閉,而另外一方(收到這個FIN) 執行被動關閉。一般一方完成主動關閉而另外一方完成被動關閉
客戶端發送FIN控制位發出斷開鏈接的請求,用來關閉從客戶端到服務器的數據傳送
當服務器收到這個FIN ,它發回一個ACK ,確認序號爲收到的序號加 1 。和SYN 同樣,一個FIN將佔用一個序號
TCP服務器還向應用程序 (即丟棄服務器)傳送一個文件結束符,接着這個服務器程序就關閉它的鏈接
客戶端確認收到服務器的關閉鏈接請求,發回一個確認,並將確認序號設置爲收到序號加1
這樣就終止一個鏈接的典型握手順序,圖中,發送FIN將致使應用程序關閉它們的連接,這些FIN和ACK是由TCP軟件自動產生的
鏈接一般是由客戶端發起的,這樣第一個SYN從客戶端傳到服務器,每一端都能主動關閉這個鏈接(即首先發送FIN),通常是由客戶端決定什麼時候終止鏈接,由於客戶進程一般由用戶交互控制
UDP:用戶數據報協議
UDP是一個無鏈接、不保證可靠性的傳輸層協議,也就是說發送端不關心發送的數據是否到達目標主機、數據是否出錯等,收到數據的主機也不會告訴 發送方是否收到了數據,它的可靠性由上層協議來保障
首部結構簡單,在數據傳輸時能實現最小的開銷,若是進程想發送很短的報文而對可靠性要求不高可使用
UDP首部
端口號表示發送進程和接收進程
UDP長度:指的是UDP首部和UDP數據的字節長度,該字段最小值爲8字節,包含數據的長度,能夠算出數據的結束位置
UDP校驗和:覆蓋UDP首部和UDP數據,UDP的差錯控制(可選)
若是檢驗和的計算結果爲0,則存入的值全爲1(65535),這在二進制反碼計算中是等效的。若是傳送的檢驗和爲0,說明發送端沒有計算檢驗和
若是發送端沒有計算檢驗和而接收端檢測到檢驗和有差錯,那麼UDP數據報就要被悄悄地丟棄,不產生任何差錯報文(當IP層檢測到IP首部檢驗和有差錯時也這樣作)
UDP檢驗和是一個端到端的檢驗和。它由發送端計算,而後由接收端驗證。其目的是爲了發現UDP首部和數據在發送端到接收端之間發生任何改動