计算TCP数据包的大小和起始位置(不包括头部)

21

如何计算TCP数据包中的数据大小和起始字节(不包括头信息)?

2个回答

31
我将假设您正在处理一个TCP/IP数据包。您需要自己计算其大小。 IP头有一个“总长度”字段,给出了整个IP数据包的字节数。如果从IP头中的“头部长度”字段得到组成头部的32位单元数,您就会知道TCP数据包的大小。通常情况下,IP数据包的头部为20个字节,除非存在选项。
TCP头中,“数据偏移量”字段指定了TCP头部的大小(以32位单元表示)。同样,您可以从之前计算出来的TCP数据包的大小中减去该数字(乘以4以给出头部中的字节数),以获取TCP数据包中数据的大小。
给定IP头中的“头部长度”和TCP头中的“数据偏移量”,您可以将这两个值相加并乘以4,以便知道TCP数据包中数据开始的字节偏移量。

7
所以 [IP总长度] - (([IP头长度] + [TCP数据偏移量]) * 4)? - Robert Jacobs
@RobertJacobs 看起来那应该就是大小了,是的。 - vinod

7

我刚刚在我的路由器上抓取了一个TCP数据包,然后计算了TCP数据的长度。

IHL = 5
Total Length = 0x00a8
Data Offset = 8
---------------------
0x00a8 - (5 + 8) * 4 = 116 bytes

# tcpdump -n -i br-lan -c 1 -e -XX tcp port 22
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on br-lan, link-type EN10MB (Ethernet), capture size 65535 bytes
15:33:53.917593 ae:ca:87:aa:aa:aa > b8:e8:56:bb:bb:bb, ethertype IPv4 (0x0800), length 182: 192.168.31.1.22 > 192.168.31.102.54076: Flags [P.], seq 582717816:582717932, ack 442380252, win 4706, options [nop,nop,TS val 100656432 ecr 1139948861], length 116
    0x0000:  b8e8 56bb bbbb aeca 87aa aaaa 0800 4510  ..V........x..E.
                                                 ^
    0x0010:  00a8 8d0c 4000 4006 ed7b c0a8 1f01 c0a8  ....@.@..{......
             ^^^^
    0x0020:  1f66 0016 d33c 22bb 9178 1a5e 2fdc 8018  .f...<"..x.^/...
                                                ^
    0x0030:  1262 c052 0000 0101 080a 05ff e530 43f2  .b.R.........0C.
    0x0040:  3d3d f6e4 f672 736f 6c6c 191f 64ec 80a6  ==...rsoll..d...
    0x0050:  ba74 e8f7 b2ce 99ec 2725 2d49 f4f6 7760  .t......'%-I..w`
    0x0060:  c83f 5130 83bb ca22 c32c 6251 7381 08e2  .?Q0...".,bQs...
    0x0070:  c036 1c12 f22f fe8b c36a eeff c95c 36fa  .6.../...j...\6.
    0x0080:  7baa 810b 4c75 8ccf 19e4 62df 2c2c c5fd  {...Lu....b.,,..
    0x0090:  a0c8 aa53 1130 d413 7097 f1cd 34dc 92b7  ...S.0..p...4...
    0x00a0:  ea9b 3bd6 02f8 ea93 c8f3 7d32 4a58 39aa  ..;.......}2JX9.
    0x00b0:  12d3 e2bd 18d4                           ......

整个以太网帧

IP头(IHL / 总长度)

0                   1                   2                   3   
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version|**IHL**|Type of Service|**********Total Length*********|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Identification        |Flags|      Fragment Offset    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Time to Live |    Protocol   |         Header Checksum       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Source Address                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Destination Address                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options                    |    Padding    | <-- optional
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            DATA ...                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

TCP头部(数据偏移)

0                   1                   2                   3   
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Port          |       Destination Port        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Acknowledgment Number                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Data |       |C|E|U|A|P|R|S|F|                               |
| Offset|  Res. |W|C|R|C|S|S|Y|I|            Window             | 
| ******|       |R|E|G|K|H|T|N|N|                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Checksum            |         Urgent Pointer        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options                    |    Padding    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                             data                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接