Tcp网络协议计算校验和,以及包生成工具

 

 

这是大学计算机网络的一个课程设计:

//((想要源代码或者有问题的小伙伴可以私聊我,我是拿js嵌html实现的,不用配置环境))

 

 

TCP校验和是一个端到端的校验和,由发送端计算,然后由接收端验证。其目的是为了发现TCP首部和数据在发送端到

接收端之间发生的任何改动。如果接收方检测到校验和有差错,则TCP段会被直接丢弃。

TCP校验和覆盖TCP首部和TCP数据,而IP首部中的校验和只覆盖IP的首部,不覆盖IP数据报中的任何数据。

TCP的校验和是必需的,而UDP的校验和是可选的。TCP和UDP计算校验和时,都要加上一个12字节的伪首部。

伪首部

伪首部共有12字节,包含如下信息:源IP地址、目的IP地址、保留字节(置0)、传输层协议号(TCP是6)、TCP报文长度(报头+数据)。

 

伪首部是为了增加TCP校验和的检错能力:如检查TCP报文是否收错了(目的IP地址)、传输层协议是否选对了(传输层协议号)等。

 

运行截图:

Tcp网络协议计算校验和,以及包生成工具_第1张图片

简单的算法实现如下:

        

<script type="text/javascript">

    // $(document).ready(function () {

    // var ip = $("#yuanip").val();

    //     alert(ip);

    // });

    $(document).ready(function () {

        $("#jiaoyan").click(function () {

            //32网络地址数据部分取值转换

            function bitchange(number_1, number_2) {

                var change;

                number_1 = parseInt(number_1, 10);

                number_2 = parseInt(number_2, 10);

                number_2 = ("000000000" + number_2.toString(2)).substr(-8);

                change = number_1.toString(2) + number_2;

                change = parseInt(change, 2);

                return change;

            }

            //tcp Data

            function addzero(tcp) {

                var tcpdatasum = 0;

                var tcpsum = 0;

                for (var i = 0; i < tcp.length + 1; i++) {

                    if (i % 4 == 0) {

                        tcpdatasum = parseInt(tcpdatasum,16);

                        tcpsum = tcpsum + tcpdatasum;

                        tcpdatasum = 0;

                        tcpdatasum += tcp.charAt(i);

                    }

                    else

                        {

                            tcpdatasum += tcp.charAt(i);

                        }

                    // tcpdatasum = (tcpdatasum + "0000").substr(-4);

                    // tcpdatasum = parseInt(tcpdatasum,16);

                    // alert(tcpdatasum);

                }

                tcpdatasum = parseInt(tcpdatasum,16);

                tcpdatasum = tcpdatasum.toString(16);

                tcpdatasum = (tcpdatasum + "0000").substr(0,4);

                tcpdatasum = parseInt(tcpdatasum,16);

                alert(tcpsum + tcpdatasum);

                return tcpsum + tcpdatasum;

            }

            //校验和计算并

            function checksum(sum) {

 

                sum = (sum >> 16) + (sum & 0xffff);

                sum += (sum >> 16);

                return sum;

            }

            //数组循环相加

            function getSum() {

                var sum = 0;

                for (var i = 0; i < data.length; i++) {

                    sum += parseInt(data[i], 10);

                }

                return sum;

            }

 

            //32bit change 16bit

            function bitchange_2(data) {

                var n = 0;

                var n_1 = "";

                var n_2 = "";

                data = parseInt(data, 10);

                data = data.toString(2);

                data = ("00000000000000000000000000000000" + data).substr(-32);

                for (var i = 0; i < data.length; i++) {

                    if (i < 16) {

                        n_1 += data.charAt(i);

                    }

                    else {

                        n_2 += data.charAt(i);

                    }

                }

                n_1 = parseInt(n_1, 2);

                return n_1;

            }

            function bitchange_3(data) {

                var n = 0;

                var n_1 = "";

                var n_2 = "";

                data = parseInt(data, 10);

                data = data.toString(2);

                data = ("00000000000000000000000000000000" + data).substr(-32);

                for (var i = 0; i < data.length; i++) {

                    if (i < 16) {

                        n_1 += data.charAt(i);

                    }

                    else {

                        n_2 += data.charAt(i);

                    }

                }

                n_2 = parseInt(n_2, 2);

                return n_2;

            }

            //生成报文

            function baowen() {

                var bw = "";

                var bw_1 = "";

                for (var i = 0; i < data.length - 1; i++) {

                    // sum += parseInt(data[i], 10);

                    // sum = checksum(sum);

                    data[i] = parseInt(data[i], 10);

                    data[i] = ("0000" + data[i].toString(16)).substr(-4);

                    bw = bw + data[i];

                }

 

                return bw + sum + tcp;

            }

            //报文字符串格式化

            function baowenzl() {

                var bw_2 = "";

                for (var i = 0; i < a.length; i++) {

                    if (i % 2 != 0) {

                        bw_2 = bw_2 + a.charAt(i) + " ";

                    }

                    else

                        bw_2 = bw_2 + a.charAt(i);

                }

                return bw_2;

            }

 

            var data = new Array();

 

            var yuanip1 = $("#yuanip1").val();

            var yuanip2 = $("#yuanip2").val();

            var yuanip3 = $("#yuanip3").val();

            var yuanip4 = $("#yuanip4").val();

            var mudiip1 = $("#mudiip1").val();

            var mudiip2 = $("#mudiip2").val();

            var mudiip3 = $("#mudiip3").val();

            var mudiip4 = $("#mudiip4").val();

            data[4] = $("#xieyitype").val();

            data[5] = $("#tcplength").val();

 

            data[6] = $("#yuanport").val();

            data[7] = $("#mudiport").val();

            var bit32_1 = $("#number").val();

            var bit32_2 = $("#acknumber").val();

            one = $("#shift").val();

            two = $("#urg").val();

            three = $("#ack").val();

            four = $("#psh").val();

            five = $("#rst").val();

            six = $("#syn").val();

            seven = $("#fin").val();

            data[13] = $("#window").val();

            // data[12] = $("#finger").val();

 

            var tcp = $("#tcp").val();

 

            data[0] = bitchange(yuanip1, yuanip2);

            data[1] = bitchange(yuanip3, yuanip4);

            data[2] = bitchange(mudiip1, mudiip2);

            data[3] = bitchange(mudiip3, mudiip4);

 

           

 

            //一堆乱七八糟的数据移位

            data[5] = parseInt(data[5], 10) + (tcp.length/2) ;

            $("#tcplength").val(data[5]);

            data[8] = bitchange_2(bit32_1);

            data[9] = bitchange_3(bit32_1);

            data[10] = bitchange_2(bit32_2);

            data[11] = bitchange_3(bit32_2);

            one = parseInt(one, 10);

            one = one.toString(2);

            var sum_5 = one + "000000" + two + three + four + five + six + seven;

            sum_5 = parseInt(sum_5, 2);

            data[12] = sum_5;

            data[14] = addzero(tcp);

 

            // var wsum = parseInt(data[0],10) + parseInt(data[1],10) + parseInt(data[2],10) + parseInt(data[3],10) + parseInt(data[4],10)  + parseInt(data[6],10) + parseInt(data[5],10);

            // var sum =   parseInt(data[5],10) + parseInt(data[7],10) + parseInt(data[8],10) + parseInt(data[9],10) + parseInt(data[10],10) + parseInt(data[11],10) + parseInt(data[12],10) + parseInt(data[13],10) + parseInt(data[14],10) + parseInt(data[15],10) + parseInt(data[16],10) + parseInt(data[17],10) + parseInt(data[18],10) + parseInt(data[19],10);

            // var zsum = wsum +sum +parseInt(data[20],10);

            var sum = getSum(data);

            sum = checksum(sum);

            sum = parseInt(sum, 10);

            sum = 0xffff - sum;

            // var sum_2 = ("0000000000000000" + sum.toString(2)).substr(-16);

            // var wsum = getSum();

            // alert(wsum);

            // alert(sum);

            // alert(zsum);

            // sum = checksum(zsum);

            sum = sum.toString(16);

            $("#checksum_1").val(sum);

            // sum = parseInt(sum,10);

            // sum = 0xffff-sum;

            // sum = sum.toString(2);

            // sum = ('000000000000000'+sum).slice(-16);

            // alert(sum);

           

            var a = baowen(data);

            a = baowenzl(a);

            $("#jyprint").val(a);

 

        });

    });

</script>

 

你可能感兴趣的:(bipt大学课设之路,Tcp网络协议计算校验和,tcp包生成)