linux網絡編程之通信協議格式

好文參考:《網路傳輸的三張表:MAC地址表,ARP緩存表和路由表》http://www.cnblogs.com/clovn/p/4911212.html

(1)數據包封裝

? ? ? ? ? 傳輸層及其一下的機制由內核決定,主要負責通訊的具體細節;應用層由用戶進程提供,主要負責對通訊數據的含義進行解釋。應用層數據通過協議棧發送到網絡上,為了保證數據能夠被接收,需要在每層協議之前加一個數據首部作為標識,我們稱之為封裝,具體格式如下

? ? ? ?? ? ? ? ??

(2)以太網幀格式

? ? ? ? ? ? 1)?在鏈路層中,傳輸的數據我們稱為幀,具體的幀格式如下圖所示:

? ?

? ? ? ? ?其中:圖中的目的地址和原地址指的是網卡的硬件地址(MAC地址,即網卡編號,唯一),CRC為校驗位

? ? ? ? ? 2)ARP數據報格式:獲取下一跳(下一個路由節點)的MAC,實現數據傳遞。

? ? ? ? ? ? ? 1>在網路傳輸的過程中,只有知道目標的MAC地址(未知)和發送數據起點的MAC地址(已知),才能進行正常的數據傳輸。如果得知目標的MAC地址,通過ARP發送數據請求和數據應答即可得到目標的MAC地址,ARP數據報的格式如下:

? ? ? ? ? ? ??

? ? ? ? ? ? ? 2>?具體的實現流程:

? ? ? ? ? ? ? ? ?在數據過程中,首先需要獲得目標的MAC地址,這就需要使用ARP協議了。在每臺主機中都有一個ARP緩存表,其中記錄了主機IP和MAC地址的對應關系。如果AB之間想要通信,A首先會檢查自己的ARP緩存表中是否有B的IP地址和對應MAC地址的對應關系。如果有,則會將B的IP地址和對應的MAC地址填到ARP數據報中;如果沒有,則A會發一個ARP請求給B,此時交換機接收到這個數據幀(廣播幀),將數據以非接口的形式廣播出去。此時B收到這個數據幀,會檢查是否和自己的IP相同,如果不同,則忽略信息,如果相同,則會將A的IP和MAC地址的對應關系記錄在自己的ARP緩存表中,同時將給A發送一個ARP應答數據(拆包和組包),其中包括B的MAC地址。A收到B的應答數據后,會將B的IP地址和MAC地址填入到自己的ARP緩存地址中。

? ? ? ? ? ? ? ? 在網路傳輸中,交換機在收到數據幀之后,會將數據幀中的MAC地址和端口號記錄在MAC表中,然后在表中尋找有沒有數據幀目標的MAC地址信息。如果有,則直接將數據從表中的接口傳遞給下一個MAC地址(單播);如果沒有,則將數據以非接口的形式發送出去(稱為廣播)(現在的路由器一般都包含了交換機在內)。?

? ? ? ? ? ? ? ?通過路由節點的不斷拆包和組包,直到找到封裝在網絡層IP協議中的目的地址.數據包在不斷傳遞的過程中,最長的生命周期,我們稱之為TTL

? ? ? ? ? ? 3>IP段格式:數據前面的那段我們稱為IP首部(固定部分+可變部分)

? ? ? ? ??

? ? ? ? ?其中:4位版本號:IPV4/IPV6? ? ?4位首部長度:數據首部的最大字節數(最小為5,最大為15,以4字節為單位)

? ? ? ? ? ? ? ? ? ? ? 16位總長度:數據報的最大長度為2^16-1=65535字節(首部和數據之和長度)

? ? ? ? ? ? ? ? ? ? ? 13位片偏移:用于傳輸較大的數據,切片時記錄片的編號(片偏移以8字節為偏移單位)

? ? ? ? ? ? ? ? ? ? ? 8位生存時間:為起始主機到目標主機之間最多可存在255個路由節點(最多有255跳)

? ? ? ? ? ? ? ? ? ? ? 32位源IP地址:發送數據端的IP? ? ? ? ? ? ? 32位目的IP地址:接收數據端的IP

? ? ? ? ? ? ? ?4>UDP數據報格式

? ? ?? ? ? ??

? ? ? ?由于在一個主機中,不同的應用對應于不用的進程,也就是所謂的端口號。因此通過指定兩個端口號,就可以指定兩個應用進行通信,從而不會導致數據傳輸錯亂。

? ? ? ? ? 5>TCP數據報格式

? ? ? ? ? ? ? ?

? ? ? ? ? 和UDP相比,TCP數據報格式相對來說比較復雜,除了相對的端口號,還有序號和確認序號,用來重構數據使用。

?

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

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

相關文章

88. 合并兩個有序數組 golang

88. 合并兩個有序數組 給你兩個有序整數數組 nums1 和 nums2,請你將 nums2 合并到 nums1 中,使 nums1 成為一個有序數組。 說明: 初始化 nums1 和 nums2 的元素數量分別為 m 和 n 。 你可以假設 nums1 有足夠的空間(空間大小大于或等于 m …

linux網絡編程之Socket編程

(1)socket套接字 1)在linux環境下,socket用于表示進程間網絡通信的特殊文件類型,其本質是內核借助緩沖區形成的偽文件(不占磁盤空間,除此之外還有二進制文件,管道,字符文…

Linux操作系統之簡易實現server/client

1.首先將出錯處理封裝成函數,具體封裝思想:是在底層函數的基礎上將首字母大寫(方便在編程中查找函數文件的manpage,而不需要使用命令,直接用shiftk),然后調用底層庫函數并考慮出錯處理,具體函數如下&#x…

75. 顏色分類 golang

https://leetcode-cn.com/problems/sort-colors/solution/75-yan-se-fen-lei-golang-by-hodgekou/ Me func sortColors(nums []int) {sort.Ints(nums) }tips package mainimport ("fmt""sort" )//定義interface{},并實現sort.Interface接口的三個方法 ty…

linux網絡編程之TCP三次握手和四次揮手

1.在TCP連接的過程中,有三個階段,分別是建立連接,傳遞數據和斷開連接,通訊時序圖如下所示: 2.結合TCP數據報格式分析建立連接的三次握手 1)首先客戶端發送一個帶有SYN標志的TCP報文給服務器端,詢問服務器端…

451. 根據字符出現頻率排序golang

官解 func frequencySort(s string) string {charMap : make(map[rune]int)arr : make([]string, len(s))for _,c : range s {charMap[c]}for k,v : range charMap {arr[v - 1] strings.Repeat(string(k), v)}r : ""for _,c : range arr {r c r}return r }自定義排…

linux網路編程之多進程并發服務器

1)使用多進程并發服務器考慮的因素: (1)父進程描述最大文件描述符的個數(父進程需要關閉accept返回的新文件描述符) (2)系統內可創建進程的個數(與內存大小相關&#xff…

69. x 的平方根 golang

Me https://leetcode-cn.com/problems/sqrtx/submissions/ func mySqrt(x int) int {return int(math.Sqrt(float64(x))) }

linux網路編程之多線程并發服務器

1)在使用進程模型開發服務器過程中考慮以下問題 (1)調整進程內最大文件描述符上限 (2)線程如有共享,考慮線程同步 (3)客戶端線程退出時,做退出處理(線程分離&…

744. 尋找比目標字母大的最小字母 golang

官解 func nextGreatestLetter(letters []byte, target byte) byte {idx : 0for i : 0; i < len(letters); i {if letters[i] > target {idx ibreak}}return letters[idx] }Me 這個題答得很差勁&#xff0c;可能有點累 func nextGreatestLetter(letters []byte, target…

linux網路編程之TCP狀態轉換及端口復用

&#xff08;1&#xff09;TCP狀態轉換圖 其中圖中分為三種狀態&#xff1a;實線代表的主動發起連接&#xff0c;虛線代表的被動發起連接&#xff0c;細實線代表的可以雙向發起連接的狀態。 主動發起連接方狀態變化&#xff1a;1&#xff09;主動發起連接的一方發送SYN標志位&…

153. 尋找旋轉排序數組中的最小值 golang

153. 尋找旋轉排序數組中的最小值 golang Me func findMin(nums []int) int {if len(nums) < 2 {return nums[0]}i, j : 0, 1for j < len(nums) {if nums[i] < nums[j] {ij} else {return nums[j]}}return nums[0] }

linux網絡編程之多路I/o轉接服務器select

(1)多路IO轉接服務器也叫做多任務IO服務器&#xff0c;其主要思想是不再由程序自己監聽客戶端連接&#xff0c;取而代之的是由內核替應用程序監視文件&#xff0c;具體實現模型如圖所示&#xff1a; 當客戶端請求和服務器連接時&#xff0c;內核接收到連接指令&#xff0c;告訴…

linux網絡編程之多路I/O轉接服務器poll函數

&#xff08;1&#xff09;poll函數 頭文件&#xff1a;#include<poll.h> int poll(struct pollfd*fds, nfds_t nfds,int timeout); struct pollffd{ int fd;//文件描述符 short events;//監控的事件 short revents;//監控事件中滿足條件返回的事情 }&#xff1…

540. 有序數組中的單一元素 golang

540. 有序數組中的單一元素 golang func singleNonDuplicate(nums []int) int {if len(nums) < 1 {return nums[0]}i : 0for i < len(nums) - 1 {if nums[i] ! nums[i1] {return nums[i]} else {i2}}return nums[i] }

C/C++構造及析構順序及變量的生命周期

&#xff08;1&#xff09;變量的構造及析構順序 1&#xff09;在全局范圍內定義的對象&#xff08;即在所有函數之外定義的對象&#xff09;&#xff0c;它的構造函數在文件中的所有函數&#xff08;包括main函數&#xff09;執行之前調用。如果一個程序中有多個文件&#xff…

34. 在排序數組中查找元素的第一個和最后一個位置 golang

34. 在排序數組中查找元素的第一個和最后一個位置 https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/submissions/ Me func searchRange(nums []int, target int) []int {result : make([]int, 2)result[0] -1result[1] -1for …

C/C++繼承與派生

&#xff08;1&#xff09;派生類的訪問屬性 1&#xff09;public繼承&#xff1a;派生類中&#xff1a;可以訪問基類的public和protect變量&#xff0c;不可以訪問基類的private變量 派生類外&#xff1a;可以訪問基類的public變量&#xff0c;不能訪問基類的private變量 2&am…

C/C++之string類小結

&#xff08;1&#xff09;C字符串和C字符串的轉換 C提供了三種方法可以將C字符串轉化為C字符串&#xff0c;分別是data(),c_str(),copy()成員函數來實現。 1&#xff09;data()是以字符數組的形式返回字符串內容&#xff0c;但并不添加‘\0’&#xff1b; 2&#xff09;c_str(…

2.兩數相加 golang

測試用例1500多個&#xff0c;考慮的情況非常多 測試用例 [0] [1] [2] [3,4,2] [5,0] [2] [1] [0] [9,8] [0] [4,6,5] [5,0] [1] [9] [0] [0,9] [2] [8,0,7] [0,1] [3] [0,1]func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {result : &List…