利用SNIFFER PRO学习TCP/IP(二)
下面开始分析数据包的结构:
选择NO.12,可以看到SYN段的的详细情况,看到中间的(he,不知道这叫什么栏)协议分析,从TCP到DataLink的封装可看得一清二楚,可以发现有三项(把Tree折合起来就可看到):(1)DLC:Ethertype = 0800, size = 62 bytes
(2) IP:D=[192.168.1.81] S=[192.168.1.36] LEN=28 ID=26052
(3)TCP:D=6666 S=2970 SYN SEQ=3614407631 LEN=0 WIN=64240。
这三项对应的分别是数据链数层的数据,网络层的数据,运输层的数据,这是经过Sniffer分析显示的提示信息。数据是从运输层->网络层->链路层,我们就从运输层开始。
从<<详解>>的附图我们可以知道,TCP由20字节的首部 + 选项(可选) + 数据(可选),作为SYN请求,没有数据项。对照一下Sniffer的数据(Sniffer中展开TCP项)。
注:点击TCP数据的每一项,均会在下面的详细数据栏显示HEX和ASCII数据
如上图,16位源端口号为2970,16位目的端口号为6666,把<<详解>>附图打开(或打开P171),一一对应很容易就知道各项数据代表的含义。这里注意一个,保留6位数据之后是6个标志位,分别是URG,ACK,PSH,RST,SYN,FIN,数据由标志位来确定所要传输的目的,如上图,只是SYN位置为1,表示这是SYN请求,如果是SYN的应答,那么SYN,ACK都要置为1。再看到可选项,Maximum Segment Size为1460,这是最大报文大小,每个连接方通常都会在SYN请求时指明这个选项(p173)。所以在我的程序中send 2000字节的数据时会拆分报文。
接下来是网络层
把上图与<<详解>>附图的IP首部描述对应,我们看到版本号是4,即说明这是IPv4协议(he,不是先进的IPv6),首部总长度是20,即没有可选项参数。总长度为48bytes,即20位的IP长度加上28位的TCP长度,数据到达IP层时,已经把TCP的数据封装进来了。8位的协议是06,即封装的是TCP的数据(由<<详解>>P7我们得知,1表示ICMP,2表示IGMP,6表示TCP,17表示UDP)。具体的分析就可看到<<详解>>P25。(我的目的并不是分析数据,那可是几本书也讲不完的,我只是告诉大家怎么利用Sniffer来学习TCP/IP)
再看到数据链数层
对照到<<详解>>P16,这是以太网帧格式,而不是802标准定义的帧格式,所以对应到P16的以太网封装。以太网封装由目的地址,源地址,类型,数据组成。这里的地址都已经是MAC地址了,对于网卡来说,它只认MAC(如果发送数据时并不知道对方MAC,那么会先发送ARP请求来得到MAC,同一个网段的MAC在缓存里面都存了有,如果同一网段主机修改IP,会向外广播,这时缓存会得以更新,呵,这又涉及到ARP了,如果想解开疑问,可以用Sniffer来捕捉相关数据,所以说Sniffer是个学习TCP/IP的很好的工具,扯远了)。再看到2个字节的类型说明,这里是0800,即说明封装的是IP数据报(0806为ARP,8035为RARP)。
在<<详解>>P16我们知道,对于以太网数据部分必须最少有46字节,不足补PAD字节。(he,在P21还有最大传输单元MTU,自己看了),还记得上面的TCP总长度为48bytes吗?这就是以太网的数据(不包括以太网头),已经超过了46,所以不用PAD,但你可以看到三次握手的最后ACK段,即NO.14,在这里以太网数据只有40字节,所以后面PAD了6个字节。
到这,数据的封装过程我们已经都明白了。(其实我自己在分析数据的时候,发现了很多问题,我不停的翻<<详解>>,不断的尝试Sniffer不同的数据来分析)
待续!