tcp头部里的校验和,指的是哪部分数据的crc?

壮哉我大神船 2013-12-04 10:44:16
给出一个ip分组:
45 20 00 47 00 01 00 00 40 11 4e 2d 7a 4a e1 49 6e 62 62 62 d9 ae 00 35 00 33 b0 f6
总长度 标识 协议 校验和 目端口 源端口 校验和
f3 69 01 00 00 01 00 00 00 00 00 00 06 74 65 72 65 64 6f 04 69 70 76 36 09 6d 69 63 72 6f 73 6f 66 74 03 63 6f 6d 00 00 01 00 01 数据



可以看到有2个校验和,第一个是ip分组里的,第二个是tcp分组里的。问题是这两个校验和分别是对哪些字符串进行运算后得到的呢?
按照tcp分组格式里说的,tcp头部里的校验和是:“报头和数据字段的校验和”。
我下载了一个计算crc16的小工具,输入d9 ae 00 35 00 33,但是得到的数据不是b0 f6;输入d9 ae 00 35 00 33+数据,结果也不对。
...全文
552 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
壮哉我大神船 2013-12-05
  • 打赏
  • 举报
回复
搞清楚了,来说一下,然后结贴。 第一,从根本上我就错了,原来校验和不是crc16算出来的,而是“二进制反码求和”,具体百度有; 第二,以上所有所说的TCP,应该是UDP。(不好意思,注意ip头部协议字段是0x11) 第三,计算UDP校验和时,用于计算的数据如下: 源IP地址+目的IP地址+0x0011+UDP数据报总长度+UDP 为什么加0x0011?因为UDP协议号是0x11,必须凑够16位,所以前面补0; 红色即LS所说的伪首部。 另请高人移步小弟另一个帖子的问题,至今无人回答。lcp协议中Echo-Reply格式是什么?我回复了,怎么ISP收不到?http://bbs.csdn.net/topics/390659485 散分走人。
i5146 2013-12-04
  • 打赏
  • 举报
回复
引用 2 楼 u013021969 的回复:
终于有人回复了,首先先表示感谢。然后想进一步问一下: 报文段是指 “数据” 这一部分吗? 伪首部是指什么呢?
报文段包括TCP报头和数据,至于校验和字段怎么处理不太清楚,伪首部指IP报头中的32bit源IP、32bit目的IP,8bit 0,8bit protocol字段,16bit Length字段,具体的可以百度
壮哉我大神船 2013-12-04
  • 打赏
  • 举报
回复
终于有人回复了,首先先表示感谢。然后想进一步问一下: 报文段是指 “数据” 这一部分吗? 伪首部是指什么呢?
i5146 2013-12-04
  • 打赏
  • 举报
回复
TCP中的校验和是计算TCP报文段和伪首部得出的
1.TCP是流传输,所以本质上不该称之为粘包,发送者和接收者都是自顾自的,要一段一段发得选UDP 现象是,你发出3个2048字节的包,发送时会被优化成4096/2048,或者跟之前的包合并,但是取出时却很随意,除了空载时的首个包,其他有可能拆成1-4096大小若干个包 2.“粘包”和“分包”很头疼,但是只要抓住第一个包,问题就解决了一大半 幸运的是,TCP发出的包不是乱序的,这有点像你按顺序写出字节集一样,只要你抓住头部的定义,就能轻而易举解构数据 为此,发送时,首个包要跟前一段数据流有时间间隔,好让之前的Recv操作完成(当然,条件允许可以Recv完成后反馈,发送端收到反馈消息再继续下一波) 3.定义协议结构,各有各的办法,以下代码仅作参考 .版本 2     pocket = 取空白字节集 (#pk_size)     DataAddr = 取变量针 (pocket) + 8     pk_sign = 取字节集数据 (到字节集 (“P_KT”), #整数型, )     写数值ptr (DataAddr, #pk_sign, pk_sign)     写数值ptr (DataAddr, #pk_crch, CRC32all)     写数值ptr (DataAddr, #pk_crc32, CRC32all)     写数值ptr (DataAddr, #pk_SN, 集_SN)     写数值ptr (DataAddr, #pk_remain, size)     CRC32pk = CRC32_PTR (DataAddr, #pk_size)     写数值ptr (DataAddr, #pk_crch, CRC32pk) 4.使用哈希表存储分包数据 我认为哈希表存储的方式是线程安全的,客户句柄是唯一的,一个客户甚至分不到一条线程,该句柄对应的数据地址是唯一的,所以不会出现两条线程同时操作一个内存地址的情形 当然,出现碰撞时,插入链表这个操作不是线程安全的,这个以后优化 5.星光极速模块我只稍微改了一下,把原先字节集操作改成针操作 6.没有选择HP-socket的原因是太庞大了,用来做服务端可以,但是如果作为客户端即使是静态库,编译之后也很大 7.目前涉分包组包的代码不多,其他的运用过程中不断改进 关于哈希表的部分,我专门开了个帖子 https://bbs.125.la/forum.php?mod=viewthreadtid=14659403

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧