TCP/IP原理淺析

TCP/IP概述

  • TCP/IP起源于1969年美國國防部(DOD:The United States Department Of Defense)高級研究項目管理局(APRA:AdvancedResearch Projects Agency)對有關(guān)分組交換的廣域網(wǎng)(Packet-Switched wide-area network)科研項目,因此起初的網(wǎng)絡稱為ARPANET赏陵。
    1973年TCP(傳輸控制協(xié)議)正式投入使用昭卓,1981年IP(網(wǎng)際協(xié)議)協(xié)議投入使用,1983年TCP/IP協(xié)議正式被集成到美國加州大學伯克利分校的UNIX版本中瘟滨,該“網(wǎng)絡版”操作系統(tǒng)適應了當時各大學候醒、機關(guān)、企業(yè)旺盛的連網(wǎng)需求杂瘸,因而隨著該免費分發(fā)的操作系統(tǒng)的廣泛使用倒淫,TCP/IP協(xié)議得到了流傳。
    TCP/IP技術(shù)得到了眾多廠商的支持败玉,不久就有了很多分散的網(wǎng)絡敌土。所有這些單個的TCP/IP網(wǎng)絡都互聯(lián)起來稱為INTERNET≡艘恚基于TCP/IP協(xié)議的Internet已逐步發(fā)展成為當今世界上規(guī)模最大返干、擁有用戶和資源最多的一個超大型計算機網(wǎng)絡,TCP/IP協(xié)議也因此成為事實上的工業(yè)標準血淌。IP網(wǎng)絡正逐步成為當代乃至未來計算機網(wǎng)絡的主流矩欠。

    TCP/IP概述.png

  • 早在TCP/IP協(xié)議出現(xiàn)之前,國際標準化組織(ISO)就提出了開放系統(tǒng)互連(OSI)網(wǎng)絡模型悠夯,為網(wǎng)絡的設(shè)計癌淮、開發(fā)、編程沦补、維護提供了便利的分而治之的思想乳蓄,其先進性、科學性夕膀、實用性是不言而喻的虚倒。
    TCP/IP協(xié)議不是單純的兩個協(xié)議,是一組不同層次上的多個協(xié)議的組合产舞,常稱為TCP/IP協(xié)議簇或者互聯(lián)網(wǎng)協(xié)議簇魂奥。TCP/IP也是互聯(lián)網(wǎng)的事實上的標準,為實現(xiàn)整個網(wǎng)絡的互聯(lián)提供指導庞瘸。TCP/IP層次組合很難用OSI的七層模型來套用捧弃,它是OSI模型的濃縮,將原來的七層模型合并為四層協(xié)議的體系結(jié)構(gòu),自頂向下分別是應用層违霞、傳輸層嘴办、網(wǎng)絡層和網(wǎng)絡接口層,沒有OSI參考模型的會話層和表示層买鸽,一般認為TCP/IP的會話和表示功能是在傳輸層或應用層上完成的涧郊。

    TCP/IP與OSI模型比較.png

  • TCP/IP不是一個單獨的協(xié)議,而是一個協(xié)議簇眼五,是一組不同層次上的多個協(xié)議的組合妆艘。上面給出了OSI與TCP/IP模型對比、TCP/IP不同層次的協(xié)議看幼。
    網(wǎng)絡接口層:有時也稱作數(shù)據(jù)鏈路層或鏈路層批旺,通常包括操作系統(tǒng)中的設(shè)備驅(qū)動程序和計算機中對應的網(wǎng)絡接口卡。它們一起處理與電纜(或其他任何傳輸媒介)的物理接口細節(jié)诵姜。在TCP/IP協(xié)議簇中汽煮,鏈路層的協(xié)議比較多,它決定了網(wǎng)絡形態(tài)棚唆,但很多都不是專門為TCP/IP設(shè)計的暇赤。常用的鏈路層協(xié)議包括:以太網(wǎng)協(xié)議、PPP協(xié)議宵凌、幀中繼協(xié)議鞋囊、ATM等
    網(wǎng)絡層:IP層有時也稱作互連網(wǎng)層瞎惫,處理分組在網(wǎng)絡中的活動溜腐,在底層通信網(wǎng)絡的基礎(chǔ)上,完成路由微饥、尋徑功能逗扒,提供主機到主機的連接。IP是盡力傳送的欠橘、不可靠的協(xié)議。在TCP/IP協(xié)議簇中现恼,網(wǎng)絡層協(xié)議包括IP協(xié)議(網(wǎng)際協(xié)議)肃续,ICMP協(xié)議(Internet互連網(wǎng)控制報文協(xié)議),ARP/RARP(地址解析/反向地址解析協(xié)議)叉袍,以及IGMP協(xié)議(Internet組管理協(xié)議)始锚。
    傳輸層:主要為兩臺主機上的應用程序提供端到端的通信。在TCP/IP協(xié)議簇中喳逛,有兩個不同的傳輸協(xié)議:TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報協(xié)議)瞧捌,它們分別承載不同的應用。TCP協(xié)議提供可靠的服務,UDP協(xié)議提供不可靠但是高效的服務姐呐。
    應用層:這一層負責具體的應用殿怜,比如HTTP訪問、FTP文件傳輸曙砂、SMTP/POP3郵件處理等等头谜。幾乎各種不同的TCP/IP實現(xiàn)都會提供下面這些通用的應用程序:遠程登錄(Telnet)文件傳輸協(xié)議(FTP)鸠澈、簡單郵件傳輸協(xié)議(SMTP)柱告、簡單網(wǎng)絡管理協(xié)議(SNMP)
    嚴格來講笑陈,分層模型的動機就是將各層的功能盡量獨立际度,每層的功能對另一層來說是透明的,只對通信的另一端負責涵妥,為編程和診斷提供良好的層次隔離乖菱,然而實際情況并非如此,首先軟件編程上完全按照分層模型來做編程效率會降低妹笆,與其分層块请,不如按功能實現(xiàn)來模塊化。其次拳缠,對于許多功能實現(xiàn)來說墩新,必須實現(xiàn)兩層子間的交互,這又違背了當初的出發(fā)點窟坐,比如鏈路層在成幀時需要接收端的物理地址海渊,該地址必須由網(wǎng)絡層處理ARP地址解析才行,簡單地將ARP放在那一層都有些牽強哲鸳。所以說臣疑,分層模型對于理解網(wǎng)絡的抽象性是有益處的,它有助于指導網(wǎng)絡入門徙菠,但并不是網(wǎng)絡的精髓讯沈,只有結(jié)合具體的系統(tǒng)分析才有實際意義。

    TCP/IP協(xié)議棧.png

  • 在發(fā)送端婿奔,數(shù)據(jù)由應用產(chǎn)生缺狠,它被封裝在傳輸層的段中,該段再封裝到網(wǎng)絡層報文包中萍摊,網(wǎng)絡層報文包再封裝到數(shù)據(jù)鏈路幀挤茄,以便在所選的介質(zhì)上傳送。當接收端系統(tǒng)接收到數(shù)據(jù)時冰木,是解封裝過程穷劈。當數(shù)據(jù)沿著協(xié)議棧向上傳遞時笼恰,首先檢查幀的格式,決定網(wǎng)絡類型歇终,去掉幀的格式社证,檢查內(nèi)含的報文包,決定傳輸協(xié)議练湿。數(shù)據(jù)由某個傳輸層處理猴仑,最后數(shù)據(jù)遞交給正確的應用程序。


    數(shù)據(jù)封裝和解封裝過程.png

應用層

  • 在應用層包含了不同類型的應用進程,如:telnet遠程登錄、FTP文件傳輸?shù)取?/p>

    應用層.png

傳輸層

  • 傳輸層主要為兩臺主機上的應用程序提供端到端的通信服務婉弹。在TCP/IP協(xié)議族中涣觉,有兩個不同的傳輸協(xié)議:TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報協(xié)議)。
    TCP為兩臺主機提供高可靠性的數(shù)據(jù)通信。它所做的工作包括把應用程序交給它的數(shù)據(jù)分成合適的小數(shù)據(jù)塊(數(shù)據(jù)段)交給下面的網(wǎng)絡層,確認接收到的分組,設(shè)置發(fā)送最后確認分組的超時時間等朱浴。由于傳輸層提供了高可靠性的端到端的通信服務,因此應用層可以忽略掉所有這些細節(jié)达椰。
    而另一方面翰蠢,UDP則為應用層提供一種非常簡單的服務。它只是把稱作數(shù)據(jù)報的分組從一臺主機發(fā)送到另一臺主機啰劲,但并不保證該數(shù)據(jù)報能到達另一端梁沧。任何必需的可靠性必須由應用層來提供。
    這兩種傳輸層協(xié)議分別在不同的網(wǎng)絡環(huán)境與應用場合中有不同的用途蝇裤。


    傳輸層的功能.png
  • TCP和UDP采用16 bit的端口號來識別不同的應用程序廷支。
    網(wǎng)絡服務一般都是通過知名端口號來識別的。例如栓辜,對于每個TCP/IP實現(xiàn)來說恋拍,F(xiàn)TP服務的TCP端口號都是21,每個Telnet服務的TCP端口號都是23藕甩,每個TFTP(簡單文件傳送協(xié)議)服務的UDP端口號都是69施敢。任何TCP/IP實現(xiàn)所提供的服務都使用知名的1~1023之間的端口號。這些知名端口號由Internet號碼分配機構(gòu)(Internet Assigned Numbers Authority, IANA)來管理∠晾常現(xiàn)在IANA管理1~1023之間所有的端口號悯姊。
    大多數(shù)TCP/IP實現(xiàn)給臨時端口分配1024~5000之間的端口號。大于5000的端口號是為其他服務(Internet上并不常用的服務)預留的贩毕。
    如果仔細檢查這些標準的簡單服務以及其他標準的TCP/IP服務(如Telnet、FTP仆嗦、SMTP等)的端口號時辉阶,我們發(fā)現(xiàn)它們都是奇數(shù)。這是因為這些端口號都是從NCP端口號派生出來的(NCP,即網(wǎng)絡控制協(xié)議谆甜,是ARPANET的傳輸層協(xié)議垃僚,是TCP的前身)。NCP是單工的规辱,不是全雙工的谆棺,因此每個應用程序需要兩個連接,需預留一對奇數(shù)和偶數(shù)端口號罕袋。當TCP和UDP成為標準的傳輸層協(xié)議時改淑,每個應用程序只需要一個端口號,因此就使用了NCP中的奇數(shù)浴讯。


    端口號.png
  • TCP首部的數(shù)據(jù)格式朵夏,如果不計任選字段,它通常是20個字節(jié)榆纽。
    每個TCP段都包含源端和目的端的端口號仰猖,用于尋找發(fā)端和收端應用進程。這兩個值加上IP首部中的源端IP地址和目的端IP地址唯一確定一個TCP連接奈籽。
    序號用來標識從TCP發(fā)端向TCP收端發(fā)送的數(shù)據(jù)字節(jié)流饥侵,它表示在這個報文段中的的第一個數(shù)據(jù)字節(jié)。如果將字節(jié)流看作在兩個應用程序間的單向流動衣屏,則TCP用序號對每個字節(jié)進行計數(shù)躏升。序號是32 bit的無符號數(shù)。
    當建立一個新的連接時勾拉,SYN標志變1煮甥。序號字段包含由這個主機選擇的該連接的初始序號ISN(Initial Sequence Number)。因為SYN標志消耗了一個序號藕赞,該主機要發(fā)送數(shù)據(jù)的第一個字節(jié)序號為這個ISN加1成肘。
    確認序號包含發(fā)送確認的一端所期望收到的下一個序號。確認序號應當是上次已成功收到數(shù)據(jù)字節(jié)序號加1斧蜕。只有ACK標志為1時確認序號字段才有效双霍。
    發(fā)送ACK無需任何額外代價,因為32 bit的確認序號字段和ACK標志一樣批销,總是TCP首部的一部分洒闸。因此,我們看到一旦一個連接建立起來均芽,這個字段總是被設(shè)置丘逸,ACK標志也總是被設(shè)置為1。
    TCP為應用層提供全雙工服務掀宋。這意味數(shù)據(jù)能在兩個方向上獨立地進行傳輸深纲。因此仲锄,連接的每一端必須保持每個方向上的傳輸數(shù)據(jù)序號。
    在TCP首部中有6個code bits 中的多個可同時被設(shè)置為1湃鹊。含義如下:
ACK確認序號有效儒喊。
PSH接收方應該盡快將這個報文段交給應用層。
RST重建連接币呵。
SYN同步序號用來發(fā)起一個連接怀愧。
FIN發(fā)端完成發(fā)送任務。```
TCP的流量控制由連接的每一端通過聲明的窗口大小來提供余赢。窗口大小為字節(jié)數(shù)芯义,窗口大小是一個16 bit字段,因而窗口大小最大為65535字節(jié)没佑。
檢驗和覆蓋了整個的TCP報文段:包括了TCP首部和TCP數(shù)據(jù)毕贼。這是一個強制性的字段,一定是由發(fā)端計算和存儲蛤奢,并由收端進行驗證鬼癣。
只有當URG標志置1時緊急指針才有效。緊急指針是一個正的偏移量啤贩,和序號字段中的值相加表示緊急數(shù)據(jù)最后一個字節(jié)的序號待秃。TCP的緊急方式是發(fā)送端向另一端發(fā)送緊急數(shù)據(jù)的一種方式。
最常見的可選字段是最長報文大小痹屹,又稱為MSS (Maximum Segment Size)章郁。每個連接方通常都在通信的第一個報文段(為建立連接而設(shè)置SYN標志的那個段)中指明這個選項。它指明本端所能接收的最大長度的報文段志衍。
TCP報文段中的數(shù)據(jù)部分是可選的暖庄。在一個連接建立和一個連接終止時,雙方交換的報文段僅有TCP首部楼肪。如果一方?jīng)]有數(shù)據(jù)要發(fā)送培廓,也使用沒有任何數(shù)據(jù)的首部來確認收到的數(shù)據(jù)。在處理超時的許多情況中春叫,也會發(fā)送不帶任何數(shù)據(jù)的報文段肩钠。
![TCP傳輸控制協(xié)議.png](http://upload-images.jianshu.io/upload_images/1398091-8d40117dc3ac2143.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![TCP端口號.png](http://upload-images.jianshu.io/upload_images/1398091-95e5da0a2af2989e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- HOSTA對HOSTZ進行TELNET遠程連接,其中目的端口號為知名端口號23暂殖,源端口號為1028价匠。源端口號沒有特別的要求,只需保證該端口號在本機上是唯一的就可以了呛每。一般從1023以上找出空閑端口號進行分配踩窖。源端端口號又稱作臨時端口號,這是因為源端口號存在時間很短暫晨横。
![多個連接時端口號的使用.png](http://upload-images.jianshu.io/upload_images/1398091-f9663fd434f005d4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 這是同一主機上多個應用進程同時訪問一個服務的示例毙石。HOST A上具有兩個連接同時訪問HOST Z的TELNET服務廉沮,HOST A使用不同的源端口號來區(qū)分本機上的不同的應用程序進程。
IP地址和端口號用來唯一地確定數(shù)據(jù)通訊的連接徐矩。
- 序列號的作用:一方面用于標識數(shù)據(jù)順序,以便接收者在將其遞交給應用程序前按正確的順序進行裝配叁幢;另一方面是消除網(wǎng)絡中的重復報文包滤灯,這種現(xiàn)象在網(wǎng)絡擁塞時會出現(xiàn)。
確認號的作用:接收者告訴發(fā)送者哪個數(shù)據(jù)段已經(jīng)成功接收曼玩,并告訴發(fā)送者接收者希望接收的下一個字節(jié)鳞骤。
![TCP 序號和確認號綜述.png](http://upload-images.jianshu.io/upload_images/1398091-94cefefd03643f0d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
####TCP三次握手/建立連接
- TCP是面向連接的傳輸層協(xié)議,所謂面向連接就是在真正的數(shù)據(jù)傳輸開始前要完成連接建立的過程黍判,否則不會進入真正的數(shù)據(jù)傳輸階段豫尽。
TCP的連接建立過程通常被稱為三次握手(three-way handshake),過程如下:```請求端(通常稱為客戶)發(fā)送一個SYN段指明客戶打算連接的服務器的端口顷帖,以及初始序號(ISN)美旧。這個SYN段為報文段1。
服務器發(fā)回包含服務器的初始序號的SYN報文段(報文段2)作為應答贬墩。同時榴嗅,將確認序號設(shè)置為客戶的ISN加1以對客戶的SYN報文段進行確認。一個SYN將占用一個序號陶舞。
客戶必須將確認序號設(shè)置為服務器的ISN加1以對服務器的SYN報文段進行確認(報文段3)嗽测。
這三個報文段完成連接的建立。```
發(fā)送第一個SYN的一端將執(zhí)行主動打開(active open)肿孵。接收這個SYN并發(fā)回下一個SYN的另一端執(zhí)行被動打開(passive open)
當一端為建立連接而發(fā)送它的SYN時唠粥,它為連接選擇一個初始序號。ISN隨時間而變化停做,因此每個連接都將具有不同的ISN晤愧。RFC 793 [Postel1981c]指出ISN可看作是一個32比特的計數(shù)器,每4 ms加1雅宾。這樣選擇序號的目的在于防止在網(wǎng)絡中被延遲的分組在以后又被傳送养涮,而導致某個連接的一方對它作錯誤的解釋。
如何進行序號選擇? 在4.4 BSD(和多數(shù)的伯克利的實現(xiàn)版)中眉抬,系統(tǒng)初始化時初始的發(fā)送序號被初始化為1贯吓。這個變量每0.5秒增加64000,并每隔9.5小時又回到0蜀变。另外悄谐,每次建立一個連接后,這個變量將增加64000库北。
![TCP三次握手.png](http://upload-images.jianshu.io/upload_images/1398091-1b318a7d33bee73e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

####TCP四次握手/終止連接
- ```一個TCP連接是全雙工(即數(shù)據(jù)在兩個方向上能同時傳遞)爬舰,因此每個方向必須單獨進行關(guān)閉们陆。當一方完成它的數(shù)據(jù)發(fā)送任務后就發(fā)送一個FIN來終止這個方向連接。當一端收到一個FIN情屹,它必須通知應用層另一端已經(jīng)終止了那個方向的數(shù)據(jù)傳送坪仇。所以TCP終止連接的過程需要四個過程,稱之為四次握手過程垃你。```
![TCP四次握手.png](http://upload-images.jianshu.io/upload_images/1398091-2330ab7d7c3a3f8f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 窗口實際上是一種流量控制的機制椅文。
![窗口控制.png](http://upload-images.jianshu.io/upload_images/1398091-4f9e87a00bd3dc4d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)當窗口尺寸是1時,發(fā)送一個數(shù)據(jù)段后必須等待確認才可以發(fā)送下一個數(shù)據(jù)段惜颇,好處是在接收端接收的數(shù)據(jù)段順序不會出錯皆刺,缺點是傳輸速度慢,效率低凌摄。
利用大于1的窗口羡蛾,可以同時發(fā)送幾個數(shù)據(jù)包。當確認返回時锨亏,則發(fā)送新數(shù)據(jù)段痴怨。在這種方式下,可以提高傳輸效率屯伞。一個經(jīng)過仔細調(diào)整的滑動窗口協(xié)議可以保持網(wǎng)絡始終充滿數(shù)據(jù)包腿箩,并且可以得到較高的吞吐量。
其優(yōu)點是傳輸速度快劣摇,效率高珠移;缺點是由于TCP靠IP傳輸數(shù)據(jù),而IP在傳輸過程中可能會選擇不同的路徑而導致在接收端接收的數(shù)據(jù)段順序混亂末融。
####UDP用戶報文協(xié)議
- ```UDP是一個簡單的面向數(shù)據(jù)報的傳輸層協(xié)議钧惧,UDP不提供可靠性,它把應用程序傳給IP層的數(shù)據(jù)發(fā)送出去勾习,但是并不保證它們能到達目的地浓瞪。UDP和TCP在首部中都有覆蓋它們首部和數(shù)據(jù)的檢驗和。UDP的檢驗和是可選的巧婶,而TCP的檢驗和是必需的乾颁。```
![UDP用戶報文協(xié)議.png](http://upload-images.jianshu.io/upload_images/1398091-af2f8e509372d973.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 兩個傳輸層協(xié)議TCP與UDP具有不同的特點,適合在不同的網(wǎng)絡環(huán)境及不同的應用需求中使用艺栈。
![TCP/UDP比較.png](http://upload-images.jianshu.io/upload_images/1398091-5950d86d0e1c907e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
###網(wǎng)絡層
- 網(wǎng)際協(xié)議(IP)在RFC 971中定義英岭,它同時被TCP和UDP使用,處于OSI參考模型的網(wǎng)絡層湿右。IP可以被認為是將數(shù)據(jù)包從一個主機移動到另一個主機的傳遞機制诅妹。因為它處理傳遞,它必須提供尋址功能。IP提供3種主要的功能:

無連接的吭狡,不可靠的傳遞服務
數(shù)據(jù)包分段和重組
路由功能ICMP(Internet互連網(wǎng)控制報文協(xié)議)是IP協(xié)議的附屬協(xié)議尖殃,主要被用來與其他主機或路由器交換錯誤報文和其他重要信息。盡管ICMP主要被IP使用划煮,但應用程序也可以訪問它送丰,例如我們常用的兩個診斷工具ping和traceroute,都使用了ICMP協(xié)議般此。```
ARP(地址解析協(xié)議)和RARP(反向地址解析協(xié)議)是某些網(wǎng)絡接口(如以太網(wǎng)和令牌環(huán)網(wǎng))使用的特殊協(xié)議蚪战,用來轉(zhuǎn)換IP層和網(wǎng)絡接口層使用的地址。

網(wǎng)絡層.png

  • IP數(shù)據(jù)包中包含的主要部分如下:
    版本:目前的協(xié)議版本號是4铐懊,因此IP有時也稱作I P v 4。- iOS現(xiàn)已支持IPV6
    首部長度:首部長度指的是IP包頭中32 bit的數(shù)量瞎疼,包括任何選項科乎。由于它是一個4比特字段,因此首部最長為60個字節(jié)贼急。普通IP數(shù)據(jù)報(沒有任何選擇項)字段的值是5茅茂,即長度20個字節(jié)。
    服務類型(TOS)字段:包括一個3 bit的優(yōu)先權(quán)子字段太抓,4 bit的TOS子字段和1 bit未用位但必須置0的子字段空闲。4 bit的TOS分別代表:最小時延、最大吞吐量走敌、最高可靠性和最小費用碴倾。4 bit中只能置其中1 bit。如果所有4 bit均為0掉丽,那么就意味著是一般服務〉疲現(xiàn)在大多數(shù)的TCP/IP實現(xiàn)都不支持TOS特性,但是自4.3BSD Reno以后的新版系統(tǒng)都對它進行了設(shè)置捶障。另外僧须,新的路由協(xié)議如OSPF和IS-IS都能根據(jù)這些字段的值進行路由決策。
    總長度字段:指整個IP數(shù)據(jù)包的長度项炼,以字節(jié)為單位担平。利用首部長度字段和總長度字段,就可以知道IP數(shù)據(jù)報中數(shù)據(jù)內(nèi)容的起始位置和長度锭部。由于該字段長16比特暂论,所以IP數(shù)據(jù)報最長可達65535字節(jié)。盡管可以傳送一個長達65535字節(jié)的IP數(shù)據(jù)包空免,但是大多數(shù)的鏈路層都會對它進行分片空另。總長度字段是IP首部中必要的內(nèi)容蹋砚,因為一些數(shù)據(jù)鏈路(如以太網(wǎng))需要填充一些數(shù)據(jù)以達到最小長度扼菠。盡管以太網(wǎng)的最小幀長為46字節(jié)摄杂,但是IP數(shù)據(jù)可能會更短。如果沒有總長度字段循榆,那么IP層就不知道46字節(jié)中有多少是IP數(shù)據(jù)包的內(nèi)容析恢。
    標識字段:唯一地標識主機發(fā)送的每一份數(shù)據(jù)包。通常每發(fā)送一份報文它的值就會加1樣秧饮,物理網(wǎng)絡層一般要限制每次發(fā)送數(shù)據(jù)幀的最大長度映挂。IP把MTU與數(shù)據(jù)包長度進行比較,如果需要則進行分片盗尸。分片可以發(fā)生在原始發(fā)送端主機上柑船,也可以發(fā)生在中間路由器上。把一份IP數(shù)據(jù)包分片以后泼各,只有到達目的地才進行重新組裝鞍时。重新組裝由目的端的IP層來完成,其目的是使分片和重新組裝過程對傳輸層(TCP和UDP)是透明的扣蜻,即使只丟失一片數(shù)據(jù)也要重傳整個數(shù)據(jù)包逆巍。
    已經(jīng)分片過的數(shù)據(jù)包有可能會再次進行分片(可能不止一次)。IP首部中包含的數(shù)據(jù)為分片和重新組裝提供了足夠的信息莽使。
    對于發(fā)送端發(fā)送的每份IP數(shù)據(jù)包來說锐极,其標識字段都包含一個唯一值。該值在數(shù)據(jù)包分片時被復制到每個片中芳肌。標志字段用其中一個比特來表示“更多的片”除了最后一片外灵再,其他每片都要把該比特置1。
    片偏移字段指的是該片偏移原始數(shù)據(jù)包開始處的位置庇勃。當數(shù)據(jù)包被分片后檬嘀,每個片的總長度值要改為該片的長度值。標志字段中有一個比特稱作“不分片”位责嚷。如果將這一比特置1鸳兽,IP將不對數(shù)據(jù)報進行分片,在網(wǎng)絡傳輸過程中如果遇到鏈路層的MTU小于數(shù)據(jù)包的長度時將數(shù)據(jù)包丟棄并發(fā)送一個ICMP差錯報文罕拂。
    TTL(time-to-live)生存時間:該字段設(shè)置了數(shù)據(jù)包可以經(jīng)過的最多路由器數(shù)揍异。它指定了數(shù)據(jù)報的生存時間。TTL的初始值由源主機設(shè)置(通常為32或64)爆班,一旦經(jīng)過一個處理它的路由器衷掷,它的值就減去1。當該字段的值為0時柿菩,數(shù)據(jù)報就被丟棄戚嗅,并發(fā)送ICMP報文通知源主機。
    協(xié)議字段:根據(jù)它可以識別是哪個協(xié)議向IP傳送數(shù)據(jù)。
    首部檢驗和字段:根據(jù)IP首部計算的檢驗和碼懦胞。它不對首部后面的數(shù)據(jù)進行計算替久。因為ICMP、IGMP躏尉、UDP和TCP在它們各自的首部中均含有同時覆蓋首部和數(shù)據(jù)效驗和碼蚯根。
    每一份IP數(shù)據(jù)報都包含32 bit的源IP地址和目的IP地址。
    最后一個字段是任選項胀糜,是數(shù)據(jù)包中的一個可變長的可選信息颅拦。這些任選項定義如下:
安全和處理限制(用于軍事領(lǐng)域,詳細內(nèi)容參見RFC 1108[Kent 1991])
記錄路徑(讓每個路由器都記下它的IP地址)
時間戳(讓每個路由器都記下它的IP地址和時間)
寬松的源站選路(為數(shù)據(jù)報指定一系列必須經(jīng)過的IP地址)
嚴格的源站選路(與寬松的源站選路類似教藻,但是要求只能經(jīng)過指定的這些地址距帅,不能經(jīng)過其他的地址)。```
這些選項很少被使用括堤,并非所有的主機和路由器都支持這些選項锥债。`選項字段一直都是以32 bit作為界限,在必要的時候插入值為0的填充字節(jié)痊臭。這樣就保證IP首部始終是32 bit的整數(shù)倍。`
最后是上層的數(shù)據(jù)登夫,比如TCP或UDP的數(shù)據(jù)段广匙。
![IP數(shù)據(jù)包格式.png](http://upload-images.jianshu.io/upload_images/1398091-1888e63ac0573e4f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 由于TCP、UDP恼策、ICMP和IGMP及一些其他的協(xié)議都要利用IP傳送數(shù)據(jù)鸦致,因此IP必須在生成的IP首部中加入某種標識,以表明其承載的數(shù)據(jù)屬于哪一類涣楷。為此分唾,IP在首部中存入一個長度為8 bit的數(shù)值,稱作協(xié)議域狮斗。
其中1表示為ICMP協(xié)議绽乔,2表示為IGMP協(xié)議,6表示為TCP協(xié)議碳褒,17表示為UDP協(xié)議折砸。
![協(xié)議類型字段.png](http://upload-images.jianshu.io/upload_images/1398091-068db5f9f0b5b81f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- ICMP是一種集差錯報告與控制于一身的協(xié)議。在所有TCP/IP主機上都可實現(xiàn)ICMP沙峻。ICMP消息被封裝在IP數(shù)據(jù)報里睦授,ICMP經(jīng)常被認為是IP層的一個組成部分。它傳遞差錯報文以及其他需要注意的信息摔寨。ICMP報文通常被IP層或更高層協(xié)議(TCP或UDP)使用去枷。一些ICMP報文把差錯報文返回給用戶進程。
```常用的“ping”就是使用的ICMP協(xié)議```∩径ィ“ping”這個名字源于聲納定位操作竖螃,目的是為了測試另一臺主機是否可達。該程序發(fā)送一份ICMP回應請求報文給主機翼闹,并等待返回ICMP回應應答斑鼻。一般來說,如果不能Ping到某臺主機猎荠,那么就不能Telnet或者FTP到那臺主機坚弱。反過來,如果不能Telnet到某臺主機关摇,那么通郴囊叮可以用Ping程序來確定問題出在哪里。Ping程序還能測出到這臺主機的往返時間输虱,以表明該主機離我們有“多遠”些楣。
然而隨著Internet安全意識的增強,出現(xiàn)了提供訪問控制列表的路由器和防火墻宪睹,那么像這樣沒有限定的斷言就不再成立了愁茁。一臺主機的可達性可能不只取決于IP層是否可達,還取決于使用何種協(xié)議以及端口號亭病。
![ICMP.png](http://upload-images.jianshu.io/upload_images/1398091-d50dd59583376d35.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 數(shù)據(jù)鏈路層協(xié)議如以太網(wǎng)或令牌環(huán)網(wǎng)都有自己的尋址機制(常常為48 bit地址)鹅很,這是使用數(shù)據(jù)鏈路的任何網(wǎng)絡層都必須遵從的。當一臺主機把以太網(wǎng)數(shù)據(jù)幀發(fā)送到位于同一局域網(wǎng)上的另一臺主機時罪帖,是根據(jù)48 bit的以太網(wǎng)地址來確定目的接口的促煮。設(shè)備驅(qū)動程序從不檢查IP數(shù)據(jù)報中的目的IP地址。
ARP協(xié)議需要為IP地址和MAC地址這兩種不同的地址形式提供對應關(guān)系整袁。
`ARP過程如下`:ARP發(fā)送一份稱作ARP請求的以太網(wǎng)數(shù)據(jù)幀給以太網(wǎng)上的每個主機菠齿。這個過程稱作廣播,ARP請求數(shù)據(jù)幀中包含目的主機的IP地址坐昙,其意思是“如果你是這個IP地址的擁有者绳匀,請回答你的硬件地址。
連接到同一LAN的所有主機都接收并處理ARP廣播民珍,目的主機的ARP層收到這份廣播報文后襟士,根據(jù)目的IP地址判斷出這是發(fā)送端在尋問它的MAC地址。于是發(fā)送一個單播ARP應答嚷量。這個ARP應答包含IP地址及對應的硬件地址陋桂。收到ARP應答后,發(fā)送端就知道接收端的MAC地址了蝶溶。
ARP高效運行的關(guān)鍵是由于每個主機上都有一個ARP高速緩存嗜历。這個高速緩存存放了最近IP地址到硬件地址之間的映射記錄宣渗。當主機查找某個IP地址與MAC地址的對應關(guān)系時首先在本機的ARP緩存表中查找,只有在找不到時才進行ARP廣播梨州。
![ARP工作機制.png](http://upload-images.jianshu.io/upload_images/1398091-e19d6dac01243bc6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 具有本地磁盤的系統(tǒng)引導時痕囱,一般是從磁盤上的配置文件中讀取IP地址。但是無盤工作站或被配置為動態(tài)獲取IP地址的主機則需要采用其他方法來獲得IP地址暴匠。
RARP實現(xiàn)過程是主機從接口卡上讀取唯一的硬件地址鞍恢,然后發(fā)送一份RARP請求(一幀在網(wǎng)絡上廣播的數(shù)據(jù)),請求某個主機(如DHCP服務器或BOOTP服務器)響應該主機系統(tǒng)的IP地址每窖。
DHCP服務器或BOOTP服務器接收到了RARP的請求帮掉,為其分配IP地址等配置信息,并通過RARP回應發(fā)送給源主機窒典。
![RARP工作機制.png](http://upload-images.jianshu.io/upload_images/1398091-6d96a1f00ebcd626.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

資料:
[HTTP協(xié)議](http://www.360doc.com/content/10/0930/17/3668821_57590979.shtml)
[深入理解HTTP](http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html)


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蟆炊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瀑志,更是在濱河造成了極大的恐慌涩搓,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劈猪,死亡現(xiàn)場離奇詭異昧甘,居然都是意外死亡,警方通過查閱死者的電腦和手機战得,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門疾层,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贡避,你說我怎么就攤上這事∮杌。” “怎么了刮吧?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長掖蛤。 經(jīng)常有香客問我杀捻,道長,這世上最難降的妖魔是什么蚓庭? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任致讥,我火速辦了婚禮,結(jié)果婚禮上器赞,老公的妹妹穿的比我還像新娘垢袱。我一直安慰自己,他們只是感情好港柜,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布请契。 她就那樣靜靜地躺著咳榜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪爽锥。 梳的紋絲不亂的頭發(fā)上涌韩,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音氯夷,去河邊找鬼臣樱。 笑死,一個胖子當著我的面吹牛腮考,可吹牛的內(nèi)容都是我干的雇毫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼秸仙,長吁一口氣:“原來是場噩夢啊……” “哼嘴拢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起寂纪,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤席吴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后捞蛋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孝冒,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年拟杉,在試婚紗的時候發(fā)現(xiàn)自己被綠了庄涡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡搬设,死狀恐怖穴店,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拿穴,我是刑警寧澤泣洞,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站默色,受9級特大地震影響球凰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜腿宰,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一呕诉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吃度,春花似錦甩挫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夜畴。三九已至,卻和暖如春删壮,著一層夾襖步出監(jiān)牢的瞬間贪绘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工央碟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留税灌,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓亿虽,卻偏偏與公主長得像菱涤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子洛勉,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 個人認為粘秆,Goodboy1881先生的TCP /IP 協(xié)議詳解學習博客系列博客是一部非常精彩的學習筆記,這雖然只是...
    貳零壹柒_fc10閱讀 5,051評論 0 8
  • 1.這篇文章不是本人原創(chuàng)的收毫,只是個人為了對這部分知識做一個整理和系統(tǒng)的輸出而編輯成的攻走,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,037評論 6 174
  • 18.1 引言 TCP是一個面向連接的協(xié)議。無論哪一方向另一方發(fā)送數(shù)據(jù)之前此再,都必須先在雙方之間建立一條連接昔搂。本章將...
    張芳濤閱讀 3,344評論 0 13
  • 協(xié)議基礎(chǔ) 協(xié)議就是計算機之間通過網(wǎng)絡實現(xiàn)通信時實現(xiàn)所達成的一種“約定”,這種約定使得那些由不同廠商的設(shè)備输拇,不同的C...
    d9fc24a0c9a9閱讀 2,351評論 0 6
  • 計算機網(wǎng)絡就是用 物理鏈路 將各個孤立的工作站或主機連接在一起策吠,組成 數(shù)據(jù)鏈路逛裤,從而達到資源共享和通信的目的。 網(wǎng)...
    打不死的小強qz閱讀 2,909評論 0 6