TCP/IP協(xié)議棧與數(shù)據(jù)包封裝圖文教程

目的主機(jī)收到數(shù)據(jù)包后,如何經(jīng)過各層協(xié)議棧最后到達(dá)應(yīng)用程序呢?整個過程如下圖所示(該圖出自[TCPIP])。
36.5. Multiplexing過程
以太網(wǎng)驅(qū)動程序首先根據(jù)以太網(wǎng)首部中的"上層協(xié)議"字段確定該數(shù)據(jù)幀的有效載荷(payload,指除去協(xié)議首部之外實際傳輸?shù)臄?shù)據(jù))是IP、ARP還是RARP協(xié)議的數(shù)據(jù)報,然后交給相應(yīng)的協(xié)議處理。假如是IP數(shù)據(jù)報,IP協(xié)議再根據(jù)IP首部中的"上層協(xié)議"字段確定該數(shù)據(jù)報的有效載荷是TCP、UDP、ICMP還是IGMP,然后交給相應(yīng)的協(xié)議處理。假如是TCP段或UDP段,TCP或UDP協(xié)議再根據(jù)TCP首部或UDP首部的"端口號"字段確定應(yīng)該將應(yīng)用層數(shù)據(jù)交給哪個用戶進(jìn)程。IP地址是標(biāo)識網(wǎng)絡(luò)中不同主機(jī)的地址,而端口號就是同一臺主機(jī)上標(biāo)識不同進(jìn)程的地址,IP地址和端口號合起來標(biāo)識網(wǎng)絡(luò)中唯一的進(jìn)程。
注意,雖然IP、ARP和RARP數(shù)據(jù)報都需要以太網(wǎng)驅(qū)動程序來封裝成幀,但是從功能上劃分,ARP和RARP屬于鏈路層,IP屬于網(wǎng)絡(luò)層。雖然ICMP、IGMP、TCP、UDP的數(shù)據(jù)都需要IP協(xié)議來封裝成數(shù)據(jù)報,但是從功能上劃分,ICMP、IGMP與IP同屬于網(wǎng)絡(luò)層,TCP和UDP屬于傳輸層。本文對RARP、ICMP、IGMP協(xié)議不做進(jìn)一步介紹,有興趣的讀者可以看參考資料。
2. 以太網(wǎng)(RFC 894)幀格式以太網(wǎng)的幀格式如下所示(該圖出自[TCPIP]):
36.6. 以太網(wǎng)幀格式
其中的源地址和目的地址是指網(wǎng)卡的硬件地址(也叫MAC地址),長度是48位,是在網(wǎng)卡出廠時固化的。用ifconfig命令看一下,"HWaddr 00:15:F2:14:9E:3F"部分就是硬件地址。協(xié)議字段有三種值,分別對應(yīng)IP、ARP、RARP。幀末尾是CRC校驗碼。
以太網(wǎng)幀中的數(shù)據(jù)長度規(guī)定最小46字節(jié),最大1500字節(jié),ARP和RARP數(shù)據(jù)包的長度不夠46字節(jié),要在后面補(bǔ)填充位。最大值1500稱為以太網(wǎng)的最大傳輸單元(MTU),不同的網(wǎng)絡(luò)類型有不同的MTU,如果一個數(shù)據(jù)包從以太網(wǎng)路由到撥號鏈路上,數(shù)據(jù)包長度大于撥號鏈路的MTU了,則需要對數(shù)據(jù)包進(jìn)行分片(fragmentation)。ifconfig命令的輸出中也有"MTU:1500"。注意,MTU這個概念指數(shù)據(jù)幀中有效載荷的最大長度,不包括幀首部的長度。
3. ARP數(shù)據(jù)報格式
在網(wǎng)絡(luò)通訊時,源主機(jī)的應(yīng)用程序知道目的主機(jī)的IP地址和端口號,卻不知道目的主機(jī)的硬件地址,而數(shù)據(jù)包首先是被網(wǎng)卡接收到再去處理上層協(xié)議的,如果接收到的數(shù)據(jù)包的硬件地址與本機(jī)不符,則直接丟棄。因此在通訊前必須獲得目的主機(jī)的硬件地址。ARP協(xié)議就起到這個作用。源主機(jī)發(fā)出ARP請求,詢問"IP地址是192.168.0.1的主機(jī)的硬件地址是多少",并將這個請求廣播到本地網(wǎng)段(以太網(wǎng)幀首部的硬件地址填FF:FF:FF:FF:FF:FF表示廣播),目的主機(jī)接收到廣播的ARP請求,發(fā)現(xiàn)其中的IP地址與本機(jī)相符,則發(fā)送一個ARP應(yīng)答數(shù)據(jù)包給源主機(jī),將自己的硬件地址填寫在應(yīng)答包中。
每臺主機(jī)都維護(hù)一個ARP緩存表,可以用arp -a命令查看。緩存表中的表項有過期時間(一般為20分鐘),如果20分鐘內(nèi)沒有再次使用某個表項,則該表項失效,下次還要發(fā)ARP請求來獲得目的主機(jī)的硬件地址。想一想,為什么表項要有過期時間而不是一直有效?
ARP數(shù)據(jù)報的格式如下所示(該圖出自[TCPIP]):
36.7. ARP數(shù)據(jù)報格式
注意到源MAC地址、目的MAC地址在以太網(wǎng)首部和ARP請求中各出現(xiàn)一次,對于鏈路層為以太網(wǎng)的情況是多余的,但如果鏈路層是其它類型的網(wǎng)絡(luò)則有可能是必要的。硬件類型指鏈路層網(wǎng)絡(luò)類型,1為以太網(wǎng),協(xié)議類型指要轉(zhuǎn)換的地址類型,0×0800為IP地址,后面兩個地址長度對于以太網(wǎng)地址和IP地址分別為6和4(字節(jié)),op字段為1表示ARP請求,op字段為2表示ARP應(yīng)答。
下面舉一個具體的例子。
請求幀如下(為了清晰在每行的前面加了字節(jié)計數(shù),每行16個字節(jié)):
以太網(wǎng)首部(14字節(jié))
0000: ff ff ff ff ff ff 00 05 5d 61 58 a8 08 06
ARP幀(28字節(jié))
0000: 00 01
0010: 08 00 06 04 00 01 00 05 5d 61 58 a8 c0 a8 00 37
0020: 00 00 00 00 00 00 c0 a8 00 02
填充位(18字節(jié))
0020: 00 77 31 d2 50 10
0030: fd 78 41 d3 00 00 00 00 00 00 00 00
以太網(wǎng)首部:目的主機(jī)采用廣播地址,源主機(jī)的MAC地址是00:05:5d:61:58:a8,上層協(xié)議類型0×0806表示ARP。
ARP幀:硬件類型0×0001表示以太網(wǎng),協(xié)議類型0×0800表示IP協(xié)議,硬件地址(MAC地址)長度為6,協(xié)議地址(IP地址)長度為4,op為0×0001表示請求目的主機(jī)的MAC地址,源主機(jī)MAC地址為00:05:5d:61:58:a8,源主機(jī)IP地址為c0 a8 00 37(192.168.0.55),目的主機(jī)MAC地址全0待填寫,目的主機(jī)IP地址為c0 a8
00 02(192.168.0.2)。
由于以太網(wǎng)規(guī)定最小數(shù)據(jù)長度為46字節(jié),ARP幀長度只有28字節(jié),因此有18字節(jié)填充位,填充位的內(nèi)容沒有定義,與具體實現(xiàn)相關(guān)。
應(yīng)答幀如下:
以太網(wǎng)首部
0000: 00 05 5d 61 58 a8 00 05 5d a1 b8 40 08 06
ARP幀
0000: 00 01
0010: 08 00 06 04 00 02 00 05 5d a1 b8 40 c0 a8 00 02
0020: 00 05 5d 61 58 a8 c0 a8 00 37
填充位
0020: 00 77 31 d2 50 10
0030: fd 78 41 d3 00 00 00 00 00 00 00 00
以太網(wǎng)首部:目的主機(jī)的MAC地址是00:05:5d:61:58:a8,源主機(jī)的MAC地址是00:05:5d:a1:b8:40,上層協(xié)議類型0×0806表示ARP。
ARP幀:硬件類型0×0001表示以太網(wǎng),協(xié)議類型0×0800表示IP協(xié)議,硬件地址(MAC地址)長度為6,協(xié)議地址(IP地址)長度為4,op為0×0002表示應(yīng)答,源主機(jī)MAC地址為00:05:5d:a1:b8:40,源主機(jī)IP地址為c0 a8 00 02(192.168.0.2),目的主機(jī)MAC地址為00:05:5d:61:58:a8,目的主機(jī)IP地址為c0 a8 00 37
(192.168.0.55)。
思考題:如果源主機(jī)和目的主機(jī)不在同一網(wǎng)段,ARP請求的廣播幀無法穿過路由器,源主機(jī)如何與目的主機(jī)通信?
4. IP數(shù)據(jù)報格式
IP數(shù)據(jù)報的格式如下(這里只討論IPv4)(該圖出自[TCPIP]):
36.8. IP數(shù)據(jù)報格式
IP數(shù)據(jù)報的首部長度和數(shù)據(jù)長度都是可變長的,但總是4字節(jié)的整數(shù)倍。對于IPv4,4位版本字段是4。4位首部長度的數(shù)值是以4字節(jié)為單位的,最小值為5,也就是說首部長度最小是4×5=20字節(jié),也就是不帶任何選項的IP首部,4位能表示的最大值是15,也就是說首部長度最大是60字節(jié)。8位TOS字段有3個位用來指定IP數(shù)據(jù)報的優(yōu)先級(目前已經(jīng)廢棄不用),還有4個位表示可選的服務(wù)類型(最小延遲、最大呑吐量、最大可靠性、最小成本),還有一個位總是0??傞L度是整個數(shù)據(jù)報(包括IP首部和IP層payload)的字節(jié)數(shù)。每傳一個IP數(shù)據(jù)報,16位的標(biāo)識加1,可用于分片和重新組裝數(shù)據(jù)報。3位標(biāo)志和13位片偏移用于分片。TTL(Time to live)是這樣用的:源主機(jī)為數(shù)據(jù)包設(shè)定一個生存時間,比如64,每過一個路由器就把該值減1,如果減到0就表示路由已經(jīng)太長了仍然找不到目的主機(jī)的網(wǎng)絡(luò),就丟棄該包,因此這個生存時間的單位不是秒,而是跳(hop)。協(xié)議字段指示上層協(xié)議是TCP、UDP、ICMP還是IGMP。然后是校驗和,只校驗IP首部,數(shù)據(jù)的校驗由更高層協(xié)議負(fù)責(zé)。IPv4的IP地址長度為32位。選項字段的解釋從略。
相關(guān)文章
- 本文將詳細(xì)介紹TCP為什么需要進(jìn)行三次握手,需要深入了解的朋友可以參考下2012-11-19
- 有internet協(xié)議版本(TCP/IPv4)及internet協(xié)議版本(TCP/IPv6),這些稱之為傳輸控制協(xié)議/網(wǎng)間協(xié)議,是一個工業(yè)標(biāo)準(zhǔn)的協(xié)議集,它是為廣域網(wǎng)(WAN)設(shè)計的2013-06-04
- 這篇文章主要為大家介紹了什么是tcp?tcp協(xié)議的基礎(chǔ)知識有哪些?與udp的區(qū)別在哪里?以下將詳細(xì)介紹tcp的基礎(chǔ)知識,需要的朋友可以參考下2014-09-16
- 本文來探討一下TCP協(xié)議方面的一些認(rèn)識及實踐2012-10-25
- 本文詳細(xì)來探討TCP建立拆除連接的知識2012-10-25
- 這篇文章主要為大家介紹了如何解決TCP窗口大小的調(diào)節(jié)與擁塞控制的辦法,有圖有步驟,很詳細(xì),需要的朋友可以參考下2014-09-17
- 這篇文章主要介紹了圖解TCP通信三次握手和四次分手,對正在學(xué)習(xí)TPC通信的同學(xué)會有些幫助,需要的朋友可以參考下2014-09-24
- 最常見的是TCP和UDP端口,這是用來在互聯(lián)網(wǎng)上的計算機(jī)之間的數(shù)據(jù)交換,3688/udp端口使用服務(wù)類型簡單的推- S- S簡單的推協(xié)議,基礎(chǔ)概念不是很了解的朋友可以參考下本文2013-11-20
網(wǎng)絡(luò)協(xié)議 TCP三次握手與四次斷開的詳細(xì)觀察
這篇文章主要為大家介紹了網(wǎng)絡(luò)協(xié)議之tcp協(xié)議,TCP三次握手與四次斷開是怎么的一種情況呢,下面我們來看看觀察TCP三次握手與四次斷開,需要的朋友可以參考下2015-04-29- 這篇文章主要介紹了圖解TCP/IP協(xié)議,幫助大家輕松學(xué)會TCP/IP協(xié)議,需要的朋友可以參考下2015-12-16