TCP-IP 学习(二) 通过DHCP获取IP地址

一、接着上次扯

        扯什么,上次抄了点书上的链路层,这次接着抄点,坚持就是打发无聊的最有力武器!

        这次又卡住了,不然就又可以见证点真实的情景了。最近感觉那个虚拟网卡可以工作了,那个美啊,以为可以随意的发送任何数据了给任何对象了,但是现实是残酷的,不知道哪里又有问题,发送命令就是问题的触发器!

       当时我是这样想的因为可以用网卡了,所以我在考虑发送什么数据包有可能的有个交互,首先应该要有IP吧,就想到了IP从哪里来,最后跑到了这个DHCP的服务上了。

       DHCP的消息格式是基于BOOTP的消息格式,所以你抓包过滤用dhcp关键字那个郁闷一直提示是红色,你还认为是不是自己语法错了。

       BOOTP这个包好处是什么简单包含的多啊udp一下基本可以掌握了。链路层+IP层+UDP层+BOOTP

二、这个包的解剖

        虽然不是医生,但是做了跟医生差不多的工作,解刨探究工作。区别医生那个可能很恐怖,这个确实很无聊

       1. 这个来回的流程如下:

                                     1.客户端-》DHCP服务器 discover 发了个广播包

                                     2.DHCP服务器-》客户端 offer单播数据包

                                     3.客户端-》DHCP服务器 request确认广播包

                                     4.DHCP服务器-》客户端 ack确认包

        2.层次以及校验

                                     1.当然是链路层了 可以通过标示确认这个包的服务,例如IP,ARP,RARP

                                     2.整体会有硬件产生CRC的校验

                                     3.当然这个是IP数据包标示0x0x0800 IPV6:0x08DD ARP 0x0806

                                     4.IP层 TCP/UDP识别 TCP:0x06 UDP:0x11

                                     5.IP层的校验 只包含IP头部 首先把校验位清零 算法如下

                                     6.UDP 格式校验 虚拟的IP头不参与传输+UDP的头+UDP的数据

                                     7.UDP虚拟头 源IP+目的IP+协议+长度(UDP头+UDP数据)

                                     8.BOOTP的数据格式(应用层识别可以通过端口)      

	//校验的java算法
           private static int csum(int[] data){
		int sum=0;
		for(int i=0;i<data.length;i+=2){
            if(1!=data.length-i){
            	sum+=((data[i]<<8)&0xFF00)+(data[i+1]);
            }else{
            	sum+=(data[i]<<8)&0xFF00;
            }	
            
		            while(sum>0xFFFF){
            	sum=((sum>>>16)&0xFFFF)+(sum&0xFFFF);
            }
		}
		sum=(~sum)&0xFFFF;
		return sum;
	}
        //由于用wireshark 想吧抓到包改改自己用-》变为16进制字节的数组
          //复制成数据流字符串 简单的后台打印转换 直接可以复制用
	private static void changeToArryShow(String stream){
		int i=0;
		String temp="";
		while(i<stream.length()){
			temp=stream.substring(i, i+2);
			i+=2;
			System.out.print("0x"+temp);
			System.out.print(", ");
			if((i/2)%12==0)
				System.out.println();
		}
	}

 最后:这其实算是个完整的UDP数据包

0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0x2e, 0x0f, 0x00, 0x28, 
0x08, 0x00, 0x45, 0x00, 0x01, 0x48, 0x01, 0x05, 0x00, 0x00, 0x80, 0x11, 
0x38, 0xa1, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x44, 
0x00, 0x43, 0x01, 0x34, 0x74, 0x4a, 0x01, 0x01, 0x06, 0x00, 0x9c, 0xef, 
0xf9, 0x1b, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 
0x2e, 0x0f, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x63, 0x82, 0x53, 0x63, 0x35, 0x01, 0x01, 0x74, 0x01, 0x01, 
0x3d, 0x07, 0x01, 0x00, 0x03, 0x2e, 0x0f, 0x00, 0x28, 0x0c, 0x0b, 0x49, 
0x50, 0x53, 0x63, 0x61, 0x6e, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x3c, 0x08, 
0x4d, 0x53, 0x46, 0x54, 0x20, 0x35, 0x2e, 0x30, 0x37, 0x0a, 0x01, 0x0f, 
0x03, 0x06, 0x2c, 0x2e, 0x2f, 0x1f, 0x21, 0x2b, 0xff, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 


你可能感兴趣的:(TCP-IP 学习(二) 通过DHCP获取IP地址)