資料報的可變部分的設計

2021-10-25 10:19:39 字數 1965 閱讀 6494

ip資料報,其可變部分可變是如何實現的?

假設我們在網路通訊過程中使用的資料緩衝區,緩衝區包括乙個num, size和data欄位,分別標識資料的塊號,長度和傳輸的資料,我們設計思路如下:

定長資料緩衝區,設定乙個足夠大小maxsize的資料緩衝區。

設定乙個指向實際資料的指標,每次使用時,按照資料的長度動態的開闢資料緩衝區的空間。我們從實際場景中應用來考慮他們的優劣,主要考慮點有:緩衝區空間的開闢,釋放和訪問.

#define max_size 4096 

//4k

typedef

struct data_buffer

data_buffer;

//sizeof(int)+sizeof(size)+sizeof(char)*maxsize;

使用定長陣列作為資料緩衝區,為了避免造成緩衝區溢位,陣列設計是大開小用,而實際使用過程中,達到maxsize長度的資料很少,那麼多數情況下,緩衝區的大部分空間都浪費了,也會造成不必要的流量浪費。

但是使用過程很簡單,資料空間的開闢和釋放簡單,無需程式設計師考慮額外的操作。

如果你將上面的長度為maxsize的定長陣列換為指標,每次使用時動態的開闢cursize 大小的空間,那麼免造成 maxsize - cursize空間的浪費,只浪費了乙個指標域的空間。而申請的堆空間相對於棧空間來說大得多得多。

//#define max_size 4096 //4k

typedef

struct data_buffer

data_buffer;

//sizeof(int)+sizeof(size)+sizeof(char *);

//但需要申請堆空間和釋放

intmain()

pbuff->size = cursize;

//假設cursize為傳送資料長度

pbuff->data =

(char*)

malloc

(sizeof

(char

)*cursize);if

(pbuff->data ==

null

)free

(pbuff->data)

;free

(pbuff)

; pbuff =

null

;}

使用指標結果作為緩衝區,只多使用了乙個指標大小的空間,無需使用maxsize 長度的陣列,不會造成空間的大量浪費。但那是開闢空間時,需要額外開闢資料域的空間,施放時候也需要顯示釋放資料域的空間,但是實際使用過程中,往往在函式中開闢空間,然後返回給使用者指向 struct point_buffer 的指標,這時候我們並不能假定使用者了解我們開闢的細節,並按照約定的操作釋放空間,因此使用起來多有不便,甚至造成記憶體洩漏。定長陣列使用方便,但是卻浪費空間。指標形式只多使用了乙個指標的空間,不會造成大量空間分浪費,但是使用起來需要多次分配,多次釋放,那麼有沒有一種實現方式既不浪費空間,又使用方便的呢?

#define max_size 4096 

//4k

typedef

struct data_buffer

data_buffer;

//sizeof(int)+sizeof(size)

//使用時,只需要開闢一次空間即可

intmain()

pbuff->num =1;

pbuff->size = n;

memcpy

(pbuff->data,

"sqhlll"

, n)

;free

(pbuff)

; pbuff =

null

;return0;

}

資料報和資料報間的聯絡和差別

請先參看文章後邊pdu的定義 datagram 資料報 在 網路層中的傳輸單元 例如ip 乙個datagram可能被壓縮成乙個或幾個packets,在資料鏈路層中傳輸。packet 資料報 封裝 和傳輸 的基本單元,它穿越網路層和資料鏈路層的分解面。通常乙個packet對映成乙個frame,但也有例...

IP資料報的格式

ip資料報的格式如下 這裡只討論ipv4 該圖出自 tcpip 圖 36.8.ip資料報格式 ip資料報的首部長度和資料長度都是可變長的,但總是4位元組的整數倍。對於ipv4,4位版本欄位是4。4位首部長度的數值是以4位元組為單位的,最小值為5,也就是說首部長度最小是4x5 20位元組,也就是不帶任...

廣播資料報的接收

對資料報接收方來說,資料報的過濾有兩層,首先是mac位址的過濾,一般只接收目標mac位址為自身mac位址和全1的廣播位址 支援組播的話,還有組播mac位址 接下來是ip位址過濾,目標ip位址為本機的,或者為廣播ip幀的才會往上面 tcp udp 傳。ip廣播有兩種,一種是有限廣播 目標ip為255....