包含在/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 :用途暫時不明