源端口號(hào) (Source Port - 16 bits)
寄件人的門牌號(hào)。 發(fā)送數(shù)據(jù)的應(yīng)用程序在發(fā)送方電腦上的“門牌號(hào)”(端口號(hào))。就像快遞單上的寄件人地址,接收方知道這個(gè)數(shù)據(jù)是從哪個(gè)程序發(fā)來(lái)的,好把回信發(fā)給正確的“門牌號(hào)”。
目的端口號(hào) (Destination Port - 16 bits)
收件人的門牌號(hào)。 接收數(shù)據(jù)的應(yīng)用程序在接收方電腦上的“門牌號(hào)”(端口號(hào))。就像快遞單上的收件人地址,接收方的網(wǎng)絡(luò)設(shè)備(TCP/IP協(xié)議棧)根據(jù)這個(gè)門牌號(hào),把數(shù)據(jù)包交給正確的程序(比如瀏覽器)。
序列號(hào) (Sequence Number - 32 bits)
包裹的頁(yè)碼編號(hào)(從第幾頁(yè)開(kāi)始)。 想象你要郵寄一本很厚的書,不得不拆成很多個(gè)小包裹。這個(gè)編號(hào)告訴你當(dāng)前包裹里裝的是這本書的第幾頁(yè)(或者第幾塊數(shù)據(jù)), 接收方收到一堆零散的包裹(數(shù)據(jù)包)后,能按照這個(gè)編號(hào)把它們按順序拼回那本完整的書(原始數(shù)據(jù))。同時(shí),它也用于識(shí)別重復(fù)的包裹或丟失的包裹(編號(hào)不連續(xù)了)。
確認(rèn)號(hào) (Acknowledgment Number - 32 bits)
回執(zhí)單上的“下一張期待頁(yè)碼”。 當(dāng)收件人收到包裹并檢查無(wú)誤后,會(huì)發(fā)一個(gè)回執(zhí)給寄件人?;貓?zhí)上寫著:“我已收到到第 X 頁(yè)(確認(rèn)號(hào))為止的所有包裹了,請(qǐng)寄下一頁(yè)(X+1)給我吧!”,確認(rèn)對(duì)方已收到數(shù)據(jù),并告訴對(duì)方接下來(lái)希望收到哪個(gè)編號(hào)的數(shù)據(jù)包。這是 TCP 可靠傳輸?shù)暮诵臋C(jī)制!只有當(dāng) ACK 標(biāo)志位(見(jiàn)下面)為 1 時(shí),這個(gè)字段才有效。
數(shù)據(jù)偏移 (Data Offset / Header Length - 4 bits)
這張“發(fā)貨單”本身有多長(zhǎng)? 單位是 4 字節(jié)。比如,固定部分 20 字節(jié)就是 5 (20/4=5),如果加上選項(xiàng)部分,這個(gè)值會(huì)變大,告訴接收方,“發(fā)貨單”(TCP 首部)在哪里結(jié)束,后面真正的“貨物”(應(yīng)用層數(shù)據(jù))從哪里開(kāi)始。
保留 (Reserved - 6 bits)
預(yù)留的空白格子。 暫時(shí)沒(méi)用,填 0。留給未來(lái)可能的新功能,控制位 (Flags - 6 bits, 每個(gè)占1位) - 最重要的部分之一!這是 6 個(gè)獨(dú)立的開(kāi)關(guān)(標(biāo)志位),每個(gè)開(kāi)關(guān)要么開(kāi)(1)要么關(guān)(0),表示這個(gè) TCP 包的特殊意圖:
URG (Urgent):緊急開(kāi)關(guān)。 “包裹里有加急物品!” 當(dāng)它打開(kāi)(1)時(shí),表示這個(gè)數(shù)據(jù)包里有需要優(yōu)先處理的緊急數(shù)據(jù)。這時(shí)緊急指針字段(見(jiàn)下面)才有效?,F(xiàn)在用的比較少。
ACK (Acknowledgment):確認(rèn)開(kāi)關(guān)。 “這是個(gè)回執(zhí)單!” 當(dāng)它打開(kāi)(1)時(shí),表示這個(gè)包是用來(lái)確認(rèn)對(duì)方發(fā)來(lái)的數(shù)據(jù)的。這時(shí)確認(rèn)號(hào)字段才有效。絕大多數(shù) TCP 包(除了第一個(gè)握手包)這個(gè)開(kāi)關(guān)都是開(kāi)著的!
PSH (Push):推送開(kāi)關(guān)。 “別攢著了,趕緊送貨上門!” 發(fā)送方打開(kāi)(1),要求接收方收到這個(gè)包后,立刻把數(shù)據(jù)交給上層應(yīng)用程序,不要等緩沖區(qū)滿了再交。接收方打開(kāi)(1),表示當(dāng)前數(shù)據(jù)包里的數(shù)據(jù)是應(yīng)用程序要求立即上交的。
RST (Reset):重置開(kāi)關(guān)。 “出大問(wèn)題了!趕緊斷線重連!” 當(dāng)連接出現(xiàn)嚴(yán)重錯(cuò)誤(如端口未打開(kāi)、連接異常)時(shí),會(huì)發(fā)送一個(gè)打開(kāi)(1)RST 開(kāi)關(guān)的包,強(qiáng)制立即終止連接。
SYN (Synchronize):同步/連接請(qǐng)求開(kāi)關(guān)。 “你好!我想和你建立連接?!?在建立連接(三次握手)時(shí)使用。第一次握手(客戶端發(fā)起請(qǐng)求)和第二次握手(服務(wù)器響應(yīng))時(shí),這個(gè)開(kāi)關(guān)是開(kāi)著的(1)。它用來(lái)初始化序列號(hào)。
FIN (Finish):結(jié)束開(kāi)關(guān)。 “我的東西發(fā)完了,再見(jiàn)!” 用于正常關(guān)閉連接(四次揮手)。當(dāng)一方數(shù)據(jù)發(fā)送完畢,就會(huì)發(fā)送一個(gè)打開(kāi)(1)FIN 開(kāi)關(guān)的包,表示它要關(guān)閉自己這一側(cè)的連接。
窗口大小 (Window Size - 16 bits)
收件人的倉(cāng)庫(kù)還有多大空位? 接收方告訴發(fā)送方:“我現(xiàn)在最多還能接收這么多字節(jié)的數(shù)據(jù)(窗口大小值),你別發(fā)多了!” 這個(gè)值在通信過(guò)程中會(huì)動(dòng)態(tài)變化,TCP 流量控制的核心機(jī)制!防止發(fā)送方發(fā)得太快,把接收方的緩沖區(qū)(倉(cāng)庫(kù))塞爆。
校驗(yàn)和 (Checksum - 16 bits)
包裹的防偽封條/完整性標(biāo)簽。 發(fā)送方根據(jù)整個(gè) TCP 包(首部+數(shù)據(jù))的內(nèi)容計(jì)算出一個(gè)“指紋”(校驗(yàn)和)。接收方收到后,按照同樣的算法再算一遍,接收方比較自己算的“指紋”和包裹上貼的“指紋”(校驗(yàn)和字段)。如果不一樣,說(shuō)明包裹在運(yùn)輸過(guò)程中損壞(比特位出錯(cuò)了)或者被篡改了,這個(gè)包就會(huì)被丟棄。保證數(shù)據(jù)傳輸?shù)耐暾浴?nbsp;
緊急指針 (Urgent Pointer - 16 bits)
加急物品在包裹里的位置。 只有當(dāng) URG 開(kāi)關(guān)打開(kāi)(1) 時(shí)才有效。它指向當(dāng)前數(shù)據(jù)包中緊急數(shù)據(jù)最后一個(gè)字節(jié)的位置,告訴接收方應(yīng)用程序,從包的開(kāi)頭到緊急指針指向的位置是緊急數(shù)據(jù),需要優(yōu)先處理。
選項(xiàng) (Options - 長(zhǎng)度可變,0-40字節(jié))
特殊要求/增值服務(wù)。 可選的附加信息,用于一些高級(jí)功能。常見(jiàn)的選項(xiàng)有:
最大報(bào)文段長(zhǎng)度 (MSS): 在建立連接(握手)時(shí),雙方協(xié)商每個(gè) TCP 包最多能裝多少數(shù)據(jù)(不包括首部)。避免在傳輸路徑中被分片。
窗口縮放因子 (Window Scale): 因?yàn)榛敬翱诖笮∽侄沃挥?span> 16 位,最大只能表示 65535 字節(jié)。這個(gè)選項(xiàng)允許雙方協(xié)商一個(gè)縮放因子,將實(shí)際窗口大小放大(比如左移若干位),用于高速網(wǎng)絡(luò)。
時(shí)間戳 (Timestamp): 用于更精確地計(jì)算往返時(shí)間和防止序列號(hào)回繞,提供 TCP 的擴(kuò)展功能,優(yōu)化性能或增加特性。
填充 (Padding - 長(zhǎng)度可變)
填空格,湊整。 因?yàn)?span> TCP 首部長(zhǎng)度必須是 32 位 (4 字節(jié)) 的整數(shù)倍。如果選項(xiàng)部分的長(zhǎng)度不是 4 字節(jié)的整數(shù)倍,就需要在最后用 0 填充一些位,把整個(gè)首部長(zhǎng)度湊齊,確保首部對(duì)齊,便于硬件處理。