一、TCP報文頭部簡介
●源、目標端口號字段:占16比特。TCP協議通過使用"端口"來標識源端和目標端的應用進程。端口號可以使用0到65535之間的任何數字。在收到服務請求時,操作系統動態地為客戶端的應用程序分配端口號。在服務器端,每種服務在"眾所周知的端口"(Well-Know Port)為用戶提供服務。
●順序號字段:占32比特。用來標識從TCP源端向TCP目標端發送的數據字節流,它表示在這個報文段中的第一個數據字節。
●確認號字段:占32比特。只有ACK標志為1時,確認號字段才有效。它包含目標端所期望收到源端的下一個數據字節。
●頭部長度字段:占4比特。給出頭部占32比特的數目。沒有任何選項字段的TCP頭部長度為20字節;最多可以有60字節的TCP頭部。
●標志位字段(U、A、P、R、S、F):占6比特。各比特的含義如下:
◆URG:緊急指針(urgent pointer)有效。
◆ACK:確認序號有效。
◆PSH:接收方應該盡快將這個報文段交給應用層。
◆RST:重建連接。
◆SYN:發起一個連接。
◆FIN:釋放一個連接。
●窗口大小字段:占16比特。此字段用來進行流量控制。單位為字節數,這個值是本機期望一次接收的字節數。
●TCP校驗和字段:占16比特。對整個TCP報文段,即TCP頭部和TCP數據進行校驗和計算,並由目標端進行驗證。
●緊急指針字段:占16比特。它是一個偏移量,和序號字段中的值相加表示緊急數據最后一個字節的序號。
●選項字段:可選字段。包括"窗口擴大因子"、"時間戳"等選項。
二、DNS報文首部
標識ID:16bit,有發出DNS請求的客戶端生成,對應的DNS響應報文中也要置同樣的ID。
標志字段:16bit,被划分為如下的若干字段:
◆QR:0表示查詢報文,1表示響應報文
◆Opcode:通常值為0(標准查詢),其他值為1(反向查詢)和2(服務器狀態請求)。
◆AA:表示授權回答(authoritative answer).
◆TC:表示可截斷的(truncated)
◆RD:表示期望遞歸
◆RA:表示可用遞歸
◆Rcode:返回碼,通常為0(NoError)和3(NXDomain)等。
三、TCP協議承載DNS報文的時候,為什么DNS報文頭部前面會多出兩個字節的長度字段??
如下圖抓包所示:
1、TCP報文
2、DNS報文
如上圖所示,DNS報文的標識ID字段前面,多出了兩個字節的DNS報文長度字段?UDP協議承載的DNS報文就沒有這兩個字段。
很奇怪,這是何解??