tcphdr結構


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

 1 struct tcphdr {  2  __be16 source;  3  __be16 dest;  4  __be32 seq;  5  __be32 ack_seq;  6 #if defined(__LITTLE_ENDIAN_BITFIELD)
 7     __u16   res1:4,  8             doff:4,  9             fin:1, 10             syn:1, 11             rst:1, 12             psh:1, 13             ack:1, 14             urg:1, 15             ece:1, 16             cwr:1; 17 #elif defined(__BIG_ENDIAN_BITFIELD)
18     __u16   doff:4, 19             res1:4, 20             cwr:1, 21             ece:1, 22             urg:1, 23             ack:1, 24             psh:1, 25             rst:1, 26             syn:1, 27             fin:1; 28 #else
29 #error "Adjust your <asm/byteorder.h> defines"
30 #endif
31  __be16 window; 32  __be16 check; 33  __be16 urg_ptr; 34 };

 

 

     |----------------|----------------|-------------
     |     source     |     dest       |
     |----------------|----------------|
     |               seq               |
     |---------------------------------|
     |               ack_seq           | 20 Bytes
     |----|----|------|----------------|
     |doff|res1|      |     window     |
     |----|----|------|----------------|
     |     check      |     urg_ptr    |
     |----------------|----------------|-------------
     |             options             | 4 Bytes
     |---------------------------------|   

                    TCP頭 

tcphdr->source
    16位源端口號
tcphdr->dest
    16位目的端口號
tcphdr->seq
    表示此次發送的數據在整個報文段中的起始字節數。序號是32 bit的無符號數。為了安全起見,它的初始值是一個隨機生成的數,它到達32位最大值后,又從零開始。
tcphdr->
ack_seq
    指定的是下一個期望接收的字節,而不是已經正確接收到的最后一個字節。
tcphdr->doff
    TCP頭長度,指明了在TCP頭部包含多少個32位的字。此信息是必須的,因為options域的長度是可變的,所以整個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個標志位
    這6個位域已經保留了超過四分之一個世紀的時間而仍然原封未動,這樣的事實正好也說明了TCP的設計者們考慮的是多么的周到。它們的含義如下:
    tcphdr->fin fin位被用於釋放一個連接。它表示發送方已經沒有數據要傳輸了。
    tcphdr->syn 同步序號,用來發起一個連接。syn位被用於建立連接的過程。在連接請求中,syn=1; ack=0表示該數據段沒有使用捎帶的確認域。連接應答捎帶了一個確認,所以有syn=1; ack=1。本質上,syn位被用來表示connection request和connection accepted,然而進一步用ack位來區分這兩種情況。 
    tcphdr->rst 該為用於重置一個已經混亂的連接,之所以會混亂,可能是由於主機崩潰,或者其他的原因。該位也可以被用來拒絕一個無效的數據段,或者拒絕一個連接請求。一般而言,如果你得到的數據段設置了rst位,那說明你這一端有了問題。 
    tcphdr->psh 接收方在收到數據后應立即請求將數據遞交給應用程序,而不是將它緩沖起來直到整個緩沖區接收滿為止(這樣做的目的可能是為了效率的原因) 
    tcphdr->ack ack位被設置為1表示
tcphdr->ack_seq是有效的。如果ack為0,則該數據段不包含確認信息,所以,tcphdr->ack_seq域應該被忽略。 
    tcphdr->urg 緊急指針有效 
    tcphdr->ece 用途暫時不明
    tcphdr->cwr 用途暫時不明
    內核源代碼在函數tcp_transmit_skb()中建立tcp首部。

 


免責聲明!

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



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