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....