TCP/IP协议格式详解
IP格式
圖片概覽
字段詳解
字段類型若為數值,且由多字節組成,則需網絡字節序轉主機字節序。即多字節數值字段實值獲取前需轉主機字節序。
版本:0x04表IPv4,0x06表IPv6。
int iVersion = static_cast<unsigned char>(cBuffer[0]) >> 4;
首部長度:單位4字節。
int iHeaderLen = (cBuffer[0] & 0x0f) * 4;
總長度:IP數據包總長,包頭+數據,單位1字節。
int iTotalLen = 0;
memcpy(&iTotalLen, &cBuffer[2], 2);
iTotalLen = ntohs(iTotalLen);
協議:下層使用的協議,IP層下層的協議類型,6表TCP,17表UDP。
int iProto = static_cast<unsigned char>(cBuffer[9]);
源地址:發送方IP,共4字節,每個字節對應的數值即IP中的一個字段。
例如,若cBuffer[12] - cBuffer[15]依次為0xa8, 0x5f, 0x01, 0x54,則源IP=168.95.1.84,注:0xa8=168,0x5f=95,0x01=1,0x54=84。
std::string sSrcIp, sDestIp;
for(int m = 0; m != 4; ++m)
{
sSrcIp += std::to_string(static_cast<ULONGLONG>(static_cast<unsigned char>(cBuffer[12+m])));
sDestIp += std::to_string(static_cast<ULONGLONG>(static_cast<unsigned char>(cBuffer[16+m])));
if(m != 3)
{
sSrcIp += ".";
sDestIp += ".";
}
}
目的地址:同上。
TCP格式
圖片概覽
字段詳解
字段類型若為數值,且由多字節組成,則需網絡字節序轉主機字節序。即多字節數值字段實值獲取前需轉主機字節序。
源端口:發送方端口。
int iSrcPort = 0, iDestPort = 0; memcpy(&iSrcPort, &cBuffer[iIpHeaderLen], 2); memcpy(&iDestPort, &cBuffer[iIpHeaderLen+2], 2); iSrcPort = ntohs(iSrcPort); iDestPort = ntohs(iDestPort);
目的端口:同上。
數據偏移:TCP首部長,占4比特,單位4字節。
int iTcpHeaderLen = (static_cast<unsigned char>(cBuffer[iIpHeaderLen+12]) >> 4) * 4;
綜上,獲取數據長:int iDataLen = iTotalLen - iIpHeaderLen - iTcpHeaderLen;
總結
以上是生活随笔為你收集整理的TCP/IP协议格式详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu-6165(tarjan+topu
- 下一篇: ali-to-aws