计算机技术实战

纸上得来终觉浅,绝知此事要躬行。

Download this project as a .zip file Download this project as a tar.gz file

UDP

特点

抓包分析

  1. 源端口:2字节,取值范围[0,65535];
  2. 目的端口:2字节,取值范围[0,65535];
  3. 长度:2字节,值=头长度+数据长度,假如数据部分长度为10字节,则长度为18(包括头部的8字节)。
  4. 检验和:2字节,检测UDP用户数据报在传输中是否有错。有错则丢弃。

例如,使用UDP协议发送字符串”abc”,抓到的数据包如下:

检验和的计算

计算公式(java)

    /**
     * 反码获取检验和
     * 参考:https://baike.baidu.com/item/%E4%BA%8C%E8%BF%9B%E5%88%B6%E5%8F%8D%E7%A0%81%E6%B1%82%E5%92%8C/10462750?fr=aladdin
     *
     * @return
     */
    public static int getCheckSum(int[] data) {
        int sum = 0;
        int n = data.length;
        for (int i = 0; i < n; i++) {
            sum += data[i];
            sum = (sum >> 16) + (sum & 0xffff);
        }
        sum = ~sum;
        sum = sum & 0xffff;
        return sum;
    }

示例:

上图的检验和计算方法:

    long result = ChecksumUtils.getCheckSum(new int[]{
            0xc0a8,//源ip前半部分:192.168
            0x0069,//源ip后半部分:0.105
            0xc0a8,//目标ip前半部分:192.168
            0x0065,//目标ip后半部分:0.101
            17,//定值,指UDP协议号
            11,//udp长度
            52931,// 源端口
            2020,// 目标端口
            11,//udp长度
            0,//检验和初始值
            0x6162,//数据
            0x6300//数据(不足偶数位补0,0x63->0x6300)
    });

得出的结果是:0xe2ae,和抓包中的Checksum值一致。