TCP、UDP、IP 协议分析
http://blog.chinaunix.net/uid-26833883-id-3627644.html
互連網(wǎng)早期的時(shí)候,主機(jī)間的互連使用的是NCP協(xié)議。這種協(xié)議本身有很多缺陷,如:不能互連不同的主機(jī),不能互連不同的操作系統(tǒng),沒(méi)有糾錯(cuò)功能。為了改善這種缺點(diǎn),大牛弄出了TCP/IP協(xié)議。現(xiàn)在幾乎所有的操作系統(tǒng)都實(shí)現(xiàn)了TCP/IP協(xié)議棧。 TCP/IP協(xié)議棧主要分為四層:應(yīng)用層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層,每層都有相應(yīng)的協(xié)議,如下圖 所謂的協(xié)議就是雙方進(jìn)行數(shù)據(jù)傳輸?shù)囊环N格式。整個(gè)網(wǎng)絡(luò)中使用的協(xié)議有很多,所幸的是每一種協(xié)議都有RFC文檔。在這里只對(duì)IP、TCP、UDP協(xié)議頭做一個(gè)分析。 首先來(lái)看看在網(wǎng)絡(luò)中,一幀以太網(wǎng)數(shù)據(jù)包的格式:
用wirshark抓包如下:
前三次是三次握手的過(guò)程,后面三次是傳送數(shù)據(jù)的過(guò)程,由于數(shù)據(jù)大小是4096個(gè)字節(jié),所以用了三次進(jìn)行傳遞(1448 + 1448 + 1200)。 細(xì)心的人會(huì)問(wèn)為什么每次傳送的最大數(shù)據(jù)大小不是1460個(gè)字節(jié)呢?因?yàn)檫@里的TCP攜帶可選項(xiàng),TCP頭長(zhǎng)度 = 20 + 12(可選選項(xiàng)大小) = 32字節(jié)。 這樣能傳輸?shù)淖畲髷?shù)據(jù)為:1500 - 20 - 32 = 1448個(gè)字節(jié)。 (2)四次揮手?jǐn)嚅_連接 a.現(xiàn)在的網(wǎng)絡(luò)通信都是基于socket實(shí)現(xiàn)的,當(dāng)客戶端將自己的socket進(jìn)行關(guān)閉時(shí),內(nèi)核協(xié)議棧會(huì)向服務(wù)器自動(dòng)發(fā)送一個(gè)FIN置位的包,請(qǐng)求斷開連接。我們稱首先發(fā)起斷開請(qǐng)求的一方稱為主動(dòng)斷開方。 b.服務(wù)器端收到請(qǐng)客端的FIN斷開請(qǐng)求后,內(nèi)核協(xié)議棧會(huì)立即發(fā)送一個(gè)ACK包作為應(yīng)答,表示已經(jīng)收到客戶端的請(qǐng)求 c.服務(wù)器運(yùn)行一段時(shí)間后,關(guān)閉了自己的socket。這個(gè)時(shí)候內(nèi)核協(xié)議棧會(huì)向客戶端發(fā)送一個(gè)FIN置位的包,請(qǐng)求斷開連接 d.客戶端收到服務(wù)端發(fā)來(lái)的FIN斷開請(qǐng)求后,會(huì)發(fā)送一個(gè)ACK做出應(yīng)答,表示已經(jīng)收到服務(wù)端的請(qǐng)求
用wirshar抓包分析如下:
TCP采用一種名為“帶重傳功能的肯定確認(rèn)(positive?acknowledge?with?retransmission)”的技術(shù)作為提供可靠數(shù)據(jù)傳輸服務(wù)的基礎(chǔ)。這項(xiàng)技術(shù)要求接收方收到數(shù)據(jù)之后向源站回送確認(rèn)信息ACK。發(fā)送方對(duì)發(fā)出的每個(gè)分組都保存一份記錄,在發(fā)送下一個(gè)分組之前等待確認(rèn)信息。發(fā)送方還在送出分組的同時(shí)啟動(dòng)一個(gè)定時(shí)器,并在定時(shí)器的定時(shí)期滿而確認(rèn)信息還沒(méi)有到達(dá)的情況下,重發(fā)剛才發(fā)出的分組。圖3-5表示帶重傳功能的肯定確認(rèn)協(xié)議傳輸數(shù)據(jù)的情況,圖3-6表示分組丟失引起超時(shí)和重傳。為了避免由于網(wǎng)絡(luò)延遲引起遲到的確認(rèn)和重復(fù)的確認(rèn),協(xié)議規(guī)定在確認(rèn)信息中稍帶一個(gè)分組的序號(hào),使接收方能正確將分組與確認(rèn)關(guān)聯(lián)起來(lái)。
從圖?3-5可以看出,雖然網(wǎng)絡(luò)具有同時(shí)進(jìn)行雙向通信的能力,但由于在接到前一個(gè)分組的確認(rèn)信息之前必須推遲下一個(gè)分組的發(fā)送,簡(jiǎn)單的肯定確認(rèn)協(xié)議浪費(fèi)了大量寶貴的網(wǎng)絡(luò)帶寬。為此,?TCP使用滑動(dòng)窗口的機(jī)制來(lái)提高網(wǎng)絡(luò)吞吐量,同時(shí)解決端到端的流量控制。
滑動(dòng)窗口技術(shù)是簡(jiǎn)單的帶重傳的肯定確認(rèn)機(jī)制的一個(gè)更復(fù)雜的變形,它允許發(fā)送方在等待一個(gè)確認(rèn)信息之前可以發(fā)送多個(gè)分組。如圖?3-7所示,發(fā)送方要發(fā)送一個(gè)分組序列,滑動(dòng)窗口協(xié)議在分組序列中放置一個(gè)固定長(zhǎng)度的窗口,然后將窗口內(nèi)的所有分組都發(fā)送出去;當(dāng)發(fā)送方收到對(duì)窗口內(nèi)第一個(gè)分組的確認(rèn)信息時(shí),它可以向后滑動(dòng)并發(fā)送下一個(gè)分組;隨著確認(rèn)的不斷到達(dá),窗口也在不斷的向后滑動(dòng)。
(1)版本 占4位,指IP協(xié)議的版本。通信雙方使用的IP協(xié)議版本必須一致。目前廣泛使用的IP協(xié)議版本號(hào)為4(即IPv4)。關(guān)于IPv6,目前還處于草案階段。?
?
(2)首部長(zhǎng)度 占4位,可表示的最大十進(jìn)制數(shù)值是15。請(qǐng)注意,這個(gè)字段所表示數(shù)的單位是32位字長(zhǎng)(1個(gè)32位字長(zhǎng)是4字節(jié)),因此,當(dāng)IP的首部長(zhǎng)度為1111時(shí)(即十進(jìn)制的15),首部長(zhǎng)度就達(dá)到60字節(jié)。當(dāng)IP分組的首部長(zhǎng)度不是4字節(jié)的整數(shù)倍時(shí),必須利用最后的填充字段加以填充。因此數(shù)據(jù)部分永遠(yuǎn)在4字節(jié)的整數(shù)倍開始,這樣在實(shí)現(xiàn)IP協(xié)議時(shí)較為方便。首部長(zhǎng)度限制為60字節(jié)的缺點(diǎn)是有時(shí)可能不夠用。但這樣做是希望用戶盡量減少開銷。最常用的首部長(zhǎng)度就是20字節(jié)(即首部長(zhǎng)度為0101),這時(shí)不使用任何選項(xiàng)。?
?
(3)區(qū)分服務(wù) 占8位,用來(lái)獲得更好的服務(wù)。這個(gè)字段在舊標(biāo)準(zhǔn)中叫做服務(wù)類型,但實(shí)際上一直沒(méi)有被使用過(guò)。1998年IETF把這個(gè)字段改名為區(qū)分服務(wù)DS(Differentiated?Services)。只有在使用區(qū)分服務(wù)時(shí),這個(gè)字段才起作用。?
?
(4)總長(zhǎng)度 總長(zhǎng)度指首部和數(shù)據(jù)之和的長(zhǎng)度,單位為字節(jié)。總長(zhǎng)度字段為16位,因此數(shù)據(jù)報(bào)的最大長(zhǎng)度為216-1=65535字節(jié)。?
在IP層下面的每一種數(shù)據(jù)鏈路層都有自己的幀格式,其中包括幀格式中的數(shù)據(jù)字段的最大長(zhǎng)度,這稱為最大傳送單元MTU(Maximum?Transfer?Unit)。當(dāng)一個(gè)數(shù)據(jù)報(bào)封裝成鏈路層的幀時(shí),此數(shù)據(jù)報(bào)的總長(zhǎng)度(即首部加上數(shù)據(jù)部分)一定不能超過(guò)下面的數(shù)據(jù)鏈路層的MTU值。?
?
(5)標(biāo)識(shí)(identification) 占16位。IP軟件在存儲(chǔ)器中維持一個(gè)計(jì)數(shù)器,每產(chǎn)生一個(gè)數(shù)據(jù)報(bào),計(jì)數(shù)器就加1,并將此值賦給標(biāo)識(shí)字段。但這個(gè)“標(biāo)識(shí)”并不是序號(hào),因?yàn)镮P是無(wú)連接服務(wù),數(shù)據(jù)報(bào)不存在按序接收的問(wèn)題。當(dāng)數(shù)據(jù)報(bào)由于長(zhǎng)度超過(guò)網(wǎng)絡(luò)的MTU而必須分片時(shí),這個(gè)標(biāo)識(shí)字段的值就被復(fù)制到所有的數(shù)據(jù)報(bào)的標(biāo)識(shí)字段中。相同的標(biāo)識(shí)字段的值使分片后的各數(shù)據(jù)報(bào)片最后能正確地重裝成為原來(lái)的數(shù)據(jù)報(bào)。?
?
(6)標(biāo)志(flag) 占3位,但目前只有2位有意義。?
● 標(biāo)志字段中的最低位記為MF(More?Fragment)。MF=1即表示后面“還有分片”的數(shù)據(jù)報(bào)。MF=0表示這已是若干數(shù)據(jù)報(bào)片中的最后一個(gè)?
● 標(biāo)志字段中間的一位記為DF(Don’t?Fragment),意思是“不能分片”。只有當(dāng)DF=0時(shí)才允許分片。?
?
(7)片偏移 占13位。片偏移指出:較長(zhǎng)的分組在分片后,某片在原分組中的相對(duì)位置。也就是說(shuō),相對(duì)用戶數(shù)據(jù)字段的起點(diǎn),該片從何處開始。片偏移以8個(gè)字節(jié)為偏移單位。這就是說(shuō),每個(gè)分片的長(zhǎng)度一定是8字節(jié)(64位)的整數(shù)倍。?
?
(8)生存時(shí)間 占8位,生存時(shí)間字段常用的的英文縮寫是TTL(Time?To?Live),表明是數(shù)據(jù)報(bào)在網(wǎng)絡(luò)中的壽命。由發(fā)出數(shù)據(jù)報(bào)的源點(diǎn)設(shè)置這個(gè)字段。其目的是防止無(wú)法交付的數(shù)據(jù)報(bào)無(wú)限制地在因特網(wǎng)中兜圈子,因而白白消耗網(wǎng)絡(luò)資源。最初的設(shè)計(jì)是以秒作為TTL的單位。每經(jīng)過(guò)一個(gè)路由器時(shí),就把TTL減去數(shù)據(jù)報(bào)在路由器消耗掉的一段時(shí)間。若數(shù)據(jù)報(bào)在路由器消耗的時(shí)間小于1秒,就把TTL值減1。當(dāng)TTL值為0時(shí),就丟棄這個(gè)數(shù)據(jù)報(bào)。?
?
(9)協(xié)議 占8位,協(xié)議字段指出此數(shù)據(jù)報(bào)攜帶的數(shù)據(jù)是使用何種協(xié)議,以便使目的主機(jī)的IP層知道應(yīng)將數(shù)據(jù)部分上交給哪個(gè)處理過(guò)程。?
?
(10)首部檢驗(yàn)和 占16位。這個(gè)字段只檢驗(yàn)數(shù)據(jù)報(bào)的首部,但不包括數(shù)據(jù)部分。這是因?yàn)閿?shù)據(jù)報(bào)每經(jīng)過(guò)一個(gè)路由器,路由器都要重新計(jì)算一下首部檢驗(yàn)和(一些字段,如生存時(shí)間、標(biāo)志、片偏移等都可能發(fā)生變化)。不檢驗(yàn)數(shù)據(jù)部分可減少計(jì)算的工作量。?
?
(11)源IP地址 占32位。?
?
(12)目的IP地址 占32位。
2.分片解釋 分片指的是需要傳送的數(shù)據(jù)大于最大傳輸單元(MTU)的時(shí)候,就需要分成多個(gè)包,然后一個(gè)個(gè)發(fā)送給對(duì)方。我們?cè)谡f(shuō)TCP的時(shí)候,說(shuō)到MSS很多人不能區(qū)分它們。通過(guò)下面的圖,我想就可以完全區(qū)分它們了。
可以看到,但數(shù)據(jù)提交到網(wǎng)絡(luò)層的時(shí)候,由于數(shù)據(jù)超過(guò)了最大傳輸單元,就分片了。分成多個(gè)包通過(guò)IP協(xié)議發(fā)送個(gè)對(duì)方。每個(gè)數(shù)據(jù)包最大的字節(jié)為MTU - IP頭 = 1500 - 20 = 1480。
ARP協(xié)議是通過(guò)IP地址獲得對(duì)應(yīng)的MAC地址,稱為地址解析協(xié)議 RARP協(xié)議是通過(guò)MAC地址來(lái)獲得對(duì)應(yīng)的IP地址,稱為逆向地址解析協(xié)議
總結(jié)
以上是生活随笔為你收集整理的TCP、UDP、IP 协议分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [转]一张图理解prototype、pr
- 下一篇: 优先队列(个人模版)