这是大学计算机网络的一个课程设计:
//((想要源代码或者有问题的小伙伴可以私聊我,我是拿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地址)、传输层协议是否选对了(传输层协议号)等。
运行截图:
简单的算法实现如下:
<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>