struct tcphdr


包含在/usr/src/linux/include/linux/tcp.h

struct tcphdr {
    __be16 source;
    __be16 dest;
    __be32 seq;
    __be32 ack_seq;
#if defined(__LITTLE_ENDIAN_BITFIELD)
    __u16   res1:4,
            doff:4,
            fin:1,
            syn:1,
            rst:1,
            psh:1,
            ack:1,
            urg:1,
            ece:1,
            cwr:1;
#elif defined(__BIG_ENDIAN_BITFIELD)
    __u16   doff:4,
            res1:4,
            cwr:1,
            ece:1,
            urg:1,
            ack:1,
            psh:1,
            rst:1,
            syn:1,
            fin:1;
#else
#error "Adjust your <asm/byteorder.h> defines"
#endif
    __be16 window;
    __be16 check;
    __be16 urg_ptr;
};

tcphdr->source

       16位源端口

tcphdr->dest

       16位目的端口

tcphdr->seq

       表示此次發送的數據在整個報文段中的起始字節數。序號是32位bit的無符號數。為了安全起見,它的初始值是一個隨機生成的數,它到達32位最大值后,又從零開始。

tcphdr->ack_seq

       指定的是下一個期望接收的字節,而不是已經正確接收的最后一個字節。

tcphdr->doff

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

 

tcphdr->res1

       保留位

tcphdr->window

       16位滑動窗口大小,單位為字節,起始於確認序號字段指明的值,這個值是接收端期望接收的字節數,其最大值為63353字節。

       TCP中的流量控制是同一個可變大小的滑動窗口來完成的。window域指定了從被確認的字節算起可以接收多少個字節。window=0也是合法的,相當於說到現在為止多達ack_seq-1個字節已經接收到了,但是接收放現在狀態不佳,需要休息一下,等一會再接收更多的數據。以后接收方可以通過發送一個同樣ack_seq但是window不為0的數據段,告訴發送方繼續發送數據段。

 

tcphdr->check

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

 

tcphdr->urg_ptr

       這個域被用來指示緊急數據在當前數據段中的為止,它是一個相當於當前序列號的字節偏移量。這個設置可以代替中斷信息。

 

fin、syn、rst、psh、ack、urg為6個標志位,含義如下:

       tcphdr->fin   :釋放一個連接,它表示發送方已經沒有數據要傳輸了。

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

       tcphdr->ret   :該位用於重置一個混亂的連接,之所以混亂,可能是因為主機崩潰或者其他原因。該位也可以被用來拒絕一個無效的數據段,或者拒絕一個連接請求,一般而言,如果你得到的數據段設置了rst位,說明你這一端有了問題。

       tcphdr->ack  :ack位被設置為1表示tcphdr->ack_seq是有效的,如果ack為0,則表示該數據段不包含確認信息,所以tcphdr->ack_seq域應該被忽略。

       tcphdr->urg  :緊急指針有效

       tcphdr->ece  :用途暫時不明

       tcphdr->cwr :用途暫時不明  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM