社区
网络编程
帖子详情
UDP包中的校验码是如何计算的?
ExitWindows
2005-03-01 09:40:37
UDP包中的校验码是如何计算的?
我是先组一个UDP伪头:
struct StuUdpHead{
ULONG uIpSour;
ULONG uIpTar;
BYTE bZero;
BYTE bProtocol;
short int iLen;
}UdpHead;
后接UDP头及数据,整个来计算校验码作为UDP包的校检码,但截收结果总是说校验码不正确,哪位大侠指教一下?谢谢。
...全文
2362
12
打赏
收藏
UDP包中的校验码是如何计算的?
UDP包中的校验码是如何计算的? 我是先组一个UDP伪头: struct StuUdpHead{ ULONG uIpSour; ULONG uIpTar; BYTE bZero; BYTE bProtocol; short int iLen; }UdpHead; 后接UDP头及数据,整个来计算校验码作为UDP包的校检码,但截收结果总是说校验码不正确,哪位大侠指教一下?谢谢。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
shines77
2005-03-13
打赏
举报
回复
mark
ExitWindows
2005-03-10
打赏
举报
回复
问题找到了,校验和是正确的,毛病出在其它地方。
感谢各位,特别感谢kingzai(stevenzhu)的代码。
ExitWindows
2005-03-09
打赏
举报
回复
找了本《TCP/IP详解 卷1:协议》,再研究一下。
ExitWindows
2005-03-02
打赏
举报
回复
谢谢 kingzai(stevenzhu)。
从代码上看,UDP校验是对伪UDP头、UDP头、UDP数据这样的序列做的,但我的为什么不对呢。
容我再检查一下。
kingzai
2005-03-02
打赏
举报
回复
/* OicqSend.c
#pragma pack(1)
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define OICQ_MAX_PACKET 1024
#define OICQ_MAX_MSG 512
#define OICQ_MSG_LEN 45
#define SRC_IP "127.0.0.1"
#define SRC_PORT 5277
#define DST_PORT 4000
typedef struct ip_hdr
{
unsigned char ip_verlen;
unsigned char ip_tos;
unsigned short ip_totallength;
unsigned short ip_id;
unsigned short ip_offset;
unsigned char ip_ttl;
unsigned char ip_protocol;
unsigned short ip_checksum;
unsigned int ip_srcaddr;
unsigned int ip_destaddr;
} IP_HDR;
typedef struct udp_hdr
{
unsigned short src_portno;
unsigned short dst_portno;
unsigned short udp_length;
unsigned short udp_checksum;
} UDP_HDR;
char strMessage[OICQ_MSG_LEN] = {
0x02,0x01,0x07,0x00,0x78,0x00,0x00,0x31,0x30,0x30,0x30,0x31,0x1f,0x30,0x1f,
0x30,0x30,0x1f,0x32,0x30,0x30,0x30,0x2d,0x30,0x31,0x2d,0x30,0x31,0x1f,0x30,
0x30,0x3a,0x30,0x30,0x3a,0x30,0x30,0x1f,0x68,0x65,0x6c,0x6c,0x6f,0x21,0x03
};
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while (size > 1)
{
cksum += *buffer++;
size -= sizeof(USHORT);
}
if (size)
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
int main(int argc, char **argv)
{
WSADATA wsd;
SOCKET s;
BOOL bOpt;
struct sockaddr_in remote;
IP_HDR ipHdr;
UDP_HDR udpHdr;
int ret;
DWORD i;
unsigned short iTotalSize,
iUdpSize,
iUdpChecksumSize,
iIPVersion,
iIPSize,
cksum = 0;
char buf[OICQ_MAX_PACKET],
*ptr = NULL;
printf("Spoof OICQ Msg Sender - by Janker@371.net\n\n");
if(argc!=2) {
printf("usage: OICQSEND Destination_IP_Address");
ExitProcess(1);
}
srand((unsigned)time(NULL));
strMessage[5]=rand();
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
printf("WSAStartup() failed: %d\n", GetLastError());
return -1;
}
s = WSASocket(AF_INET, SOCK_RAW, IPPROTO_UDP, NULL, 0,0);
if (s == INVALID_SOCKET)
{
printf("WSASocket() failed: %d\n", WSAGetLastError());
return -1;
}
bOpt = TRUE;
ret = setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *)&bOpt, sizeof(bOpt));
if (ret == SOCKET_ERROR)
{
printf("setsockopt(IP_HDRINCL) failed: %d\n", WSAGetLastError());
return -1;
}
iTotalSize = sizeof(ipHdr) + sizeof(udpHdr) + OICQ_MSG_LEN;
iIPVersion = 4;
iIPSize = sizeof(ipHdr) / sizeof(unsigned long);
ipHdr.ip_verlen = (iIPVersion << 4) ¦ iIPSize;
ipHdr.ip_tos = 0;
ipHdr.ip_totallength = htons(iTotalSize);
ipHdr.ip_id = 0;
ipHdr.ip_offset = 0;
ipHdr.ip_ttl = 128;
ipHdr.ip_protocol = 0x11;
ipHdr.ip_checksum = 0 ;
ipHdr.ip_srcaddr = inet_addr(SRC_IP);
ipHdr.ip_destaddr = inet_addr(argv[1]);
iUdpSize = sizeof(udpHdr) + OICQ_MSG_LEN;
udpHdr.src_portno = htons(SRC_PORT) ;
udpHdr.dst_portno = htons(DST_PORT) ;
udpHdr.udp_length = htons(iUdpSize) ;
udpHdr.udp_checksum = 0 ;
iUdpChecksumSize = 0;
ptr = buf;
ZeroMemory(buf, OICQ_MAX_PACKET);
memcpy(ptr, &ipHdr.ip_srcaddr, sizeof(ipHdr.ip_srcaddr));
ptr += sizeof(ipHdr.ip_srcaddr);
iUdpChecksumSize += sizeof(ipHdr.ip_srcaddr);
memcpy(ptr, &ipHdr.ip_destaddr, sizeof(ipHdr.ip_destaddr));
ptr += sizeof(ipHdr.ip_destaddr);
iUdpChecksumSize += sizeof(ipHdr.ip_destaddr);
ptr++;
iUdpChecksumSize += 1;
memcpy(ptr, &ipHdr.ip_protocol, sizeof(ipHdr.ip_protocol));
ptr += sizeof(ipHdr.ip_protocol);
iUdpChecksumSize += sizeof(ipHdr.ip_protocol);
memcpy(ptr, &udpHdr.udp_length, sizeof(udpHdr.udp_length));
ptr += sizeof(udpHdr.udp_length);
iUdpChecksumSize += sizeof(udpHdr.udp_length);
memcpy(ptr, &udpHdr, sizeof(udpHdr));
ptr += sizeof(udpHdr);
iUdpChecksumSize += sizeof(udpHdr);
for(i = 0; i <OICQ_MSG_LEN; i++, ptr++)
*ptr = strMessage[i];
iUdpChecksumSize += OICQ_MSG_LEN;
cksum = checksum((USHORT *)buf, iUdpChecksumSize);
udpHdr.udp_checksum = cksum;
ZeroMemory(buf, OICQ_MAX_PACKET);
ptr = buf;
memcpy(ptr, &ipHdr, sizeof(ipHdr)); ptr += sizeof(ipHdr);
memcpy(ptr, &udpHdr, sizeof(udpHdr)); ptr += sizeof(udpHdr);
memcpy(ptr, strMessage, OICQ_MSG_LEN);
remote.sin_family = AF_INET;
remote.sin_port = htons(DST_PORT);
remote.sin_addr.s_addr = inet_addr(argv[1]);
ret = sendto(s, buf, iTotalSize, 0, (SOCKADDR *)&remote, sizeof(remote));
if (ret == SOCKET_ERROR)
printf("sendto() failed: %d\n", WSAGetLastError());
else
printf("Send O.K.!");
closesocket(s) ;
WSACleanup() ;
return 0;
}
fisker0303
2005-03-02
打赏
举报
回复
详见TCP/IP详解卷一,108页。
fisker0303
2005-03-02
打赏
举报
回复
包括UDP的首部和UDP数据。
ExitWindows
2005-03-02
打赏
举报
回复
勇敢的心:
我的UDP校验就是这样做的,为什么总是错误的呢?
ExitWindows
2005-03-02
打赏
举报
回复
谢谢老兄。
可我想知道的是:UDP检验究竟是将哪些内容来做的校验,这些内容是什么?
oyljerry
2005-03-02
打赏
举报
回复
UDP校验就是伪UDP头、UDP头、UDP数据这几部分
sharkhuang
2005-03-02
打赏
举报
回复
老多现成的代码抄一段就ok
kingzai
2005-03-01
打赏
举报
回复
UDP的校验和包括UDP首部和数据,方法是计算16位的二进制和,首先将校验
和字段(16位)置0,将每个16位的反码相加,若是奇数字节即最后未到16字节,
则以0补充,结果存在校验和字段中,因接收端包含了之前的校验和,若传输
中没有任何差错,则接收端计算的校验和该为全1,否则有错,这于IP首部的
二进制反码和的计算类似,注意若计算结果为0,则存入的值为全1,若传送端的
校验和为0,发送端就没计算校验和。更多内容可以看Stevens的《TCP/IP详解》。
计算
机网络 传输层 TCP和
UDP
协议
Re:
计算
机网络 传输层 TCP和
UDP
协议# 传输层协议 TCP 和
UDP
的应用场景 要发送的内容多,需要将发送的内容分成多个数据包发送(TCP) 要发送的内容少,一个数据包就能发送全部内容(
UDP
)# 传输层协议和应用层协议之间的关系 传输层协议加一个端口号来标识一个应用层协议, 展示了传输层协议和应用层协议之间的关系# 使用TCP/IP筛选实现网络安全 防火墙设置与端口#
UDP
协议特点和报文格式
UDP
是无连接的:即发送数据之前不需要建立连接
UDP
使用尽最大努力交付:即不保证可靠交付,因此主机不需要维持复杂的连接状态表# TCP 协议特点和报文格式先连接后释放;点对点;可靠传输;全双工通信;面向数据流七项标记位停止等待协议与改进的停止等待协议滑动窗口技术详解:确认Seq与选择确认SACK 超时重传时间:查询
计算
与自动调整 流量控制功能:点对点的流量控制 拥塞控制:相对整体网络环境而言;慢开始算法和拥塞避免算法 改进的拥塞控制:快重传和快恢复 三次握手建立TCP连接,四次挥手释放连接。# TCP 协议面临的攻击 SYN 攻击:捏造的源地址; LAND攻击:自己就是源地址# 通过抓包工具,查看以上报文格式# 习题详解
为何电脑发送的IP包和
UDP
的校验和都是错的
给WIRESHARP开启了校验之后发现电脑发出的
UDP
包其中IP包部分校验和和
UDP
部分校验和都是错的。如图: 图中FPGA板子的IP地址是192.168.3.22电脑的IP是192.168.3.11. 我们看到FPGA 板子发出的
UDP
包中
IP和
UDP
的CHECK SUM都通过了校验,而电脑发出的
UDP
包是黑色的,没用通过
UDP
校验。对我们实际指导意义是咱们FPGA的接受部分要有忽略CHECK SUM的开关,以兼容这些check sum不好好算的网络节点。 我觉得可能电脑上有某个设置,可.
udp
校验和 java_java:网络编程(
UDP
(DatagramSocket和DatagramPacket)正则表达式)
* TCP* 特点:面向连接,点对点的通信,效率较低,但安全可靠*
UDP
:用户数据报协议,类似于发报机* 特点:非面向连接,可以广播发送,效率较高,但传输不可靠* java.net.DatagramSocket: 此类表示用来发送和接收数据报包的套接字。* 构造方法:* DatagramSocket() 构造数据报套接字并将其绑定到本地主机上任何可用的端口。* DatagramSocket(i...
UDP
分片与丢包,
UDP
真的比TCP高效吗?
根据
UDP
通信的有界性,在 buf 足够大的情况下,接收到的一定是一个完整的数据包,
UDP
数据在下层的分片和组片问题由 IP 层来处理,提交到
UDP
传输层一定是一个完整的
UDP
包,那么 recvfrom(9000) 将返回 8000。对于一些多点通信的场景,如果采用有连接的 TCP,那么就需要和多个通信节点建立其双向连接,然后有时在 NAT 环境下,两个通信节点建立其直接的 TCP 连接不是一个容易的事情,在涉及 NAT 穿越的时候,
UDP
协议的无连接性使得穿透成功率更高.
计算
机网络
UDP
协议与TCP协议首部
目录
UDP
首部
UDP
-源端口号(Source Port)
UDP
-目标端口号(Destination Port)
UDP
-包长度(Length)
UDP
-校验和(Checksum) 校验和
计算
中
计算
UDP
伪首部的理由 TCP首部格式 TCP-源端口号(Source Port) TCP-目标端口号(Destination Port) TCP-序列号(Sequence Numb...
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章