TCP/IP 協議簇的逐層封裝

??????? 在使用 TCP 協議的網絡程序中,用戶數據從產生到從網卡發出去一般要經過如下的逐層封裝過程:


??????? 從下往上看:
??????? 1)鏈路層通過加固定長度的首部、尾部來封裝 IP 數據報(Datagram) 產生以太網幀(Frame)。 其中首部存在對封裝數據的標識:是 IP(0x0800,例如本例) 、ARP(0x0806) 還是 RARP(0x0835)。
??????? 2)網絡層通過加 IP首部來封裝 TCP 段(Segment) 產生 IP 數據報。 其中首部存在對封裝數據的標識:是 ICMP(0x01)、IGMP(0x02)、TCP(0x06,例如本例)還是 UDP(0x11)。
??????? 3)傳輸層通過加首部來封裝應用數據產生 TCP 段。其中TCP首部存在對封裝數據的標識:端口號,來標識是那個應用程序產生的數據。

??????? 4)按這種處理邏輯,在應用層,對于我們要處理的應用數據理所當然的加上固定長度的首部,首部中同樣含有某些標識,標識些什么呢?按經驗,一般會標識本次數據的業務意義,在程序中一般處理為業務集合(枚舉型)的某個元素;如果是 TCP應用(本例) 還可能包括應用數據總體長度。


Ethernet、Tcp、Udp 等協議的數據包格式

??????? TCP/IP協議是一個比較復雜的協議集,有很多專業書籍介紹。在此,我僅介紹其與編程密切相關的部分:以太網上 TCP/IP 協議的分層結構及其報文格式。我們知道TCP/IP 協議采用分層結構,其分層模型及協議如下表:

??????? 協議采用分層結構,因此,數據報文也采用分層封裝的方法。下面以應用最廣泛的以太網為例說明其數據報文分層封裝,如下圖所示:

??????? 任何通訊協議都有獨特的報文格式,TCP/IP 協議也不例外。對于通訊協議編程,我們首先要清楚其報文格式。由于TCP/IP 協議采用分層模型,各層都有專用的報頭,以下就簡單介紹以太網下 TCP/IP 各層報文格式。


??????? 8 字節的前導用于幀同步,CRC 域用于幀校驗。這些用戶不必關心其由網卡芯片自動添加。目的地址和源地址是指網卡的物理地址,即 MAC 地址,具有唯一性。幀類型或協議類型是指數據包的高級協議,如 0x0806 表示 ARP 協議,0x0800 表示 IP 協議等。之所以要把數據組合成以幀為單位傳送,是為了在出錯時,可只將有錯的幀重發,而不必將全部數據重新發送,從而提高了效率。注:數據以幀為單位進行發送,若某一幀有差錯,以后就重傳這個出錯的幀。一個幀要有幀界限,接收端在收到比特流后,能夠依據幀界限正確知道哪些比特構成一個幀。接收端找到幀定界符并確定幀的準確位置,就是完成了幀同步。

????????? 硬件類型:指明了發送方想知道的硬件接口類型,以太網的值為1;
????????? 協議類型:指明了發送方提供的高層協議類型,IP為0800(16進制);
????????? 硬件地址長度和協議長度:指明了硬件地址和高層協議地址的長度,這樣ARP報文就可以在任意硬件和任意協議的網絡中使用;
????????? 操作類型:用來表示這個報文的類型,ARP請求為1,ARP響應為2,RARP請求為3,RARP響應為4;
????????? 發送方硬件地址(0-3字節):源主機硬件地址的前3個字節;
????????? 發送方硬件地址(4-5字節):源主機硬件地址的后3個字節;
????????? 發送方IP地址(0-1字節):源主機硬件地址的前2個字節;
????????? 發送方IP地址(2-3字節):源主機硬件地址的后2個字節;
????????? 目標硬件地址(0-1字節):目的主機硬件地址的前2個字節;
????????? 目標硬件地址(2-5字節):目的主機硬件地址的后4個字節;
?????????目標IP地址(0-3字節):目的主機的IP地址。


??????? IP 數據報頭格式如下圖:


???????版本號(Version)長度4比特。標識目前采用的IP協議的版本號。一般的值為0100(IPv4),0110(IPv6)
??????? IP包頭長度(Header Length)長度4比特。描述IP包頭的長度。因為在IP包頭中有變長的可選部分。該部分占4個bit位,單位為32bit(4個字節),即本區域值= IP頭部長度(單位為bit)/(8*4),因此,一個IP包頭的長度最長為“1111”,即15*4=60個字節。IP包頭最小長度為20字節。

??????? 服務類型(Type of Service)長度8比特。這八位被分成如下定義,其中PPP三位組合使用:PPP DTRC0
????????????? PPP:定義包的優先級,取值越大數據越重要
????????????? ? ? 000 普通 (Routine)
???????????? ? ?? 001 優先的 (Priority)
???????????? ? ?? 010 立即的發送 (Immediate)
???????? ? ? ? ?? 011 閃電式的 (Flash)
???????????? ? ?? 100 比閃電還閃電式的 (Flash Override)
???????????? ? ?? 101 CRI/TIC/ECP(找不到這個詞的翻譯)
???????????? ?? ? 110 網間控制 (Internetwork Control)
?????????? ? ?? ? 111 網絡控制 (Network Control)

????? ? ? ? ?? ??? D 時延: 0:普通 1:延遲盡量小
?????? ? ? ? ?? ??T 吞吐量: 0:普通 1:流量盡量大
???? ? ? ? ?? ????R 可靠性: 0:普通 1:可靠性盡量大
???? ? ? ? ?? ????M 傳輸成本: 0:普通 1:成本盡量小
????? ? ? ? ?? ???0 最后一位被保留,恒定為0

???????IP包總長(Total Length)長度16比特。 以字節為單位計算的IP包的長度 (包括頭部和數據),所以IP包最大長度65535字節。
??????? 標識符(Identifier):長度16比特。該字段和Flags和Fragment Offest字段聯合使用,對較大的上層數據包進行分段(fragment)操作。路由器將一個包拆分后,所有拆分開的小包被標記相同的值,以便目的端設備能夠區分哪個包屬于被拆分開的包的一部分。
??????? 標記(Flags)長度3比特。該字段第一位不使用。第二位是DF(Don't Fragment)位,DF位設為1時表明路由器不能對該上層數據包分段。如果一個上層數據包無法在不分段的情況下進行轉發,則路由器會丟棄該上層數據包并返回一個錯誤信息。第三位是MF(More Fragments)位,當路由器對一個上層數據包分段,則路由器會在除了最后一個分段的IP包的包頭中將MF位設為1。
??????? 片偏移(Fragment Offset)長度13比特。表示該IP包在該組分片包中位置,接收端靠此來組裝還原IP包。
??????? 生存時間(TTL)長度8比特。當IP包進行傳送時,先會對該字段賦予某個特定的值。當IP包經過每一個沿途的路由器的時候,每個沿途的路由器會將IP包的TTL值減少1。如果TTL減少為0,則該IP包會被丟棄。這個字段可以防止由于路由環路而導致IP包在網絡中不停被轉發。

??????? 協議(Protocol)長度8比特。標識了上層所使用的協議。
??????????????? 以下是比較常用的協議號:
? ? ? ? ? ? ? ? ? ? ? ? ? 1????ICMP
? ? ? ? ? ? ? ? ? ? ?? ?? 2????IGMP
? ? ? ? ? ? ? ? ? ? ?? ?? 6????TCP
? ? ? ? ? ? ? ? ? ? ? ? ? 17??? UDP
? ? ? ? ? ? ? ? ? ? ? ? ? 88??? IGRP
????????????????????????? 89??? OSPF
??????頭部校驗(Header Checksum)長度16位。用來做IP頭部的正確性檢測,但不包含數據部分。 因為每個路由器要改變TTL的值,所以路由器會為每個通過的數據包重新計算這個值。
?????? 起源和目標地址(Source and Destination Addresses)這兩個地段都是32比特。標識了這個IP包的起源和目標地址。要注意除非使用NAT,否則整個傳輸的過程中,這兩個地址不會改變。
?????? 至此,IP包頭基本的20字節已介紹完畢,此后部分屬于可選項,不是必須的部分。

????? 可選項(Options):這是一個可變長的字段。該字段屬于可選項,主要用于測試,由起源設備根據需要改寫。可選項目包含以下內容:
?? ?? 松散源路由(Loose source routing):給出一連串路由器接口的IP地址。IP包必須沿著這些IP地址傳送,但是允許在相繼的兩個IP地址之間跳過多個路由器。
? ? ? 嚴格源路由(Strict source routing):給出一連串路由器接口的IP地址。IP包必須沿著這些IP地址傳送,如果下一跳不在IP地址表中則表示發生錯誤。
?? ?? 路由記錄(Record route):當IP包離開每個路由器的時候記錄路由器的出站接口的IP地址。
? ? ? 時間戳(Timestamps):當IP包離開每個路由器的時候記錄時間。
?? ?? 填充(Padding):因為IP包頭長度(Header Length)部分的單位為32bit,所以IP包頭的長度必須為32bit的整數倍。因此,在可選項后面,IP協議會填充若干個0,以達到32bit的整數倍。

typedef struct _iphdr //定義IP首部  
{  
unsigned char h_lenver; //4位首部長度+4位IP版本號  
unsigned char tos; //8位服務類型TOS  
unsigned short total_len; //16位總長度(字節)
unsigned short ident; //16位標識  
unsigned short frag_and_flags; //3位標志位  
unsigned char ttl; //8位生存時間 TTL  
unsigned char proto; //8位協議 (TCP, UDP 或其他)  
unsigned short checksum; //16位IP首部校驗和 
unsigned int sourceIP; //32位源IP地址  
unsigned int destIP; //32位目的IP地址  
}IP_HEADER;

??????? 我們用單片機實現 TCP/IP 協議要作一些簡化,不考慮數據分片和優先權。因此,在此我們不討論服務類型和標志偏移域,只需填“0” 即可。協議“版本”為 4,“頭長度”單位為 32Bit,“總長度”以字節為單位,表示整個 IP 數據報長度。“標識”是數據包的 ID 號,用于識別不同的 IP 數據包。“生存時間” TTL 是個數量及的概念,防止無用數據包一直存在網絡中。一般每經過路由器時減一,因此通過 TTL 可以算出數據包到達目的地所經過的路由器個數。“協議”域表示創建該數據包的高級協議類型。如 1 表示 ICMP 協議,6 表示 TCP 協議,17 表示 UDP 協議等。IP 數據包為簡化數據轉發時間,僅采用頭校驗的方法,數據正確性由高層協議保證。


??????? ICMP(網間網控制報文協議)協議 ? ?? 應用廣泛。在此僅給出最常見的回應請求與應答報文格式, 用戶命令 ping 便是利用此報文來測試信宿機的可到達性。 報文格式如下圖所示:

?????? 類型 0 為回應應答報文,8 為回應請求報文。整個數據包均參與檢驗。注意 ICMP 封裝在 IP 數據包里傳送。

??????? TCP 是面向連接的可靠數據傳輸協議,因此比較復雜,在此僅作簡單介紹。“序號”指數據在發送端數據流中的位置。“確認號”指出本機希望下一個接收的字節的序號。與 IP 校驗不同的是 TCP,UDP 校驗采用偽頭標加整個報文一同校驗的方法。TCP 協議工作原理另行介紹。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255139.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255139.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255139.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【開源程序(C++)】獲取bing圖片并自動設置為電腦桌面背景

眾所周知,bing搜索網站首頁每日會更新一張圖片,張張漂亮(額,也有一些不合我口味的),特別適合用來做電腦壁紙。 我們想要將bing網站背景圖片設置為電腦桌面背景的通常做法是: 上網,搜…

UIProgressView 圓角

里面外面都變成圓角 不用圖片 直接改變layer 重點是里面外面都是圓角哦 for (UIImageView * imageview in self.progress.subviews) { imageview.layer.cornerRadius 5; imageview.clipsToBounds YES; } 轉載于:https://www.cnblogs.com/huoran1120/p/5563991.html

HALCON示例程序holes.hdev孔洞提取

HALCON示例程序holes.hdev孔洞提取 示例程序源碼(加注釋) 關于顯示類函數解釋 read_image (Image, ‘progres’) get_image_size (Image, Width, Height) dev_close_window () dev_open_window (0, 0, Width, Height, ‘white’, WindowID) dev_set_co…

給實例動態增加方法VS給類動態增加方法

一、給實例綁定方法 object.method MethodType(method,object) >>>class Badbrains(): pass >>>def mocking(self): print(Brain\s Mocking) >>>b Badbrains() >>>from types import MethodType >>>b.mocking MethodType(moc…

一句DOS命令搞定文件合并

用Dos的copy命令實現: copy a.jsb.jsc.js abc.js /b 將 a.js b.js c.js 合并為一個 abc.js,最后的 /b 表示文件為二進位文件,copy 命令的其它參數可以在 cmd 里輸入 copy /? 學習 舉例:如果想要合并多個js文件到某個目錄下&#…

DataTables warning: Requested unknown parameter '0' from the data source for row '0'

問題&#xff1a;DataTables warning: Requested unknown parameter 0 from the data source for row 0 代碼&#xff1a; <script type"text/javascript">var data [{"Name":"UpdateBootProfile","Result":"PASS",&…

HALCON示例程序hull.hdev區域提取與凸度篩選

HALCON示例程序hull.hdev區域提取與凸度篩選 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 read_image (Hull, ‘hull’) get_image_size (Hull, Width, Height) dev_close_window () dev_open_window (0, 0, Width, Height, ‘black’, WindowID) dev_di…

我與Linux系統的交集

2019獨角獸企業重金招聘Python工程師標準>>> 一、初識Linux 第一次知道Linux還是在我剛進大學的時候&#xff0c;從開始聊QQ、玩斗地主的時候起我就是用的Windows&#xff0c;從Windows2000一直到Windows7&#xff0c;當時我已經完全習慣了使用Windows&#xff0c;而…

squid白名單

http_access deny all #取消注釋 http_access allow all --> http_access allow xxx_custom_ip#添加系統服務器IP白名單 acl xdaili_custom_ip src 60.191.4.xxx/32 acl xdaili_custom_ip src 139.196.210.xxx/32 acl xdaili_custom_ip src 139.196.172.xxx/32 acl xdail…

HALCON示例程序IC.hdev通過電路板元器件定位識別

HALCON示例程序IC.hdev通過電路板元器件定位識別 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_close_window () read_image (Image, ‘ic’) get_image_size (Image, Width, Height) dev_open_window (0, 0, Width, Height, ‘black’, WindowID) de…

IP頭、TCP頭、UDP頭詳解以及定義

一、MAC幀頭定義 /*數據幀定義&#xff0c;頭14個字節&#xff0c;尾4個字節*/ typedef struct _MAC_FRAME_HEADER { char m_cDstMacAddress[6]; //目的mac地址 char m_cSrcMacAddress[6]; //源mac地址 short m_cType;      //上一層協議類型&#xff0c;如…

關于iOS 3D touch 指紋驗證的隨筆

file:///Users/OWen/Desktop/3DTouch.png 隨著iOS系統不斷的更新迭代&#xff0c;蘋果總會推出一些新的功能&#xff0c;今天就研究了一下iOS8之后推出的指紋驗證的功能&#xff0c;然后寫了一個小demo&#xff0c;與君分享。。 上demo&#xff1a; 1&#xff1a;首先導入一個…

HALCON示例程序inner_rectangle1.hdev木板有效區域提取

HALCON示例程序inner_rectangle1.hdev木板有效區域提取 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_update_window (‘off’) dev_update_var (‘off’) dev_update_pc (‘off’) read_image (Image, ‘wood_knots’) get_image_size (Image, Width…

vsCode ext install 不工作

vsCode 擴展商店 不可用 ext 不可用 ext install eamodio.gitlens 1、搜索離線插件https://marketplace.visualstudio.com/vscode 2、插件離線插件模板https://marketplace.gallery.vsassets.io/_apis/public/gallery/publisher/marketplace/extension/${extension name}/${ver…

遞歸實現 十進制轉換其他進制(2-16)

1 def to_str(n, base): 2 convert_string "0123456789ABCDEF" 3 if n < base: 4 return convert_string[n] 5 else: 6 return to_str(n / base, base) convert_string[n % base] 7 8 print to_str(168, 8) 轉載于:https://www.cn…

在UltraEdit的查找和替換中使用正則表達式 (轉)

很多朋友都用過或者正在用UltraEdit&#xff0c;這個編輯器陪伴我也好幾年了&#xff0c;從很多地方影響著我寫代碼的快捷鍵習慣&#xff0c;Ultraedit提供了非常豐富的編輯功能&#xff0c;其中非常重要的查找和替換功能一定大家都用過&#xff0c;Ultraedit提供的查找替換功能…

基本 TCP 套接字編程講解

基于 TCP 的套接字編程的所有客戶端和服務器端都是從調用socket 開始&#xff0c;它返回一個套接字描述符。客戶端隨后調用connect 函數&#xff0c;服務器端則調用 bind、listen 和accept 函數。 使用套接口客戶機服務器的的例子 sever.c #include <stdio.h> #include &…

HALCON示例程序inspect_bga.hdev測量bga焊點缺陷

HALCON示例程序inspect_bga.hdev測量bga焊點缺陷 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 read_image (Image, ‘bga_14x14_model’) get_image_pointer1 (Image, Pointer, Type, Width, Height) dev_update_off () dev_close_window () dev_open_win…

怎樣屏蔽微信朋友圈視頻?局域網如何禁止員工看朋友圈視頻?

上班時間刷刷朋友圈&#xff0c;一眨眼半小時就過去了。不但會影響工作效率&#xff0c;而且朋友圈的視頻會占用大量的帶寬。所以對企業管理人員來說&#xff0c;很多時候需要禁止員工在工作時段刷朋友圈。但是行政手段要和技術手段配合&#xff0c;才可以發揮真正的作用。本文…

cf414B(dp)

題目鏈接&#xff1a;http://codeforces.com/problemset/problem/414/B 題意&#xff1a;定義所有元素是其前一個元素的倍數的數列為good sequence&#xff0c;給出 n, 和 k&#xff0c;求1....n組成的長度為k的good sequence 的數目&#xff1b; 思路&#xff1a;dp 用dp[i][j…