TCP/IP四層協議系統
鏈路層,有時也稱作數據鏈路層或網絡接口層,通常包括操作系統中的設備驅動程序和計算機中對應的網絡接口卡。它們一起處理與電纜(或其他任何傳輸媒介)的物理接口細節。
網絡層,有時也稱作互聯網層,處理分組在網絡中的活動,例如分組的選路。在TCP/IP協議族中,網絡層協議包括IP協議(網際協議),ICMP協議(Internet互聯網控制報文協議),以及IGMP協議(Internet組管理協議)。
運輸層主要為兩臺主機上的應用程序提供端到端的通信。在TCP/IP協議族中,有兩個互不相同的傳輸協議:TCP(傳輸控制協議)和UDP(用戶數據報協議)。
- TCP為兩臺主機提供高可靠性的數據通信。它所做的工作包括把應用程序交給它的數據分成合適的小塊交給下面的網絡層,確認接收到的分組,設置發送最后確認分組的超時時鐘等。由于運輸層提供了高可靠性的端到端的通信,因此應用層可以忽略所有這些細節
- UDP則為應用層提供一種非常簡單的服務。它只是把稱作數據報的分組從一臺主機發送到另一臺主機,但并不保證該數據報能到達另一端。任何必需的可靠性必須由應用層來提供
- 應用層負責處理特定的應用程序細節。幾乎各種不同的TCP/IP實現都會提供下面這些通用的應用程序:
- Telnet 遠程登錄。
- FTP 文件傳輸協議。
- SMTP 簡單郵件傳送協議。
- SNMP 簡單網絡管理協議
1519256577761.png
鏈路層
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 )驅動程序
SLIP:串行線路IP
它是一種在串行線路上對IP數據報進行封裝的簡單形式,下面的規則描述了SLIP協議定義的幀格式:
- IP數據報以一個稱作END( 0xc0)的特殊字符結束,同事為了防止數據報到來之前的線路噪聲被當成數據報內容,大多數實現在數據報的開始出也傳一個END字符(如果有線路噪聲,那么END字符將技術這份錯誤的報文,這樣當前的報文得以正確的傳輸,而前一個錯誤報文交給上層后,會發現其內容毫無意義而被丟棄)
- 如果IP報文中某個字符為END,那么就要連續傳輸兩個字節0xdb和oxdc來取代它。oxdb這個特殊字符被稱作SLIP的ESC字符
- 如果IP報文中的某個字符為SLIP的ESC字符,那么就要連續傳輸兩個字節0xdb和oxdd來取代它
SLIP是一種簡單的幀封裝方法,其中有一些缺陷:
- 每一端必須知道對象的IP地址,沒有辦法把本端的IP地址通知給另一端
- 數據幀中沒有類型字段,如果一條串行線路用于SLIP,那么它不能同時使用其他協議
- SLIP沒有再數據幀中加上檢驗和,如果SLIP傳輸的報文被線路噪聲影響而發生錯誤,只能通過上層協議來發現(另一種方法是新型的調制解調器可以檢測并糾正錯誤報文)
盡管存在這些缺點, SLIP仍然是一種廣泛使用的協議
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數據報的過程
1519263350446.png
圖中需要指出的關鍵點是:
- 傳給環回地址(一般是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數據報格式及首部中的各字段,如圖所示:
1519263993880.png
- 最高位在左邊,記為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開頭的地址都代表本機
1519266982953.png
如圖所示,紅色為網絡部分,綠色為主機部分
子網尋址
現在所有的主機都要求支持子網編址
- 如果把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類地址子網掩碼的例子,如圖:
1519267598109.pngA 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數據包封裝
1519289710856.png
源端口號和目標端口號
,計算機通過端口號識別訪問哪個服務,比如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連接,經過以下過程:
1519291083705.png
- 第一次握手主機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) 執行被動關閉。通常一方完成主動關閉而另一方完成被動關閉
1519291815161.png
- 客戶端發送FIN控制位發出斷開連接的請求,用來關閉從客戶端到服務器的數據傳送
- 當服務器收到這個FIN ,它發回一個ACK ,確認序號為收到的序號加 1 。和SYN 一樣,一個FIN將占用一個序號
- TCP服務器還向應用程序 (即丟棄服務器)傳送一個文件結束符,接著這個服務器程序就關閉它的連接
- 客戶端確認收到服務器的關閉連接請求,發回一個確認,并將確認序號設置為收到序號加1
這樣就終止一個連接的典型握手順序,圖中,發送FIN將導致應用程序關閉它們的鏈接,這些FIN和ACK是由TCP軟件自動產生的
連接通常是由客戶端發起的,這樣第一個SYN從客戶端傳到服務器,每一端都能主動關閉這個連接(即首先發送FIN),一般是由客戶端決定何時終止連接,因為客戶進程通常由用戶交互控制
UDP:用戶數據報協議
UDP是一個無連接、不保證可靠性的傳輸層協議,也就是說發送端不關心發送的數據是否到達目標主機、數據是否出錯等,收到數據的主機也不會告訴 發送方是否收到了數據,它的可靠性由上層協議來保障
首部結構簡單,在數據傳輸時能實現最小的開銷,如果進程想發送很短的報文而對可靠性要求不高可以使用
UDP首部
1519300585742.png
端口號表示發送進程和接收進程
UDP長度:指的是UDP首部和UDP數據的字節長度,該字段最小值為8字節,包含數據的長度,可以算出數據的結束位置
UDP校驗和:覆蓋UDP首部和UDP數據,UDP的差錯控制(可選)
- 如果檢驗和的計算結果為0,則存入的值全為1(65535),這在二進制反碼計算中是等效的。如果傳送的檢驗和為0,說明發送端沒有計算檢驗和
- 如果發送端沒有計算檢驗和而接收端檢測到檢驗和有差錯,那么UDP數據報就要被悄悄地丟棄,不產生任何差錯報文(當IP層檢測到IP首部檢驗和有差錯時也這樣做)
- UDP檢驗和是一個端到端的檢驗和。它由發送端計算,然后由接收端驗證。其目的是為了發現UDP首部和數據在發送端到接收端之間發生任何改動