RodYang

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

随笔分类 -  TCP/IP

摘要:#include "stdafx.h"#include #include #pragma comment(lib,"ws2_32.lib")short myntohs(short s){ BYTE high=(BYTE)s>>8; BYTE lower=(BYTE)s; s=(lower<<8)+high; return s;}short myntohs1(short s){ __asm { movzx eax,word ptr [ebp+8] mov ch,al shr ax,8 o... 阅读全文
posted @ 2013-08-22 14:17 RodYang 阅读(278) 评论(0) 推荐(0)

摘要:下面这些TCP/IP数据包是我在进行Socket及Wipcap网络编程过程中曾经用到过的数据包结构体, 这些东西平时看起来不起眼,真正用到的时候就会觉得非常有用......以太帧头格式结构体,共14个字节: typedef struct ether_header { unsigned char ether_dhost[6];//目的MAC地址 unsigned char ether_shost[6];//源MAC地址 unsigned short ether_type;//协议类型 }ETHHEADER,*PETHHEADER;IPv4报头格式结构体,共20个字节:typede... 阅读全文
posted @ 2013-08-21 09:23 RodYang 阅读(1686) 评论(0) 推荐(0)

摘要:解析IPV4报文和IPV6报文的checksum的算法:校验和(checksum)算法,简单的说就是16位累加的反码运算:计算函数如下:我们在计算时是主机字节序,计算的结果封装成IP包时是网络字节序,注意这两者之间的区别,我们在从IP包里读取要转化为主机字节序,往IP包里存入时要转化为网络字节序在存入。UINT32 Checksum(UINT32 cksum, VOID *pBuffer, UINT32 size){INT8 num = 0;UINT8 *p = (UINT8 *)pBuffer;if ((NULL == pBuffer) || (0 == size)){return cksu 阅读全文
posted @ 2013-08-21 08:50 RodYang 阅读(3995) 评论(0) 推荐(1)

摘要:我就不管是按“位”(bit)取反相加,还是 按“1的补码”相加了,总之就是把需要进行校验的“字串”加(+)起来,把这相加的 结果取反当做“校验和” (Checksum), 比如,相加的结果是0101,那么“校验和”就是1010,验证的时候呢,就是0101+1010 = 1111,取反后, 就是0——如果验证得“零”(0),就是正确的!先将checksum字段置零,然后按16位分组,计算2进制反码和,最后再求和的反码!为了计算一份数据报的IP检验和,首先把检验和字段置为0。然后,对首部中每个16bit进行二进制反码求和(整个首部看成是由一串16bit的字组成),结果存在检验和字段中。当收到一份I 阅读全文
posted @ 2013-08-17 23:55 RodYang 阅读(12391) 评论(0) 推荐(0)

摘要:1、算法思路: IP/ICMP/IGMP/TCP/UDP等协议的校验和算法都是相同的,算法如下: 在发送数据时,为了计算IP数据包的校验和。应该按如下步骤: (1)把IP数据包的校验和字段置为0; (2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和; (3)把得到的结果存入校验和字段中。 在接收数据时,计算数据包的校验和相对简单,按如下步骤: (1)把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段; (2)检查计算出的校验和的结果是否等于零(反码应为16个0); (3)如果等于零,说明被整除,校验是和正确。否则,校验和就是错误的,协议... 阅读全文
posted @ 2013-08-02 07:12 RodYang 阅读(2736) 评论(0) 推荐(0)