TCP雖然是面向位元組流的,但是tcp傳送的資料單元卻是封包段,一個封包段分為首部和資料兩部分,幾乎TCP所有功能都從首部來展現,下面我們來詳細的剖析下它的首部.

(1):源端口與目标端口:分别寫入源端口号和目标端口号.
(2):32位序列号:也就是我們tcp三次握手中的seq,表示的是我們tcp資料段發送的第一個位元組的序号,範圍[0,2^32 - 1],例如,我們的seq = 201,攜帶的資料有100,那麼最後一個位元組的序号就為300,那麼下一個封包段就應該從301開始.
(3):32位确認序列号:也就是ack(假設為y),它的值是seq+1,表示的意義是y之前的資料我都收到了,下一個我期望收到的資料是y.也就是我回過去的seq = y.
(4):首部長度:占4位.也叫資料偏移,因為tcp中的首部中有長度不确定的字段.
(5):URG:緊急指針标志位,當URG=1時,表明緊急指針字段有效.它告訴系統中有緊急資料,應當盡快傳送,這時不會按照原來的排隊序列來傳送.而會将緊急資料插入到本封包段資料的最前面.
(6):ACK:當ACK=1時,我們的确認序列号ack才有效,當ACK=0時,确認序号ack無效,TCP規定:所有建立連接配接的ACK必須全部置為1.
(7):PSH:推送操作,很少用,沒有了解.
(8):RST:當RST=1時,表明TCP連接配接出現嚴重錯誤,此時必須釋放連接配接,之後重新連接配接,又叫重置位.
(9):SYN:同步序列号标志位,tcp三次握手中,第一次會将SYN=1,ACK=0,此時表示這是一個連接配接請求封包段,對方會将SYN=1,ACK=1,表示同意連接配接,連接配接完成之後将SYN=0
(10):FIN:在tcp四次揮手時第一次将FIN=1,表示此封包段的發送方資料已經發送完畢,這是一個釋放連結的标志.
(11):16位視窗的大小:win的值是作為接收方讓發送方設定其發送視窗大小的依據.
(13):緊急指針:隻有當URG=1時的時候,緊急指針才有效,它指出緊急資料的位元組數.