TCP/IP概述
-
TCP/IP起源于1969年美國(guó)國(guó)防部(DOD:The United States Department Of Defense)高級(jí)研究項(xiàng)目管理局(APRA:AdvancedResearch Projects Agency)對(duì)有關(guān)分組交換的廣域網(wǎng)(Packet-Switched wide-area network)科研項(xiàng)目,因此起初的網(wǎng)絡(luò)稱為ARPANET。
1973年TCP(傳輸控制協(xié)議)正式投入使用,1981年IP(網(wǎng)際協(xié)議)協(xié)議投入使用,1983年TCP/IP協(xié)議正式被集成到美國(guó)加州大學(xué)伯克利分校的UNIX版本中,該“網(wǎng)絡(luò)版”操作系統(tǒng)適應(yīng)了當(dāng)時(shí)各大學(xué)、機(jī)關(guān)、企業(yè)旺盛的連網(wǎng)需求,因而隨著該免費(fèi)分發(fā)的操作系統(tǒng)的廣泛使用,TCP/IP協(xié)議得到了流傳。
TCP/IP技術(shù)得到了眾多廠商的支持,不久就有了很多分散的網(wǎng)絡(luò)。所有這些單個(gè)的TCP/IP網(wǎng)絡(luò)都互聯(lián)起來稱為INTERNET?;赥CP/IP協(xié)議的Internet已逐步發(fā)展成為當(dāng)今世界上規(guī)模最大、擁有用戶和資源最多的一個(gè)超大型計(jì)算機(jī)網(wǎng)絡(luò),TCP/IP協(xié)議也因此成為事實(shí)上的工業(yè)標(biāo)準(zhǔn)。IP網(wǎng)絡(luò)正逐步成為當(dāng)代乃至未來計(jì)算機(jī)網(wǎng)絡(luò)的主流。
TCP/IP概述.png -
早在TCP/IP協(xié)議出現(xiàn)之前,國(guó)際標(biāo)準(zhǔn)化組織(ISO)就提出了
開放系統(tǒng)互連(OSI)網(wǎng)絡(luò)模型,為網(wǎng)絡(luò)的設(shè)計(jì)、開發(fā)、編程、維護(hù)提供了便利的分而治之的思想,其先進(jìn)性、科學(xué)性、實(shí)用性是不言而喻的。
TCP/IP協(xié)議不是單純的兩個(gè)協(xié)議,是一組不同層次上的多個(gè)協(xié)議的組合,常稱為TCP/IP協(xié)議簇或者互聯(lián)網(wǎng)協(xié)議簇。TCP/IP也是互聯(lián)網(wǎng)的事實(shí)上的標(biāo)準(zhǔn),為實(shí)現(xiàn)整個(gè)網(wǎng)絡(luò)的互聯(lián)提供指導(dǎo)。TCP/IP層次組合很難用OSI的七層模型來套用,它是OSI模型的濃縮,將原來的七層模型合并為四層協(xié)議的體系結(jié)構(gòu),自頂向下分別是應(yīng)用層、傳輸層、網(wǎng)絡(luò)層和網(wǎng)絡(luò)接口層,沒有OSI參考模型的會(huì)話層和表示層,一般認(rèn)為TCP/IP的會(huì)話和表示功能是在傳輸層或應(yīng)用層上完成的。
TCP/IP與OSI模型比較.png -
TCP/IP不是一個(gè)單獨(dú)的協(xié)議,而是一個(gè)協(xié)議簇,是一組不同層次上的多個(gè)協(xié)議的組合。上面給出了OSI與TCP/IP模型對(duì)比、TCP/IP不同層次的協(xié)議。
網(wǎng)絡(luò)接口層:有時(shí)也稱作數(shù)據(jù)鏈路層或鏈路層,通常包括操作系統(tǒng)中的設(shè)備驅(qū)動(dòng)程序和計(jì)算機(jī)中對(duì)應(yīng)的網(wǎng)絡(luò)接口卡。它們一起處理與電纜(或其他任何傳輸媒介)的物理接口細(xì)節(jié)。在TCP/IP協(xié)議簇中,鏈路層的協(xié)議比較多,它決定了網(wǎng)絡(luò)形態(tài),但很多都不是專門為TCP/IP設(shè)計(jì)的。常用的鏈路層協(xié)議包括:以太網(wǎng)協(xié)議、PPP協(xié)議、幀中繼協(xié)議、ATM等。
網(wǎng)絡(luò)層:IP層有時(shí)也稱作互連網(wǎng)層,處理分組在網(wǎng)絡(luò)中的活動(dòng),在底層通信網(wǎng)絡(luò)的基礎(chǔ)上,完成路由、尋徑功能,提供主機(jī)到主機(jī)的連接。IP是盡力傳送的、不可靠的協(xié)議。在TCP/IP協(xié)議簇中,網(wǎng)絡(luò)層協(xié)議包括IP協(xié)議(網(wǎng)際協(xié)議),ICMP協(xié)議(Internet互連網(wǎng)控制報(bào)文協(xié)議),ARP/RARP(地址解析/反向地址解析協(xié)議),以及IGMP協(xié)議(Internet組管理協(xié)議)。
傳輸層:主要為兩臺(tái)主機(jī)上的應(yīng)用程序提供端到端的通信。在TCP/IP協(xié)議簇中,有兩個(gè)不同的傳輸協(xié)議:TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報(bào)協(xié)議),它們分別承載不同的應(yīng)用。TCP協(xié)議提供可靠的服務(wù),UDP協(xié)議提供不可靠但是高效的服務(wù)。
應(yīng)用層:這一層負(fù)責(zé)具體的應(yīng)用,比如HTTP訪問、FTP文件傳輸、SMTP/POP3郵件處理等等。幾乎各種不同的TCP/IP實(shí)現(xiàn)都會(huì)提供下面這些通用的應(yīng)用程序:遠(yuǎn)程登錄(Telnet)、文件傳輸協(xié)議(FTP)、簡(jiǎn)單郵件傳輸協(xié)議(SMTP)、簡(jiǎn)單網(wǎng)絡(luò)管理協(xié)議(SNMP)。
嚴(yán)格來講,分層模型的動(dòng)機(jī)就是將各層的功能盡量獨(dú)立,每層的功能對(duì)另一層來說是透明的,只對(duì)通信的另一端負(fù)責(zé),為編程和診斷提供良好的層次隔離,然而實(shí)際情況并非如此,首先軟件編程上完全按照分層模型來做編程效率會(huì)降低,與其分層,不如按功能實(shí)現(xiàn)來模塊化。其次,對(duì)于許多功能實(shí)現(xiàn)來說,必須實(shí)現(xiàn)兩層子間的交互,這又違背了當(dāng)初的出發(fā)點(diǎn),比如鏈路層在成幀時(shí)需要接收端的物理地址,該地址必須由網(wǎng)絡(luò)層處理ARP地址解析才行,簡(jiǎn)單地將ARP放在那一層都有些牽強(qiáng)。所以說,分層模型對(duì)于理解網(wǎng)絡(luò)的抽象性是有益處的,它有助于指導(dǎo)網(wǎng)絡(luò)入門,但并不是網(wǎng)絡(luò)的精髓,只有結(jié)合具體的系統(tǒng)分析才有實(shí)際意義。
TCP/IP協(xié)議棧.png -
在發(fā)送端,數(shù)據(jù)由應(yīng)用產(chǎn)生,它被封裝在傳輸層的段中,該段再封裝到網(wǎng)絡(luò)層報(bào)文包中,網(wǎng)絡(luò)層報(bào)文包再封裝到數(shù)據(jù)鏈路幀,以便在所選的介質(zhì)上傳送。當(dāng)接收端系統(tǒng)接收到數(shù)據(jù)時(shí),是解封裝過程。當(dāng)數(shù)據(jù)沿著協(xié)議棧向上傳遞時(shí),首先檢查幀的格式,決定網(wǎng)絡(luò)類型,去掉幀的格式,檢查內(nèi)含的報(bào)文包,決定傳輸協(xié)議。數(shù)據(jù)由某個(gè)傳輸層處理,最后數(shù)據(jù)遞交給正確的應(yīng)用程序。
數(shù)據(jù)封裝和解封裝過程.png
應(yīng)用層
-
在應(yīng)用層包含了不同類型的應(yīng)用進(jìn)程,如:telnet遠(yuǎn)程登錄、FTP文件傳輸?shù)取?/p>
應(yīng)用層.png
傳輸層
-
傳輸層主要為兩臺(tái)主機(jī)上的應(yīng)用程序提供端到端的通信服務(wù)。在TCP/IP協(xié)議族中,有兩個(gè)不同的傳輸協(xié)議:TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報(bào)協(xié)議)。
TCP為兩臺(tái)主機(jī)提供高可靠性的數(shù)據(jù)通信。它所做的工作包括把應(yīng)用程序交給它的數(shù)據(jù)分成合適的小數(shù)據(jù)塊(數(shù)據(jù)段)交給下面的網(wǎng)絡(luò)層,確認(rèn)接收到的分組,設(shè)置發(fā)送最后確認(rèn)分組的超時(shí)時(shí)間等。由于傳輸層提供了高可靠性的端到端的通信服務(wù),因此應(yīng)用層可以忽略掉所有這些細(xì)節(jié)。
而另一方面,UDP則為應(yīng)用層提供一種非常簡(jiǎn)單的服務(wù)。它只是把稱作數(shù)據(jù)報(bào)的分組從一臺(tái)主機(jī)發(fā)送到另一臺(tái)主機(jī),但并不保證該數(shù)據(jù)報(bào)能到達(dá)另一端。任何必需的可靠性必須由應(yīng)用層來提供。
這兩種傳輸層協(xié)議分別在不同的網(wǎng)絡(luò)環(huán)境與應(yīng)用場(chǎng)合中有不同的用途。
傳輸層的功能.png -
TCP和UDP采用16 bit的端口號(hào)來識(shí)別不同的應(yīng)用程序。
網(wǎng)絡(luò)服務(wù)一般都是通過知名端口號(hào)來識(shí)別的。例如,對(duì)于每個(gè)TCP/IP實(shí)現(xiàn)來說,F(xiàn)TP服務(wù)的TCP端口號(hào)都是21,每個(gè)Telnet服務(wù)的TCP端口號(hào)都是23,每個(gè)TFTP(簡(jiǎn)單文件傳送協(xié)議)服務(wù)的UDP端口號(hào)都是69。任何TCP/IP實(shí)現(xiàn)所提供的服務(wù)都使用知名的1~1023之間的端口號(hào)。這些知名端口號(hào)由Internet號(hào)碼分配機(jī)構(gòu)(Internet Assigned Numbers Authority, IANA)來管理?,F(xiàn)在IANA管理1~1023之間所有的端口號(hào)。
大多數(shù)TCP/IP實(shí)現(xiàn)給臨時(shí)端口分配1024~5000之間的端口號(hào)。大于5000的端口號(hào)是為其他服務(wù)(Internet上并不常用的服務(wù))預(yù)留的。
如果仔細(xì)檢查這些標(biāo)準(zhǔn)的簡(jiǎn)單服務(wù)以及其他標(biāo)準(zhǔn)的TCP/IP服務(wù)(如Telnet、FTP、SMTP等)的端口號(hào)時(shí),我們發(fā)現(xiàn)它們都是奇數(shù)。這是因?yàn)檫@些端口號(hào)都是從NCP端口號(hào)派生出來的(NCP,即網(wǎng)絡(luò)控制協(xié)議,是ARPANET的傳輸層協(xié)議,是TCP的前身)。NCP是單工的,不是全雙工的,因此每個(gè)應(yīng)用程序需要兩個(gè)連接,需預(yù)留一對(duì)奇數(shù)和偶數(shù)端口號(hào)。當(dāng)TCP和UDP成為標(biāo)準(zhǔn)的傳輸層協(xié)議時(shí),每個(gè)應(yīng)用程序只需要一個(gè)端口號(hào),因此就使用了NCP中的奇數(shù)。
端口號(hào).png - TCP首部的數(shù)據(jù)格式,如果不計(jì)任選字段,它通常是20個(gè)字節(jié)。
每個(gè)TCP段都包含源端和目的端的端口號(hào),用于尋找發(fā)端和收端應(yīng)用進(jìn)程。這兩個(gè)值加上IP首部中的源端IP地址和目的端IP地址唯一確定一個(gè)TCP連接。
序號(hào)用來標(biāo)識(shí)從TCP發(fā)端向TCP收端發(fā)送的數(shù)據(jù)字節(jié)流,它表示在這個(gè)報(bào)文段中的的第一個(gè)數(shù)據(jù)字節(jié)。如果將字節(jié)流看作在兩個(gè)應(yīng)用程序間的單向流動(dòng),則TCP用序號(hào)對(duì)每個(gè)字節(jié)進(jìn)行計(jì)數(shù)。序號(hào)是32 bit的無符號(hào)數(shù)。
當(dāng)建立一個(gè)新的連接時(shí),SYN標(biāo)志變1。序號(hào)字段包含由這個(gè)主機(jī)選擇的該連接的初始序號(hào)ISN(Initial Sequence Number)。因?yàn)镾YN標(biāo)志消耗了一個(gè)序號(hào),該主機(jī)要發(fā)送數(shù)據(jù)的第一個(gè)字節(jié)序號(hào)為這個(gè)ISN加1。
確認(rèn)序號(hào)包含發(fā)送確認(rèn)的一端所期望收到的下一個(gè)序號(hào)。確認(rèn)序號(hào)應(yīng)當(dāng)是上次已成功收到數(shù)據(jù)字節(jié)序號(hào)加1。只有ACK標(biāo)志為1時(shí)確認(rèn)序號(hào)字段才有效。
發(fā)送ACK無需任何額外代價(jià),因?yàn)?2 bit的確認(rèn)序號(hào)字段和ACK標(biāo)志一樣,總是TCP首部的一部分。因此,我們看到一旦一個(gè)連接建立起來,這個(gè)字段總是被設(shè)置,ACK標(biāo)志也總是被設(shè)置為1。
TCP為應(yīng)用層提供全雙工服務(wù)。這意味數(shù)據(jù)能在兩個(gè)方向上獨(dú)立地進(jìn)行傳輸。因此,連接的每一端必須保持每個(gè)方向上的傳輸數(shù)據(jù)序號(hào)。
在TCP首部中有6個(gè)code bits 中的多個(gè)可同時(shí)被設(shè)置為1。含義如下:
ACK確認(rèn)序號(hào)有效。
PSH接收方應(yīng)該盡快將這個(gè)報(bào)文段交給應(yīng)用層。
RST重建連接。
SYN同步序號(hào)用來發(fā)起一個(gè)連接。
FIN發(fā)端完成發(fā)送任務(wù)。```
TCP的流量控制由連接的每一端通過聲明的窗口大小來提供。窗口大小為字節(jié)數(shù),窗口大小是一個(gè)16 bit字段,因而窗口大小最大為65535字節(jié)。
檢驗(yàn)和覆蓋了整個(gè)的TCP報(bào)文段:包括了TCP首部和TCP數(shù)據(jù)。這是一個(gè)強(qiáng)制性的字段,一定是由發(fā)端計(jì)算和存儲(chǔ),并由收端進(jìn)行驗(yàn)證。
只有當(dāng)URG標(biāo)志置1時(shí)緊急指針才有效。緊急指針是一個(gè)正的偏移量,和序號(hào)字段中的值相加表示緊急數(shù)據(jù)最后一個(gè)字節(jié)的序號(hào)。TCP的緊急方式是發(fā)送端向另一端發(fā)送緊急數(shù)據(jù)的一種方式。
最常見的可選字段是最長(zhǎng)報(bào)文大小,又稱為MSS (Maximum Segment Size)。每個(gè)連接方通常都在通信的第一個(gè)報(bào)文段(為建立連接而設(shè)置SYN標(biāo)志的那個(gè)段)中指明這個(gè)選項(xiàng)。它指明本端所能接收的最大長(zhǎng)度的報(bào)文段。
TCP報(bào)文段中的數(shù)據(jù)部分是可選的。在一個(gè)連接建立和一個(gè)連接終止時(shí),雙方交換的報(bào)文段僅有TCP首部。如果一方?jīng)]有數(shù)據(jù)要發(fā)送,也使用沒有任何數(shù)據(jù)的首部來確認(rèn)收到的數(shù)據(jù)。在處理超時(shí)的許多情況中,也會(huì)發(fā)送不帶任何數(shù)據(jù)的報(bào)文段。


- HOSTA對(duì)HOSTZ進(jìn)行TELNET遠(yuǎn)程連接,其中目的端口號(hào)為知名端口號(hào)23,源端口號(hào)為1028。源端口號(hào)沒有特別的要求,只需保證該端口號(hào)在本機(jī)上是唯一的就可以了。一般從1023以上找出空閑端口號(hào)進(jìn)行分配。源端端口號(hào)又稱作臨時(shí)端口號(hào),這是因?yàn)樵炊丝谔?hào)存在時(shí)間很短暫。

- 這是同一主機(jī)上多個(gè)應(yīng)用進(jìn)程同時(shí)訪問一個(gè)服務(wù)的示例。HOST A上具有兩個(gè)連接同時(shí)訪問HOST Z的TELNET服務(wù),HOST A使用不同的源端口號(hào)來區(qū)分本機(jī)上的不同的應(yīng)用程序進(jìn)程。
IP地址和端口號(hào)用來唯一地確定數(shù)據(jù)通訊的連接。
- 序列號(hào)的作用:一方面用于標(biāo)識(shí)數(shù)據(jù)順序,以便接收者在將其遞交給應(yīng)用程序前按正確的順序進(jìn)行裝配;另一方面是消除網(wǎng)絡(luò)中的重復(fù)報(bào)文包,這種現(xiàn)象在網(wǎng)絡(luò)擁塞時(shí)會(huì)出現(xiàn)。
確認(rèn)號(hào)的作用:接收者告訴發(fā)送者哪個(gè)數(shù)據(jù)段已經(jīng)成功接收,并告訴發(fā)送者接收者希望接收的下一個(gè)字節(jié)。

####TCP三次握手/建立連接
- TCP是面向連接的傳輸層協(xié)議,所謂面向連接就是在真正的數(shù)據(jù)傳輸開始前要完成連接建立的過程,否則不會(huì)進(jìn)入真正的數(shù)據(jù)傳輸階段。
TCP的連接建立過程通常被稱為三次握手(three-way handshake),過程如下:```請(qǐng)求端(通常稱為客戶)發(fā)送一個(gè)SYN段指明客戶打算連接的服務(wù)器的端口,以及初始序號(hào)(ISN)。這個(gè)SYN段為報(bào)文段1。
服務(wù)器發(fā)回包含服務(wù)器的初始序號(hào)的SYN報(bào)文段(報(bào)文段2)作為應(yīng)答。同時(shí),將確認(rèn)序號(hào)設(shè)置為客戶的ISN加1以對(duì)客戶的SYN報(bào)文段進(jìn)行確認(rèn)。一個(gè)SYN將占用一個(gè)序號(hào)。
客戶必須將確認(rèn)序號(hào)設(shè)置為服務(wù)器的ISN加1以對(duì)服務(wù)器的SYN報(bào)文段進(jìn)行確認(rèn)(報(bào)文段3)。
這三個(gè)報(bào)文段完成連接的建立。```
發(fā)送第一個(gè)SYN的一端將執(zhí)行主動(dòng)打開(active open)。接收這個(gè)SYN并發(fā)回下一個(gè)SYN的另一端執(zhí)行被動(dòng)打開(passive open)
當(dāng)一端為建立連接而發(fā)送它的SYN時(shí),它為連接選擇一個(gè)初始序號(hào)。ISN隨時(shí)間而變化,因此每個(gè)連接都將具有不同的ISN。RFC 793 [Postel1981c]指出ISN可看作是一個(gè)32比特的計(jì)數(shù)器,每4 ms加1。這樣選擇序號(hào)的目的在于防止在網(wǎng)絡(luò)中被延遲的分組在以后又被傳送,而導(dǎo)致某個(gè)連接的一方對(duì)它作錯(cuò)誤的解釋。
如何進(jìn)行序號(hào)選擇? 在4.4 BSD(和多數(shù)的伯克利的實(shí)現(xiàn)版)中,系統(tǒng)初始化時(shí)初始的發(fā)送序號(hào)被初始化為1。這個(gè)變量每0.5秒增加64000,并每隔9.5小時(shí)又回到0。另外,每次建立一個(gè)連接后,這個(gè)變量將增加64000。

####TCP四次握手/終止連接
- ```一個(gè)TCP連接是全雙工(即數(shù)據(jù)在兩個(gè)方向上能同時(shí)傳遞),因此每個(gè)方向必須單獨(dú)進(jìn)行關(guān)閉。當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就發(fā)送一個(gè)FIN來終止這個(gè)方向連接。當(dāng)一端收到一個(gè)FIN,它必須通知應(yīng)用層另一端已經(jīng)終止了那個(gè)方向的數(shù)據(jù)傳送。所以TCP終止連接的過程需要四個(gè)過程,稱之為四次握手過程。```

- 窗口實(shí)際上是一種流量控制的機(jī)制。
當(dāng)窗口尺寸是1時(shí),發(fā)送一個(gè)數(shù)據(jù)段后必須等待確認(rèn)才可以發(fā)送下一個(gè)數(shù)據(jù)段,好處是在接收端接收的數(shù)據(jù)段順序不會(huì)出錯(cuò),缺點(diǎn)是傳輸速度慢,效率低。
利用大于1的窗口,可以同時(shí)發(fā)送幾個(gè)數(shù)據(jù)包。當(dāng)確認(rèn)返回時(shí),則發(fā)送新數(shù)據(jù)段。在這種方式下,可以提高傳輸效率。一個(gè)經(jīng)過仔細(xì)調(diào)整的滑動(dòng)窗口協(xié)議可以保持網(wǎng)絡(luò)始終充滿數(shù)據(jù)包,并且可以得到較高的吞吐量。
其優(yōu)點(diǎn)是傳輸速度快,效率高;缺點(diǎn)是由于TCP靠IP傳輸數(shù)據(jù),而IP在傳輸過程中可能會(huì)選擇不同的路徑而導(dǎo)致在接收端接收的數(shù)據(jù)段順序混亂。
####UDP用戶報(bào)文協(xié)議
- ```UDP是一個(gè)簡(jiǎn)單的面向數(shù)據(jù)報(bào)的傳輸層協(xié)議,UDP不提供可靠性,它把應(yīng)用程序傳給IP層的數(shù)據(jù)發(fā)送出去,但是并不保證它們能到達(dá)目的地。UDP和TCP在首部中都有覆蓋它們首部和數(shù)據(jù)的檢驗(yàn)和。UDP的檢驗(yàn)和是可選的,而TCP的檢驗(yàn)和是必需的。```

- 兩個(gè)傳輸層協(xié)議TCP與UDP具有不同的特點(diǎn),適合在不同的網(wǎng)絡(luò)環(huán)境及不同的應(yīng)用需求中使用。

###網(wǎng)絡(luò)層
- 網(wǎng)際協(xié)議(IP)在RFC 971中定義,它同時(shí)被TCP和UDP使用,處于OSI參考模型的網(wǎng)絡(luò)層。IP可以被認(rèn)為是將數(shù)據(jù)包從一個(gè)主機(jī)移動(dòng)到另一個(gè)主機(jī)的傳遞機(jī)制。因?yàn)樗幚韨鬟f,它必須提供尋址功能。IP提供3種主要的功能:
無連接的,不可靠的傳遞服務(wù)
數(shù)據(jù)包分段和重組
路由功能ICMP(Internet互連網(wǎng)控制報(bào)文協(xié)議)是IP協(xié)議的附屬協(xié)議,主要被用來與其他主機(jī)或路由器交換錯(cuò)誤報(bào)文和其他重要信息。盡管ICMP主要被IP使用,但應(yīng)用程序也可以訪問它,例如我們常用的兩個(gè)診斷工具ping和traceroute,都使用了ICMP協(xié)議。```
ARP(地址解析協(xié)議)和RARP(反向地址解析協(xié)議)是某些網(wǎng)絡(luò)接口(如以太網(wǎng)和令牌環(huán)網(wǎng))使用的特殊協(xié)議,用來轉(zhuǎn)換IP層和網(wǎng)絡(luò)接口層使用的地址。

- IP數(shù)據(jù)包中包含的主要部分如下:
版本:目前的協(xié)議版本號(hào)是4,因此IP有時(shí)也稱作I P v 4。- iOS現(xiàn)已支持IPV6
首部長(zhǎng)度:首部長(zhǎng)度指的是IP包頭中32 bit的數(shù)量,包括任何選項(xiàng)。由于它是一個(gè)4比特字段,因此首部最長(zhǎng)為60個(gè)字節(jié)。普通IP數(shù)據(jù)報(bào)(沒有任何選擇項(xiàng))字段的值是5,即長(zhǎng)度20個(gè)字節(jié)。
服務(wù)類型(TOS)字段:包括一個(gè)3 bit的優(yōu)先權(quán)子字段,4 bit的TOS子字段和1 bit未用位但必須置0的子字段。4 bit的TOS分別代表:最小時(shí)延、最大吞吐量、最高可靠性和最小費(fèi)用。4 bit中只能置其中1 bit。如果所有4 bit均為0,那么就意味著是一般服務(wù)?,F(xiàn)在大多數(shù)的TCP/IP實(shí)現(xiàn)都不支持TOS特性,但是自4.3BSD Reno以后的新版系統(tǒng)都對(duì)它進(jìn)行了設(shè)置。另外,新的路由協(xié)議如OSPF和IS-IS都能根據(jù)這些字段的值進(jìn)行路由決策。
總長(zhǎng)度字段:指整個(gè)IP數(shù)據(jù)包的長(zhǎng)度,以字節(jié)為單位。利用首部長(zhǎng)度字段和總長(zhǎng)度字段,就可以知道IP數(shù)據(jù)報(bào)中數(shù)據(jù)內(nèi)容的起始位置和長(zhǎng)度。由于該字段長(zhǎng)16比特,所以IP數(shù)據(jù)報(bào)最長(zhǎng)可達(dá)65535字節(jié)。盡管可以傳送一個(gè)長(zhǎng)達(dá)65535字節(jié)的IP數(shù)據(jù)包,但是大多數(shù)的鏈路層都會(huì)對(duì)它進(jìn)行分片??傞L(zhǎng)度字段是IP首部中必要的內(nèi)容,因?yàn)橐恍?shù)據(jù)鏈路(如以太網(wǎng))需要填充一些數(shù)據(jù)以達(dá)到最小長(zhǎng)度。盡管以太網(wǎng)的最小幀長(zhǎng)為46字節(jié),但是IP數(shù)據(jù)可能會(huì)更短。如果沒有總長(zhǎng)度字段,那么IP層就不知道46字節(jié)中有多少是IP數(shù)據(jù)包的內(nèi)容。
標(biāo)識(shí)字段:唯一地標(biāo)識(shí)主機(jī)發(fā)送的每一份數(shù)據(jù)包。通常每發(fā)送一份報(bào)文它的值就會(huì)加1樣,物理網(wǎng)絡(luò)層一般要限制每次發(fā)送數(shù)據(jù)幀的最大長(zhǎng)度。IP把MTU與數(shù)據(jù)包長(zhǎng)度進(jìn)行比較,如果需要?jiǎng)t進(jìn)行分片。分片可以發(fā)生在原始發(fā)送端主機(jī)上,也可以發(fā)生在中間路由器上。把一份IP數(shù)據(jù)包分片以后,只有到達(dá)目的地才進(jìn)行重新組裝。重新組裝由目的端的IP層來完成,其目的是使分片和重新組裝過程對(duì)傳輸層(TCP和UDP)是透明的,即使只丟失一片數(shù)據(jù)也要重傳整個(gè)數(shù)據(jù)包。
已經(jīng)分片過的數(shù)據(jù)包有可能會(huì)再次進(jìn)行分片(可能不止一次)。IP首部中包含的數(shù)據(jù)為分片和重新組裝提供了足夠的信息。
對(duì)于發(fā)送端發(fā)送的每份IP數(shù)據(jù)包來說,其標(biāo)識(shí)字段都包含一個(gè)唯一值。該值在數(shù)據(jù)包分片時(shí)被復(fù)制到每個(gè)片中。標(biāo)志字段用其中一個(gè)比特來表示“更多的片”除了最后一片外,其他每片都要把該比特置1。
片偏移字段指的是該片偏移原始數(shù)據(jù)包開始處的位置。當(dāng)數(shù)據(jù)包被分片后,每個(gè)片的總長(zhǎng)度值要改為該片的長(zhǎng)度值。標(biāo)志字段中有一個(gè)比特稱作“不分片”位。如果將這一比特置1,IP將不對(duì)數(shù)據(jù)報(bào)進(jìn)行分片,在網(wǎng)絡(luò)傳輸過程中如果遇到鏈路層的MTU小于數(shù)據(jù)包的長(zhǎng)度時(shí)將數(shù)據(jù)包丟棄并發(fā)送一個(gè)ICMP差錯(cuò)報(bào)文。
TTL(time-to-live)生存時(shí)間:該字段設(shè)置了數(shù)據(jù)包可以經(jīng)過的最多路由器數(shù)。它指定了數(shù)據(jù)報(bào)的生存時(shí)間。TTL的初始值由源主機(jī)設(shè)置(通常為32或64),一旦經(jīng)過一個(gè)處理它的路由器,它的值就減去1。當(dāng)該字段的值為0時(shí),數(shù)據(jù)報(bào)就被丟棄,并發(fā)送ICMP報(bào)文通知源主機(jī)。
協(xié)議字段:根據(jù)它可以識(shí)別是哪個(gè)協(xié)議向IP傳送數(shù)據(jù)。
首部檢驗(yàn)和字段:根據(jù)IP首部計(jì)算的檢驗(yàn)和碼。它不對(duì)首部后面的數(shù)據(jù)進(jìn)行計(jì)算。因?yàn)镮CMP、IGMP、UDP和TCP在它們各自的首部中均含有同時(shí)覆蓋首部和數(shù)據(jù)效驗(yàn)和碼。
每一份IP數(shù)據(jù)報(bào)都包含32 bit的源IP地址和目的IP地址。
最后一個(gè)字段是任選項(xiàng),是數(shù)據(jù)包中的一個(gè)可變長(zhǎng)的可選信息。這些任選項(xiàng)定義如下:
安全和處理限制(用于軍事領(lǐng)域,詳細(xì)內(nèi)容參見RFC 1108[Kent 1991])
記錄路徑(讓每個(gè)路由器都記下它的IP地址)
時(shí)間戳(讓每個(gè)路由器都記下它的IP地址和時(shí)間)
寬松的源站選路(為數(shù)據(jù)報(bào)指定一系列必須經(jīng)過的IP地址)
嚴(yán)格的源站選路(與寬松的源站選路類似,但是要求只能經(jīng)過指定的這些地址,不能經(jīng)過其他的地址)。```
這些選項(xiàng)很少被使用,并非所有的主機(jī)和路由器都支持這些選項(xiàng)。`選項(xiàng)字段一直都是以32 bit作為界限,在必要的時(shí)候插入值為0的填充字節(jié)。這樣就保證IP首部始終是32 bit的整數(shù)倍。`
最后是上層的數(shù)據(jù),比如TCP或UDP的數(shù)據(jù)段。

- 由于TCP、UDP、ICMP和IGMP及一些其他的協(xié)議都要利用IP傳送數(shù)據(jù),因此IP必須在生成的IP首部中加入某種標(biāo)識(shí),以表明其承載的數(shù)據(jù)屬于哪一類。為此,IP在首部中存入一個(gè)長(zhǎng)度為8 bit的數(shù)值,稱作協(xié)議域。
其中1表示為ICMP協(xié)議,2表示為IGMP協(xié)議,6表示為TCP協(xié)議,17表示為UDP協(xié)議。

- ICMP是一種集差錯(cuò)報(bào)告與控制于一身的協(xié)議。在所有TCP/IP主機(jī)上都可實(shí)現(xiàn)ICMP。ICMP消息被封裝在IP數(shù)據(jù)報(bào)里,ICMP經(jīng)常被認(rèn)為是IP層的一個(gè)組成部分。它傳遞差錯(cuò)報(bào)文以及其他需要注意的信息。ICMP報(bào)文通常被IP層或更高層協(xié)議(TCP或UDP)使用。一些ICMP報(bào)文把差錯(cuò)報(bào)文返回給用戶進(jìn)程。
```常用的“ping”就是使用的ICMP協(xié)議```。“ping”這個(gè)名字源于聲納定位操作,目的是為了測(cè)試另一臺(tái)主機(jī)是否可達(dá)。該程序發(fā)送一份ICMP回應(yīng)請(qǐng)求報(bào)文給主機(jī),并等待返回ICMP回應(yīng)應(yīng)答。一般來說,如果不能Ping到某臺(tái)主機(jī),那么就不能Telnet或者FTP到那臺(tái)主機(jī)。反過來,如果不能Telnet到某臺(tái)主機(jī),那么通??梢杂肞ing程序來確定問題出在哪里。Ping程序還能測(cè)出到這臺(tái)主機(jī)的往返時(shí)間,以表明該主機(jī)離我們有“多遠(yuǎn)”。
然而隨著Internet安全意識(shí)的增強(qiáng),出現(xiàn)了提供訪問控制列表的路由器和防火墻,那么像這樣沒有限定的斷言就不再成立了。一臺(tái)主機(jī)的可達(dá)性可能不只取決于IP層是否可達(dá),還取決于使用何種協(xié)議以及端口號(hào)。

- 數(shù)據(jù)鏈路層協(xié)議如以太網(wǎng)或令牌環(huán)網(wǎng)都有自己的尋址機(jī)制(常常為48 bit地址),這是使用數(shù)據(jù)鏈路的任何網(wǎng)絡(luò)層都必須遵從的。當(dāng)一臺(tái)主機(jī)把以太網(wǎng)數(shù)據(jù)幀發(fā)送到位于同一局域網(wǎng)上的另一臺(tái)主機(jī)時(shí),是根據(jù)48 bit的以太網(wǎng)地址來確定目的接口的。設(shè)備驅(qū)動(dòng)程序從不檢查IP數(shù)據(jù)報(bào)中的目的IP地址。
ARP協(xié)議需要為IP地址和MAC地址這兩種不同的地址形式提供對(duì)應(yīng)關(guān)系。
`ARP過程如下`:ARP發(fā)送一份稱作ARP請(qǐng)求的以太網(wǎng)數(shù)據(jù)幀給以太網(wǎng)上的每個(gè)主機(jī)。這個(gè)過程稱作廣播,ARP請(qǐng)求數(shù)據(jù)幀中包含目的主機(jī)的IP地址,其意思是“如果你是這個(gè)IP地址的擁有者,請(qǐng)回答你的硬件地址。
連接到同一LAN的所有主機(jī)都接收并處理ARP廣播,目的主機(jī)的ARP層收到這份廣播報(bào)文后,根據(jù)目的IP地址判斷出這是發(fā)送端在尋問它的MAC地址。于是發(fā)送一個(gè)單播ARP應(yīng)答。這個(gè)ARP應(yīng)答包含IP地址及對(duì)應(yīng)的硬件地址。收到ARP應(yīng)答后,發(fā)送端就知道接收端的MAC地址了。
ARP高效運(yùn)行的關(guān)鍵是由于每個(gè)主機(jī)上都有一個(gè)ARP高速緩存。這個(gè)高速緩存存放了最近IP地址到硬件地址之間的映射記錄。當(dāng)主機(jī)查找某個(gè)IP地址與MAC地址的對(duì)應(yīng)關(guān)系時(shí)首先在本機(jī)的ARP緩存表中查找,只有在找不到時(shí)才進(jìn)行ARP廣播。

- 具有本地磁盤的系統(tǒng)引導(dǎo)時(shí),一般是從磁盤上的配置文件中讀取IP地址。但是無盤工作站或被配置為動(dòng)態(tài)獲取IP地址的主機(jī)則需要采用其他方法來獲得IP地址。
RARP實(shí)現(xiàn)過程是主機(jī)從接口卡上讀取唯一的硬件地址,然后發(fā)送一份RARP請(qǐng)求(一幀在網(wǎng)絡(luò)上廣播的數(shù)據(jù)),請(qǐng)求某個(gè)主機(jī)(如DHCP服務(wù)器或BOOTP服務(wù)器)響應(yīng)該主機(jī)系統(tǒng)的IP地址。
DHCP服務(wù)器或BOOTP服務(wù)器接收到了RARP的請(qǐng)求,為其分配IP地址等配置信息,并通過RARP回應(yīng)發(fā)送給源主機(jī)。

資料:
[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)






