用microsoft network monitor抓取一个帧包如下:
0000: 00 1E BE 73 DF 00 00 15 58 E9 8C AD
000c: 08 00 45 00 00 40 7B AD 40 00 80 32
0018: 19 F2 AC 12 06 60 9D 36 15 44 70 16
0024: BA F0 00 00 53 35 05 5C 0F A1 0A 2C
0030: 4E 91 47 75 61 9D 50 10 FF FF 34 1B
003c: 00 00 01 02 02 06 B8 71 BE 0C 92 A4
0048: 55 22 BD ED 97 00
ip数据包重45 00 00 40 开始。对于前面的数据,应该是数据链路层的报头(猜的)。
1. 第一个四位也就是4, 表示所用的ip协议的版本号, 这里也就是ipv4.
2.第二个四位也就是5,表示ip首部占32b的位数。 5就表示这个ip首部的长度将是32/8*5,即20个字节. 通常ip首部都是占20个字节.
3.接下来8位,即00. 表示的是8位tos服务类型. 具体不知道是什么玩意. 据说有前三位一般被忽略, 中间4位就是tos子字段,并且只有一位可以被设置为1. 他们代表着:最小延时,最大吞吐量,最高可靠性和最小费用. 这些有什么,我还不知道. 最后一位好像只能设置为0.
4.再就是接下来的16位了,00 40. 这几位表示ip数据的长度.. 这里是4*16*4=256字节. ip数据段的最大数据量是65535(2^16-1). 但是一般的服务器不允许超过576字节( 这是为什么呢?).
5.再接下来的16位7B AD, 传言它们代表着主机发送的数据包,主机每发送一次它的值就+1. 见识短了,还参不透这个禅.
6.接下来的16位40 00, 里面前三位是标志什么的,后13表示片偏移,也是弄不求懂.
7.接下来的8位:80, 就是广为传颂的TTL(time to live).
8.再接下来的8位:32,表示数据包的协议了. 具体32代表着什么,请参阅RFC了.
9.接下来的16位:19 F2. 就是我自认为很exciting的部分了.IP首部检验和:用于检测ip数据包的数据是否丢失. 具体计算过程如下:
a) 数据包发送的时候,首先将ip检验和的16位置0, 然后分别对各个16位取反码求和.最后保存到ip首部检验和的16位中.
b)客户端接收到数据报的时候,也对各个16位取反码求和. 如果结果全部为1,就表示数据报没有信息丢失.
让我们来看看:
发送端: 19 F2 二进制为: 0001 1001 1111 0010
接受端: 取反后为: 1110 0110 0000 1101
很明显应该是所有位都为1的, 现在看着不算很神奇,但是当初第一个吃这鸡蛋的人,确是有点厉害.