以太網幀格式、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;屬於以太網幀

https://www.cnblogs.com/lifan3a/articles/6649970.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章