1. 程式人生 > >乙太網幀格式、IP資料報格式、TCP段格式+UDP段格式 詳解

乙太網幀格式、IP資料報格式、TCP段格式+UDP段格式 詳解

1、ISO開放系統有以下幾層:

7

應用層

6

表示層

5

會話層

4

傳輸層

3

網路層

2

資料鏈路層

1

物理層

2、TCP/IP 網路協議棧分為應用層(Application)、傳輸層(Transport)、網路層(Network)和鏈路層(Link)四層。

通訊過程中,每層協議都要加上一個資料首部(header),稱為封裝(Encapsulation),如下圖所示

不同的協議層對資料包有不同的稱謂,在傳輸層叫做段(segment),在網路層叫做資料報(datagram),在鏈路層叫做幀(frame)。資料封裝成幀後發到傳輸介質上,到達目的主機後每層協議再剝掉相應的首部,最後將應用層資料交給應用程式處理。

其實在鏈路層之下還有物理層,指的是電訊號的傳遞方式,比如現在乙太網通用的網線(雙絞線)、早期乙太網採用的的同軸電纜(現在主要用於有線電視)、光纖等都屬於物理層的概念。

3、集線器(Hub)是工作在物理層的網路裝置,用於雙絞線的連線和訊號中繼(將已衰減的訊號再次放大使之傳得更遠)。

交換機是工作在鏈路層的網路裝置,可以在不同的鏈路層網路之間轉發資料幀(比如十兆乙太網和百兆乙太網之間、乙太網和令牌環網之間),由於不同鏈路層的幀格式不同,交換機要將進來的資料包拆掉鏈路層首部重新封裝之後再轉發。

路由器是工作在第三層的網路裝置,同時兼有交換機的功能,可以在不同的鏈路層介面之間轉發資料包,因此路由器需要將進來的資料包拆掉網路層和鏈路層兩層首部並重新封裝。

4、 網路層的IP 協議是構成Internet 的基礎。IP 協議不保證傳輸的可靠性,資料包在傳輸過程中可能丟失,可靠性可以在上層協議或應用程式中提供支援。

傳輸層可選擇TCP 或UDP 協議。TCP 是一種面向連線的、可靠的協議,有點像打電話,雙方拿起電話互通身份之後就建立了連線,然後說話就行了,這邊說的話那邊保證聽得到,並且是按說話的順序聽到的,說完話掛機斷開連線。也就是說TCP 傳輸的雙方需要首先建立連線,之後由TCP 協議保證資料收發的可靠性,丟失的資料包自動重發,上層應用程式收到的總是可靠的資料流,通訊之後關閉連線。UDP 協議不面向連線,也不保證可靠性,有點像寄信,寫好信放到郵筒裡,既不能保證信件在郵遞過程中不會丟失,也不能保證信件是按順序寄到目的地的。使用UDP 協議的應用程式需要自己完成丟包重發、訊息排序等工作。

5、 資料傳輸經過的各層協議過程如下

乙太網驅動程式首先根據乙太網首部中的“上層協議”欄位確定該資料幀的有效載荷(payload,指除去協議首部之外實際傳輸的資料)是IP、ARP 還是RARP 協議的資料報,然後交給相應的協議處理。假如是IP 資料報,IP 協議再根據IP 首部中的“上層協議”欄位確定該資料報的有效載荷是TCP、UDP、ICMP 還是IGMP,然後交給相應的協議處理。假如是TCP 段或UDP段,TCP 或UDP 協議再根據TCP 首部或UDP 首部的“埠號”欄位確定應該將應用層資料交給哪個使用者程序。IP 地址是標識網路中不同主機的地址,而埠號就是同一臺主機上標識不同程序的地址,IP 地址和埠號合起來標識網路中唯一的程序。

雖然IP、ARP 和RARP 資料報都需要乙太網驅動程式來封裝成幀,但是從功能上劃分,ARP 和RARP 屬於鏈路層,IP 屬於網路層。雖然ICMP、IGMP、TCP、UDP 的資料都需要IP 協議來封裝成資料報,但是從功能上劃分,ICMP、IGMP 與IP 同屬於網路層,TCP 和UDP屬於傳輸層。

6、乙太網幀格式

(1)其中的源地址和目的地址是指網絡卡的硬體地址(也叫MAC 地址),長度是48 位,是在網絡卡出廠時固化的。

(2)注意網絡卡晶片(例如DM9000A)收到的資料就是如上所示的一長串資料;其中包括乙太網幀頭、IP報報頭、傳輸層協議段頭、應用層所需資料。

(3)乙太網幀中的資料長度規定最小46 位元組,最大1500 位元組,ARP 和RARP 資料包的長度不夠46 位元組,要在後面補填充位。最大值1500 稱為乙太網的最大傳輸單元(MTU),不同的網路型別有不同的MTU,如果一個數據包從乙太網路由到撥號鏈路上,資料包度大於撥號鏈路的MTU了,則需要對資料包進行分片fragmentation)。ifconfig 命令的輸出中也有“MTU:1500”。注意,MTU 個概念指資料幀中有效載荷的最大長度,不包括幀首部的長度。

7、IP資料報格式

IPv4:

 

IP 資料報的首部長度和資料長度都是可變長的,但總是4 位元組的整數倍。對於IPv4,4 位版本欄位是4。4 位首部長度的數值是以4 位元組為單位的,最小值為5,也就是說首部長度最小是4x5=20 位元組,也就是不帶任何選項的IP 首部,4 位能表示的最大值是15,也就是說首部長度最大是60 位元組。8 位TOS 欄位有3 個位用來指定IP 資料報的優先順序(目前已經廢棄不用),還有4 個位表示可選的服務型別(最小延遲、最大呑吐量、最大可靠性、最小成本),還有一個位總是0。總長度是整個資料報(包括IP 首部和IP 層payload)的位元組數。每傳一個IP 資料報,16 位的標識加1,可用於分片和重新組裝資料報。3 位標誌和13 位片偏移用於分片。TTL(Time to live)是這樣用的:源主機為資料包設定一個生存時間,比如64,每過一個路由器就把該值減1,如果減到0 就表示路由已經太長了仍然找不到目的主機的網路,就丟棄該包,因此這個生存時間的單位不是秒,而是跳(hop)。協議欄位指示上層協議是TCP、UDP、ICMP 還是IGMP。然後是校驗和,只校驗IP 首部,資料的校驗由更高層協議負責。IPv4的IP 地址長度為32 位。

8、UDP段格式

UDP 協議不面向連線,也不保證傳輸的可靠性。

9、TCP段格式

 

(1)序號:指出段中的資料部分在傳送方資料流中的位置。

確認號:指出接收方希望收到對方下次傳送的資料的第一個位元組的序號。

TCP段首部的定長部分為20個位元組,即5個單位的長度。

URG位:緊急標誌,和緊急指標配合使用,當其為1時表示,此報文要儘快傳送。

ACK位:確認標誌,和確認號欄位配合使用,當ACK位置1時,確認號欄位有效。

PSH位:為推送標誌,置1時,傳送方將立即傳送緩衝區中的資料。

RST位:復位標誌,置1時,表明有嚴重差錯,必須釋放連線。

SYN位: 同步標誌,置1時,表示請求建立連線。

FIN位:終止標誌,置1時,表明資料已經發送完,請求釋放連線。

視窗大小:32bit,用於向對方通告當前本機的接受緩衝區的大小。

校驗和欄位長度:16bit,校驗範圍包括段首部、資料以及偽首部。

(2)TCP資料傳輸過程

(3)TCP連線的建立

建立連線的過程:

【1】. 客戶端發出段1,SYN 位表示連線請求。序號是1000,這個序號在網路通訊中用作臨時的地址,每發一個數據位元組,這個序號要加1,這樣在接收端可以根據序號排出資料包的正確順序,也可以發現丟包的情況,另外,規定SYN 位和FIN 位也要佔一個序號,這次雖然沒發資料,但是由於發了SYN 位,因此下次再發送應該用序號1001。mss表示最大段尺寸,如果一個段太大,封裝成幀後超過了鏈路層的最大幀長度,就必須在IP 層分片,為了避免這種情況,客戶端宣告自己的最大段尺寸,建議伺服器端發來的段不要超過這個長度。

【2】 伺服器發出段2,也帶有SYN 位,同時置ACK 位表示確認,確認序號是1001,表示“我接收到序號1000 及其以前所有的段,請你下次傳送序號為1001 的段”,也就是應答了客戶端的連線請求,同時也給客戶端發出一個連線請求,同時宣告最大尺寸為1024。

【3】 客戶端發出段3,對伺服器的連線請求進行應答,確認序號是8001。

在這個過程中,客戶端和伺服器分別給對方發了連線請求,也應答了對方的連線請求,其中伺服器的請求和應答在一個段中發出,因此一共有三個段用於建立連線,稱為'''三方握手(three-way-handshake)'''。在建立連線的同時,雙方協商了一些資訊,例如雙方傳送序號的初始值、最大段尺寸等。

(4)TCP資料傳輸過程

【1】  客戶端發出段4,包含從序號1001 開始的20 個位元組資料。

【2】  伺服器發出段5,確認序號為1021,對序號為1001-1020 的資料表示確認收到,同時請求傳送序號1021 開始的資料,伺服器在應答的同時也向客戶端傳送從序號8001 開始的10 個位元組資料,這稱為piggyback。

【3】  客戶端發出段6,對伺服器發來的序號為8001-8010 的資料表示確認收到,請求傳送序號8011 開始的資料。

在資料傳輸過程中,ACK 和確認序號是非常重要的,應用程式交給TCP 協議傳送的資料會暫存在TCP 層的傳送緩衝區中,發出資料包給對方之後,只有收到對方應答的ACK 段才知道該資料包確實發到了對方,可以從傳送緩衝區中釋放掉了,如果因為網路故障丟失了資料包或者丟失了對方發回的ACK 段,經過等待超時後TCP 協議自動將傳送緩衝區中的資料包重發。

(5)TCP連線的關閉

【1】  客戶端發出段7,FIN 位表示關閉連線的請求。

【2】  伺服器發出段8,應答客戶端的關閉連線請求。

【3】  伺服器發出段9,其中也包含FIN 位,向客戶端傳送關閉連線請求。

【4】  客戶端發出段10,應答伺服器的關閉連線請求。

建立連線的過程是三方握手,而關閉連線通常需要4 個段(四次握手),伺服器的應答和關閉連線請求通常不合並在一個段中,因為有連線半關閉的情況,這種情況下客戶端關閉連線之後就不能再發送資料給伺服器了,但是伺服器還可以傳送資料給客戶端,直到伺服器也關閉連線為止,稍後會看到這樣的例子。

10、DM9000A實驗資料總結

DM9000A收到上位機TCP的資料包packet[ ]如下

(0x01,0x60,0x6E,0x11,

0x02,0x0F,0xE0,0x05,

0xC5,0xF3,0x29,0x00,

0x08,0x00,0x45,0x00,

0x00,0x40,0x28,0x03,

0x40,0x00,0x40,0x06,

0x91,0x5D,0xC0,0xA8,

0x00,0x04,0xC0,0xA8,

0x00,0x03,0x0C,0x72,

0x04,0x00,0xA8,0x85,

0x77,0x60,0x00,0x00,

0x00,0x00,0xB0,0x02,

0xFF,0xFF,0x84,0x51,

0x00,0x00,0x02,0x04,

0x05,0xB4,0x01,0x03,

0x03,0x00,0x01,0x01,

0x08,0x0A,0x00,0x00,

0x00,0x00,0x00,0x00,

0x00,0x00,0x01,0x01,

0x04,0x02,0xD8,0x9C,

0x05,0xA6,)

具體分析如下:

這個包結構為:乙太網幀頭 + IP資料報 + TCP/UDP資料包;

0x01,0x60,0x6E,0x11,0x02,0x0F, 為目的實體地址;packet[0] ~ packet[5]。

0xE0,0x05,0xC5,0xF3,0x29,0x00,為源實體地址;packet[6] ~ packet[11]。

0x08,0x00:協議型別,0800為IP;packet[12] 、packet[13]。

0x45:版本號和首部長度;packet[14];

0x00:TOS;packet[15];

0x00,0x40:16位總長度;packet[16] packet[17];;

0x28,0x03:16位標識;packet[18]~ packet[19];

0x40,0x00 : 3位標誌 + 13位片偏移;packet[20] packet[21];;

 0x40,:8位的生存時間TTL;packet[22];

0x06:8位的協議號;packet[23];

(ICMP:1;IGMP:2;TCP:6;EGP:8;UDP:17;)

0x91,0x5D:首部校驗和;packet[24];packet[25];

0xC0,0xA8,0x00,0x04:源IP地址;packet[26]~packet[29];

0xC0,0xA8,0x00,0x04:目的IP地址;packet[30]~packet[33];

選項(無);

0x0c,0x72:源埠;packet[34],packet[35];

0x04,0x00;目的埠;pcket[36],packet[37];

0xa8,0x85,0x77,0x60:序號;packet[38] ~ packet[41];

0x00,0x00,0x00,0x00:確認號;packet[42]~packet[45];

0Xb0,0x02:(HLEN,保留6bit,URG,ACK,PSH,PST,SYN,FIN);packet[46]~packet[47];

0Xff,0xff:視窗大小;packet[48],packet[49];

0x84,0x51:校驗和;packet[50],packet[51];

0x00,0x00:緊急指標;packet[52],packet[53];

…………

最後還用4位元組的CRC;屬於乙太網幀