網路協議頭

2021-09-27 11:24:24 字數 4454 閱讀 8316

標頭檔案:

/usr/include/linux/ip.h

結構體:

struct

iphdr

;

字段說明:

version版本(4位),目前的協議版本號是4,因此ip有時也稱作ipv4。

ihl首部長度(4位),首部長度指的是ip層頭部佔32 bit字的數目(也就是ip層頭部包含多少個4位元組 – 32位),包括任何選項。由於它是乙個4位元字段,因此首部最長為60個位元組。普通ip資料報(沒有任何選擇項)欄位的值是5 <==> 5 * 32 / 8 = 5 * 4 = 20 bytes。

tos服務型別字段(8位),服務型別(tos)字段包括乙個3 bit的優先權子欄位(現在已被忽略),4 bit的tos子字段和1 bit未用位但必須置0.4 bit的tos子欄位分別代表:最小時延,最大吞吐量,最高可靠性和最小費用。4 bit中只能設定其中1 bit。如果所有4 bit均為0,那麼就意味著是一般服務。

tot_len總長度字段(16位)是指整個ip資料報的長度,以位元組為單位。利用首部長度欄位和總長度字段,就可以知道ip資料報中資料內容的起始位置和長度。由於該字段長16位元,所以ip資料報最長可達65535位元組。總長度欄位是ip首部中必要的內容,因為一些資料鏈路(如乙太網)需要填充一些資料以達到最小長度。儘管乙太網的最小幀長為46位元組,但是ip資料可能會更短。如果沒有總長度字段,那麼ip層就不知道46位元組中有多少是ip資料報的內容。

id標識字段(16位)唯一地標識主機傳送的每乙份資料報。通常每傳送乙份報文它的值就會加1。

frag_offfrag_off域的低13位 – 分段偏移(fragment offset)域指明了該分段在當前資料報中的什麼位置上。除了乙個資料報的最後乙個分段以外,其他所有的分段(分片)必須是8位元組的倍數。這是8位元組是基本分段單位。由於該域有13個位,所以,每個資料報最多有8192個分段。因此,最大的資料報長度為65536位元組,比iphdr->tot_len域還要大1。iphdr->frag_off的高3位:

1、位元0是保留的,必須為0。

2、位元1是「不分片」(df – don』t fragment)標誌,如果將這一位元置1,ip將不對資料報進行分片,這時如果有需要進行分片的資料報到來,會丟棄此資料報並傳送乙個icmp差錯報文給起始端。

3、位元2是"更多分片"(mf – more fragment)標誌。除了最後一片外,其他每個組成資料報的片都要把該位元置1。

ttl: ttl(time-to-live)8位,生存時間字段設定了資料報可以經過的最多路由器數。它指定了資料報的生存時間。ttl的初始值由源主機設定(通常為32或64),一旦經過乙個處理它的路由器,它的值就減去1。當該字段的值為0時,資料報就被丟棄,並傳送icmp報文通知源主機。ttl(time to live)域是乙個用於限制分組生存期的計數器。這裡的計數時間單位為秒,因此最大的生存期為255秒。在每一跳上該計數器必須被遞減,而且當資料報在一台路由器上排隊時間較長時,該計數器必須被多倍遞減。在實踐中,它只是跳計數器,當它遞減到0的時候,分組被丟棄,路由器給源主機傳送乙個警告分組。此項特性可以避免資料報長時間地逗留在網路中,有時候當路由表被破壞之後,這種事情是有可能發生的。

protocol協議字段(8位)根據它可以識別是哪個協議向ip傳送資料。當網路層組裝完成乙個完整的資料報之後,它需要知道該如何對它進行處理。協議(protocol)域指明了該將它交給哪個傳輸程序。tcp是一種可能,但是udp或者其他的協議也是可能的。

check首部檢驗和字段(16位)是根據ip首部計算的檢驗和碼。它不對首部後面的資料進行計算。icmp,igmp,udp和tcp在它們各自的首部中均含有同時覆蓋首部和資料檢驗和碼。為了計算乙份資料報的ip檢驗和,首先把檢驗和字段置為0.然後,對首部中每個16 bit進行二進位制反碼求和 (整個首部看成是由一串16 bit的字組成),結果存在檢驗和字段中。當收到乙份ip資料報後,同樣對首部中每個16 bit進行二進位制反碼的求和。由於接收方在計算過程中包含了傳送方存在首部中的檢驗和,因此如果首部在傳輸過程中沒有發生任何差錯,那麼接收方計算的結果應該為全1。如果結果不是全1(即檢驗和錯誤),那麼ip就丟棄收到的資料報。但是不生成差錯報文,由上層去發現丟失的資料報並進行重傳。

saddr32位源ip位址。

daddr32位目的ip位址。

補充:

ip首部長度=(ihl * 4)位元組。

標頭檔案:

/usr/include/netinet/tcp.h

結構體:

struct

tcphdr

;

字段說明:

source16位源埠號。

dest16位目的埠號。

seq表示此次傳送的資料在整個報文段中的起始位元組數。序號是32 bit的無符號數。為了安全起見,它的初始值是乙個隨機生成的數,它到達32位最大值後,又從零開始。

ack_seq指定的是下乙個期望接收的位元組,而不是已經正確接收到的最後乙個位元組。

dofftcp頭長度,指明了在tcp頭部包含多少個32位的字。此資訊是必須的,因為options域的長度是可變的,所以整個tcp頭部的長度也是變化的。從技術上講,這個域實際上指明了資料部分在段內部的其起始位址(以32位字作為單位進行計量),因為這個數值正好是按字為單位的tcp頭部的長度,所以二者的效果是等同的。

res1為保留位。

res2為保留位。

fin被用於釋放乙個連線,它表示傳送方已經沒有資料要傳輸了。

syn同步序號,用來發起乙個連線。syn位被用於建立連線的過程。在連線請求中,syn=1;ack=0表示該資料段沒有使用捎帶的確認域。連線應答捎帶了乙個確認,所以有syn=1;ack=1。本質上syn位被用來表示connection request和connection accepted,然而進一步用ack位來區分這兩種情況。

rst用於重置乙個已經混亂的連線,之所以會混亂,可能是由於主機崩潰,或者其他的原因。該位也可以被用來拒絕乙個無效的資料段,或者拒絕乙個連線請求。一般而言,如果你得到的資料段設定了rst位,那說明你這一端有了問題。

psh接收方在收到資料後應立即請求將資料遞交給應用程式,而不是將它緩衝起來直到整個緩衝區接收滿為止(這樣做的目的可能是為了效率的原因)。

ack被設定為1表示tcphdr->ack_seq是有效的。如果ack為0,則該資料段不包含確認資訊,所以tcphdr->ack_seq域應該被忽略。

urg緊急指標有效。

window是16位滑動視窗的大小,單位為位元組,起始於確認序列號字段指明的值,這個值是接收端正期望接收的位元組數,其最大值是63353位元組。tcp中的流量控制是通過乙個可變大小的滑動視窗來完成的。window域指定了從被確認的位元組算起可以接收的多少個位元組。window = 0也是合法的,這相當於說,到現在為止多達ack_seq-1個位元組已經接收到了,但是接收方現在狀態不佳,需要休息一下,等一會兒再繼續接收更多的資料,謝謝。以後接收方可以通過傳送乙個同樣ack_seq但是window不為0的資料段,告訴傳送方繼續傳送資料段。

check是檢驗和,覆蓋了整個的tcp報文段,這是乙個強制性的字段,一定是由傳送端計算和儲存,並由接收端進行驗證。

urg_ptr用來指示緊急資料在當前資料段中的位置,它是乙個相對於當前序列號的位元組偏移值。這個設施可以代替中斷資訊。

補充:

tcp首部長度=(doff * 4)位元組。

標頭檔案:

/usr/include/linux/udp.h

結構體:

struct

udphdr

;

字段說明:

source16位源埠號。

dest16位目的埠號。

len表示此次傳送的資料報的長度=首部長度+資料長度。

check檢驗和,校驗的是首部和資料的總的校驗和。

補充:

udp首部長度=8位元組。

網路 IP協議頭格式

網路層 在複雜的網路環境中確定乙個合適的路徑 路由選擇 網路層的目的是實現倆個端系統之間的資料透明傳輸,具體工能包括定址,路由選擇,連線的建立,保持和終止。ip協議 基本概念 節點 主機和路由器的統稱 ip協議的功能 定址和路由 根據對方的ip位址,尋找出最佳的路徑傳輸資訊 傳遞服務 不可靠 ip協...

IP協議頭格式

ip internet protocol,網際網路協議 是osi第三層 網路層協議,本節僅以ipv4版本為例進行介紹。ip協議也是乙個無連線的協議,主要就是負責在主機間定址,並為資料報設定路由,在交換資料前它並不建立會話。因為它不保證正確傳遞。另一方面,資料在被收到時,ip不需要收到確認,所以它是不...

HTTP協議資訊頭

accept charset 瀏覽器告訴其他伺服器它採用的字符集 accept encoding 瀏覽器告訴伺服器所支援的壓縮格式 accept language 瀏覽器告訴伺服器所採用的語言 host 想訪問伺服器的哪台主機 if modified since 瀏覽器快取資料的時間 referer...