zoukankan      html  css  js  c++  java
  • TCP校验和

    检验和目的

            目的是为了发现TCP首部和数据在发送端到接收端之间发生的任何改动。如果接收方检测到检验和有差错,则TCP段会被直接丢弃。

            TCP在计算检验和时,要加上一个12字节的伪首部。

    伪首部

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

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

    检验和计算过程

            TCP首部校验和计算三部分:TCP首部+TCP数据+TCP伪首部。

    发送端:
            首先,把伪首部、TCP报头、TCP数据分为16位的字,如果总长度为奇数个字节,则在最后增添一个位都为0的字节。
            把TCP报头中的校验和字段置为0。
            其次,用反码相加法(对每16bit进行二进制反码求和)累加所有的16位字(进位也要累加,进位则将高位叠加到低位)。
            最后,将上述结果作为TCP的校验和,存在检验和字段中。

    接收端:

            将所有反码相加,高位叠加到低位, 如计算结果的16位中每一位都为1,则正确,否则说明发生错误。  

    验证示例:
              校验和  反码求和过程
            以4bit 为例
            发送端计算:
            数据:   1000  0100   校验和  0000
            则反码:0111  1011               1111
            叠加:   0111+1011+1111 = 0010 0001   高于4bit的, 叠加到低4位      0001 + 0010 = 0011 即为校验和
     
            接收端计算:
            数据:  1000   0100   检验和  0011
            反码:  0111   1011                1100
            叠加:  0111 + 1011 +1100 = 0001 1110  叠加为4bit为1111.   全为1,则正确

    参考:https://www.cnblogs.com/zxiner/p/7203192.html

    参考:https://www.bilibili.com/video/BV154411j7gm?from=search&seid=6568804261643548157&spm_id_from=333.337.0.0

  • 相关阅读:
    vmware workstation 10.0
    成为嵌入式程序员应知道的0x10个基本问题
    Linux嵌入式系统与硬件平台的关系
    vasprintf的实现
    GIT常用命令
    ip地址转化代码实例
    Linux网络编程实例解析
    openwrt的交叉编译
    appium初学者,使用之检查appium环境报错Could not detect Mac OS X Version from sw_vers output: '10.12.1’,
    第二章 mac上运行第一个appium实例
  • 原文地址:https://www.cnblogs.com/fanfuhu/p/15777059.html
Copyright © 2011-2022 走看看