TCP/UDP伪头部检验

来源:互联网 发布:分类目录源码 编辑:程序博客网 时间:2024/05/21 14:47

用Socket发送自定义TCP数据包:
pseudo header”这里翻译为伪真报头
传输控制协议(TCP),旨在为IP互联网上的 一对设备之间提供可靠的数据传输。需要许多工作来确保数据分发,主要集中的问题是确保数据在传输途中不丢失。但是还有一个重要关键阻碍了数据的安全传输:数据在整个互联网传输时在TCP段存在出错的风险。

使用校验和检测传输错误
如果数据到达指定地点但是已损坏并且我们没有检测出来,这在有些时候比数据包没有到达更为糟糕。为了提供防止传输过程损坏的基本保障,TCP在其报头中包含了16bit的校验和字段。校验和背后的思想非常简单:取包含一连串的数据字节,把他们加在一起。然后跟随数据流发送这个和,并且要求接受检验这个和。在TCP中,一种特殊的方法被发送这个字段的设备计算这个校验和,相同的方法也将在接受方接受到数据后用来检验这个和,以确保没有任何错误。
TCP使用的校验和计算方法和普通的校验和算法有些区别:传统的校验和方法在于对所有字节提供保护,并且检测出那些字段可能存在的任何错误。TCP的设计者想要的就是这种每个字节的保护,但也想要防止其他类型的问题。

增加检验误差范围:TCP伪真报头
为此,TCP检验和计算做了一个改变。这个特殊的计算方法最终也被UDP所采用。除了对TCP段所有真实数据做校验和计算以外,一个12bit的TCP伪真报头在校验和计算之前被创建。这个报头包含来自TCP报头和IP数据包中的重要信息将被封装成TCP字段。
要计算TCP段报头的Checksum域的值,TCP伪真包头首先被创建和放置,从逻辑上讲,放在TCP段之前。然后对所有TCP段以及TCP伪真报头进行校验和计算。最后TCP伪真报头被丢弃。
当TCP段到达目的地,接收方的软件将执行同样的计算,它将根据TCP段中的真实数据行程一个TCP伪真报头,然后执行校验和计算(计算之前设置Checksum域值为零)。假如计算出来的结果跟源设备(Source device)放置在checksum域的值不匹配的话,这表明发生了某种类型的错误,通常这个字段将会被丢弃。

伪真报头方法的优势
那么,为什么要使用伪真报头呢?源设备和目的设备都同样使用伪真报头中的checksum域来计算校验和。这也就是说,如果出于任何原因,这两个设备对于伪真报头有了不同的校验和值,那么校验失败。现在,当我们考虑下报头中有什么时,发现checksum不仅使得TCP字段不出错还要防止:
不正确段发送:假如在源指定和目的所在段的目的地址不匹配,那么校验将失败。同样如果是源地址不匹配,校验也不会成功。
不正确协议:如果一个数据报被路由到TCP,实际上不管什么原因却属于不同的协议 ,这是可以立即检测到。
不正确的段长度:如果TCP段部分被意外遗漏,源长度和目的长度(Length of source and destination)将不匹配,校验将失败。
使用伪真报头的明智之处在于,用它来计算校验和,我们能提供这些保护,而不必真的发送为报头本身的那些域。从而消除了用在伪真报头中的TCP的IP域的重复使用;避免了冗余和带宽的浪费。其缺点在于这种计算校验和的方法需要更多的时间和精力(尽管这一问题在今天已经不存在了!)
在今天现代的、告诉的、可靠的网络环境,使用伪真报头有些时候看起来似乎有些“过时”。有多少可能数据将被传送到一个错误的地址呢?可能性不大。然而在TCP被创建时,一个比较关注的点是不大可能在IP层点对点的检查发送的数据。包括TCP中的IP信息,校验和被看成是一个有用的额外层的保护。
当然了,还有一个有趣的TCP伪真报头的含义:它违反了TCP设计者试图尊重TCP,IP分层的层次架构原则。对于校验,TCP必须知道IP信息,而技术上它不应该知道。TCP校验和就散要求,例如需要从接受端获取的IP数据包含递给TCP层的IP报头中的协议号。TCP伪真报头是一个回避严格层次架构的实用性很好的例子。
最后,TCP还支持一个可选方案:两个设备一致实用另一种校验和算法,当然这需要在建立连接时相互协商

0 0
原创粉丝点击