TCP/IP协议学习理解:一个完整的数据帧:利用抓包工具,我们可以从网络中随便抓取一个包,比如抓个ICMP包。其结构如下:—Frame3076下是该数据帧里的一些相关信息:数据帧到达时间/捕捉到数据帧的时间—?—?从抓到第一个包到现在计时帧序列号:/抓包工具抓到的第几个包帧长度:/该包自己标记的长度捕捉到的帧长度:/实际捕捉到的包长[帧是否被标记]:/?[帧里包含的协议:eth:ip:icmp:data]/包内自上往下封装的协议下面是数据帧里的结构:—以太网/协议目的主机硬件地址:/48bit被发送端主机硬件地址MAC源主机硬件地址:/48bit发送端主机硬件地址MAC包类型:/16bit(0x0800)所封装包的类型,只识别最外一层IP协议—IP/协议版本:/版本号为4,也称作IPv4首部长度:/首部占32bit数目,字段长4比特,所以其最长为:32/8*15(2进制的1111)=60字节—服务类型:/8位优先权子字段:/3bit优先权子字段TOS子字段:/4bitTOS子字段,分别代表:最小时延、最大吞吐量、最高可靠性和最小费用,这里全0表一般服务未用位:/1bit未用位(必须置0)总长:16位/指整个IP数据报的长度,由于该字段长16比特,所以IP数据包最长可达65535字节标识:16位/唯一标识主机发送的每一份数据报,通常每发送一份报文它的值就会加1标志:3位/片偏移:13位/生存时间:8位/设置数据报可以经过的最多路由器内封装协议类型:/8bit(这里是ICMP,0x01)所封装的协议头部检验和:trueorfalse16位/根据首部计算的检验和码,结果全1为true,否则false源IP地址:/发送端主机IP地址目的IP地址:32位/接收端主机IP地址—ICMP/协议类型:8位代码:8位/类型和代码决定其报文的类型如8和0表示请求报文,0和0表示回应报文检验和:16位/作用和算法同IP检验和标识符:16位序列号:16位/标识符和序列号由发送端任意选择决定,这些值在应答中将被返回,发送端就可以将应答和请求进行匹配。数据:范围0至1472/发送报文的主要内容下面背景加黑的部分表示相应的值。这是一个完整的ICMP数据包,由内到外封装顺序为:ICMP→IP→ETH当接收端主机收到一个报文后,分用过程则和封装相反:ETH→IP→ICMPARP报文:从相关信息中我们可以看到,ARP的封装格式为:ETH→ARP。ETH封装:发送方式为广播方式,即目的硬件地址全1,这是一个询问硬件地址的报文;如果是回应报文,则以单播的方式发送回一个报文。ARP报文中的ETH封装比ICMP多一个9个字节的Trailer,一般规定数据帧最小为60字节,ARP请求或应答都是42字节,所以填充18个全0的字节以满足最小60字节的要求。帧类型:ARP(ARP请求或应答值都为:0x0806)ARP封装下的信息:硬件类型:/表示硬件地址的类型,0x0001表示以太网地址协议类型:/表示要映射的协议地址类型,0x0800表示IP地址硬件地址长度:/1字节,这里值为6,表示硬件地址长度为6字节协议地址长度:/1字节,这里值为4操作字段:/ARP请求:1;ARP应答:2;RARP请求:3;RARP应答4。发送端硬件地址:发送端IP地址:接收端硬件地址:接收端IP地址:RARP报文:RARP分组格式和ARP基本一致。它们之间主要差别是RARP请求或应答的帧类型代码为0x8035,RARP请求操作代码为3,应答操作代码为4。PING程序:目的:测试另一台主机是否可以到达。实验1:PING10.11.1.1结果输出如下图:输出第一行是采用默认的32字节的报文PING目的主机的IP地址(如果输入是服务器的名称,则通过DNS解析成IP地址)。通过抓包工具抓包分析,我们可以查到发送的报文是包含32字节数据的长74字节的ICMP请求报文。从第2—5行输出和抓到的数据包可以看到:从目的主机10.11.1.1收到:内含32字节数据、长74字节的ICMP回应报文;往返时间都是2毫秒(往返时间=接收时间-发送时间),生存时间TTL为255(最大生存时间)。从第7行可以看到:发送4个包,接受到4个包,丢失率0%;从第9行可以看到:这里最小和最大往返时间都是2毫秒,平均往返时间2毫秒。实验2:PING一个不存在的主机10.11.1.2结果输出如下图:从图中我们可以看,请求时间超时,发送4个包,收到0个回应,丢失率100%。多PING几次,即可确定10.11.1.2和我们的主机是不相连的。上面是在局域网里面操作的,如果在广域网里操作,结果会如何呢?实验3:PING输出结果如下图:从图中我们可以看出:第一行DNS自动把域名解析成IP地址;第2、4、5行往返时间明显比实验1要大很多,甚至超时(如第3行),以上实验中的一些数值是可以修改的,如传输的数据长度,生存时间等都可以根据需要来修改,但存在一定的范围限制,如:、输入PING–i10010.11.1.1/修改TTL值为100;通过抓包可以看到:输入PING-i50010.11.1.1/修改TTL值为500;则在PING命令下显示:PING实现过程:1、生成ICMP请求报文。2、将ICMP报文、发送端和目的端的主机IP地址封装在IP报文中,并发给ETH协议层。3、通过ARP缓存查询目的IP地址相对应的硬件地址。如果不存在,则执行4;如果存在,则执行6。4、发送ARP请求报文,以广播方式发送出去,询问对应目的IP地址的硬件地址。5、如果接到ARP请求回应,则执行6,否则超时,按异常处理,输出请求超时。6、ETH协议层将收到的IP报文、源主机和目的主机的硬件地址。7、将封装好的报文通过媒介端口发送出去。8、目的主机接收到发来的ICMP请求数据包,采用自上往下的方式分用报文。9、ETH协议层查看发来的目的硬件地址是否和本地主机硬件地址相同?相同,则提取IP数据包发送给IP协议层处理;否则丢弃。10、IP协议层接收后,检查目的IP地址是否和本地IP地址相同?相同,则提取ICMP数据包给ICMP协议层,否则丢弃。11、ICMP协议层接收处理后,马上构建一个ICMP回应给发送端主机,过程和发送请求一样,只是不需要再回应。Traceroute程序:作用:可以查看IP数据报从一台主机传到另一台主机所经过的路由。在PING过程中,我们知道采用-r可以记录路由选项。但其受到一些限制,无法通用:1、并不是所有的路由器都支持这个记录路由选项。见实验1;2、记录路由一般都是单向的选项,会受到一些限制(后面讨论);3、IP首部中留给选项空间有限,不能存放太多的路径。实验1:PING–r910.11.3.36、PING–r910.11.1.1输出结果:PING–r910.11.3.36:PING–r910.11.1.1:由上可见,通过交换机连接的路由是记录的,但网关路由器是不支持这记录路由选项的。实验2:Tracert10.11.1.1(记录局域网里的路由)输出结果如下图:实验3:Tracert(记录广域网里的路由)Traceroute过程:Traceroute发送一份TTL为1(UDP报文,端口值为主机任何应用程序皆不可用)的IP数据报(从上面的实验可以看到:每一行里有三个往返时间值,即一般每次都是发送三份相同的报文)给目的主机,处理这份报文的第一个路由器将TTL值减1,丢弃该数据报,并发回一份ICMP超时报文,这样发送端主机就得到路径中的第一个路由地址。然后Traceroute程序再发送一份TTL值为2的IP数据报,这样就可以得到第2个路由地址,依此类推得到后面的路由地址。当目的端主机收到一份TTL为1的报文时,发现端口不可用,即产生一份“端口不可达”错误的ICMP报文(以区分ICMP超时报文)告诉发送端主机程序应该结束了,这样即可得到了整个路由过程的路由地址。