IP封包---想看看你发送的数据长什么样吗?

Day 1,361, 07:18 Published in China Japan by Elandias

这次我们会讲一讲IP协议,现在我会做一个实验给大家看。
首先你需要一个抓包软件,我使用的是wireshark,这个软件在很多地方都能下载。打开wireshark在工具栏中按下Capture按钮,然后在下拉菜单中选择Option,这里可以让你选择需要抓取的包的类型,我们选默认就好,现在按下Start开始抓包。
现在抓包已经开始了,我们打开命令行,在里面输入 ping www.erepublik.com 可以看到返回的信息:


接下来我们停止抓包,在抓取到的一堆IP封包中,我找到了刚才使用ping命令发送出去的那个。让我们来看一看它里面都有些啥。


图片最下方中,被反选的那段就是IP包的内容,而外面那些没有选中的则是一些数据链路层和物理层的封装。

Hmm~我们还是先看看IP包吧:
首先是版本,version: 4 说明我使用的是IPv4协议

接下来是头长度,Header length:20 bytes 说明这个IP封包的头部共有20个字节

区分服务字段 Differentiated Services Field 会告诉路由器在传输过程中这个IP包需要的服务类型 通常有routine(顺序优先级) delay(延迟) throughput(通讯量) reliability(可靠性)等,当然这个包中这些字段的值都为0,说明这个IP包并没有在哪方面提出过分要求(笑

封包总长 Total length:60 告诉我们这个IP包总共有60个字节的大小

Identification:0x5ad4 (23252) 告诉我们识别码是一个0x5ad4这样的十六进制数,我们知道个头比较大的数据传输的时候,数据会被切割并封装在很多个这样的IP封包里,当我们接收到数据并需要将它重组时,我们就要用到识别码了。

Flag字段共有3个bit,第一个bit是个保留值(我也不知道它为什么要留在这),第二个bit告诉我们这个IP包是否允许切割,我们看到我们这个IP包的值是0,也就是说它是可以被切割的,如果我在使用ping命令时加上-t这个参数,那么它就不允许被切割,当它途径MTU(Maximum Transmission Unit 最大传输单元)值低于这个IP包长度的路由器时,它就会被路由器丢掉。
第三个bit告诉我们如果这个IP包是可以分割的,那么它后面还有没有被分割的包,现在我们看到这个值为0,就是说后面已经没有了。

Fragment Offset片偏移,如果一个IP包被切割了,这个值可以告诉我们这段在整个IP包的位置,在这个IP封包中我们看到的片偏移量为0,因为它根本没有被切割。

Time to live:64 一个IP包每通过一个路由器,这个值就会减去1,当路由器收到TTL=1的IP包时,它就不会再转发这个包了,这是为了防止一些数据在网络中形成环路从而阻塞网络。我们在ping命令中看到这个IP包的TTL值为50,所以它从我这里到达erepublik的服务器要坐14站的公交车(笑

protocol:ICMP 说明了我们这个IP封包里面封装的是ICMP协议,ping命令就是基于ICMP Echo的。

Header checksum:0xc5f1 [correct]是一个校验和,它可以保证IP包的内容是无误的,我们看到校验结果为correct,说明成功了。如果失败,这个包会被重新发送一次。

Source与Destination字段告诉我们这个IP包是谁发给谁的,就如同你在信封上要写收件人与发件人地址一样。

所以,这些就是IP包的大概内容,如果你使用IP协议在网络上进行通信,那么你发送的所有数据都会被安上这些字段。在下一期中,我会告诉你这些数据在网络上究竟是怎样到达目的地而不会被弄丢的。

感谢你看完这么长的文章,如果你喜欢它,请vote+subscribe,最好还能留下你的shout。这对我帮助很大。