传输层和网络层的checksum区别,TCP cksum为何包含伪首部
一直搞不清传输层和网络层的校验和为什么校验内容不一样,最近问了一些前辈,找寻了一些答案,总结一下自己的思考。
先说一下传输层(TCP)和网络层(IP)的校验和:
- TCP校验和有伪首部、TCP herder、数据段。而IP的校验和只覆盖IP header,不覆盖IP数据报中的任何数据。TCP校验和、IP校验和的计算方法是一致。
- TCP的校验和是必需的,而UDP的校验和是可选的。
- 12字节伪首部:源IP地址、目的IP地址、保留字节(置0)、传输层协议号(TCP是6)、TCP报文长度(报头+数据)。
先提出三个问题:
- 为什么IP算的cksum只有头部呢?TCP却包含数据?
- 这个伪首部啥意思,为什么叫'伪'?
- 为何TCP算的cksum又加上伪头部呢?
为什么IP算的只有ip header呢?TCP却包含数据?
让我们先回顾一下计算机网络里说到的TCP五层模型,现实中是把物理层和数据链路层放一起了,都叫链路层。
- 应用层 (application layer):应用进程提供服务
- 传输层 (transport layer):为进程提供通信服务,为上层提供端到端(最终用户到最终用户)的透明的、可靠的数据传输服务。拥塞控制,流控都在这。
- 网络层 (internet layer):为主机提供通信服务
- 数据链路层 (data link layer):为同一链路主机提供数据传输服务
- 物理层 (physical Layer):确保数据可以在各种物理媒介上进行传输,为数据的传输提供可靠的环境。
首先,其实每一层都有自己的校验方法?为什么?校验算法没法百分百保证正确,越早发现越早丢弃。
我自己的理解:每个层都是有自己负责的内容,按照这个思路去看。数据先加端口号封装传输层,传输层负责的是为进程通信确保了送到主机上正确的port(进程绑定的port)。加ip封装网络层,ip层只是负责送到正确的机器上。加mac封装物理层,控制网卡需要网卡驱动程序,网卡驱动从ip模块获得包后将其复制到网卡的缓存中,然后在头部加报头和起始帧分界符,末尾加上帧校验序列(循环冗余算法(CRC)生成的fcs校验序列)。经过网卡将数字信号转化为电信号,通过网线发送出去。这里负责的是真正传输内容。首先链路层这里是简单确保整个报文没有被改变,交换机会解析MAC然后校验这个fcs,这里链路层保证数据可靠专属。路由器收到之后会解析到ip header,计算fcs和ip校验和,也就是路由器里面相当于也有fcs保证数据的正确,尽管很羸弱,ip层的任务就是只确保ip是对的,就像贴在箱子上的快递单做的事情,不关心箱子里的东西对不对,当然路由器会查表封装新的MAC头从计算fcs。真正到了主机,也会校验fcs,ip校验和,到了传输层,需要向上交付数据,所以传输层这里校验和会包含数据段。
TCP/IP地分层,让每一层注重自己的事情,IP不会过问数据,TCP层需要保证数据,但是为什么链路层有了校验,还需要其它层保证呢?举个简单的例子,路由器拆了以太帧头之后放到自己的缓冲区,在缓存去里这个时候报文出错了,路由器吧错误的报文计算一下fcs,封装好,继续发,这样之后链路层再校验,也没问题,还是需要更上层的校验。
刚才说的这些校验都是低级的校验,TCP/IP提出的时代,设备能力还是很差的,只能用这种简单的CRC去校验,但比如一个"10 20"变成的"20 10",对于CRC是校验不出来的,因为CRC只管累加没问题。
这个伪首部啥意思,为什么叫'伪'?
12字节伪首部:源IP地址、目的IP地址、保留字节(置0)、传输层协议号(TCP是6)、TCP报文长度(报头+数据)。
计算checksum时,其实整个包的信息都可以获取,传输层直接从ip header拿出源ip、目的ip、传输协议号用来计算checksum,这些字段并不是在tcp报文里,所以是伪,只是计算时带上而已。
收端也是,收到之后连带这几个字段校验一下,实际上tcp报文并没有这几个字段的内容。
为何TCP算的cksum又加上伪头部呢?
这更算一个历史遗留问题,过去还没有光纤,没有现在这些可靠性高的传输技术,之前线路误码率非常高,为了确保数据包到收端的正确性,这又相当于多加了一点保证,并且几乎没有损失性能。
IPV6和IPV4
IPV6省略了IP层的校验和,引入了更加可靠的链路层错误检测和纠正机制。因为当前的设备不再像之前错误那么多,付出校验所有包的代价去转发,并不值得,有其他更好的错误检测,这样像路由器这样的网络设备,就不需要再校验了,提高了性能。
延伸
推荐读一下这个论文:https://zhuanlan.zhihu.com/p/55311553
传输层和网络层的checksum区别,TCP cksum为何包含伪首部的更多相关文章
- OSI参考模型(应用层、表示层、会话层、传输层、网络层、数据链路层、物理层)
文章转自:https://blog.csdn.net/weixin_43914604/article/details/104589085 学习课程:<2019王道考研计算机网络> 学习目的 ...
- TCP/IP参考模型(应用层、传输层、网际层、网络接口层)、五层参考模型(应用层、传输层、网络层、数据链路层、物理层)、OSI与TCP/IP参考模型比较
文章转自:https://blog.csdn.net/weixin_43914604/article/details/104597450 学习课程:<2019王道考研计算机网络> 学习目的 ...
- 传输层-Transport Layer(下):UDP与TCP报头解析、TCP滑动窗口、TCP拥塞控制详解
第六章 传输层-Transport Layer(下) 上一篇文章对传输层的寻址方式.功能.以及流量控制方法做了简短的介绍,这一部分将介绍传输层最重要的两个实例:TCP协议和UDP协议,看一看之前描述的 ...
- [19/04/13-星期六] 网络编程_基本概念(关注传输层、数据传输,TCP和UDP)
一.概念 ▪ 什么是计算机网络? 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统, 网络管理软件及网络通信协议的管理和协调下,实现资源共享和信 ...
- 传输层的TCP和UDP协议
作者:HerryLo 原文永久链接: https://github.com/AttemptWeb... TCP/IP协议, 你一定常常听到,其中TCP(Transmission Control Pro ...
- TCP/IP传输层,你懂多少?
1. 传输层的主要功能是什么?2. 传输层如何区分不同应用程序的数据流?3. 传输层有哪些协议?4. 什么是UDP协议?5. 为什么有了UDP,还需要TCP?6. 什么是TCP协议?7. 怎么理解协议 ...
- 稳住,传输层里的TCP与UDP协议
传输层协议 1.TCP协议介绍及报文格式 2.TCP三次握手三次挥手 3.UDP协议介绍 1.传输层有两个协议:TCP(传输控制协议) UDP(用户数据协议) . TCP是面向连接的,可靠的进程到进 ...
- Windows网络驱动、NDIS驱动(微端口驱动、中间层驱动、协议驱动)、TDI驱动(网络传输层过滤)、WFP(Windows Filtering Platform)
catalog . 引言 . Windows 2000网络结构和OSI模型 . NDIS驱动 . NDIS微端口驱动编程实例 . NDIS中间层驱动编程实例 . NDIS协议层驱动编程实例 . TDI ...
- 传输层-Transport Layer(上):传输层的功能、三次握手与四次握手、最大-最小公平、AIMD加法递增乘法递减
第六章 传输层-Transport Layer(上) 6.1传输层概述 在之前的几章内容中,我们自底向上的描述了计算机网络的各个层次,还描述了一些处于不同层次下的经典网络协议(如以太网.无线局域网.或 ...
- 以QQ举例 说明计算机网络中的一些概念区别(TCP与UDP,广播与单播)
QQ 中的 广播与单播 今天简单地学习了一下 广播和多播(组播) 的知识.关于 单播和多播 的概念,可以用 QQ 中的一些例子来解释. 单播,就像 两个人聊QQ 一样,信息的接收和传递只在两个节点之间 ...
随机推荐
- mysq 报错, sql语句在数据库里运行正常, 在内网测试正常,打包放外网的时候就报下面错误
sql语句为: select t1.day as day , any_value(IFNULL(t2.avgNum,0)) as avgNum, any_value(IFNULL(t2.maxNum, ...
- Vue2路由跳转传参,获取路由参数,Vue监听路由
1 this.$router.push({ 2 // name:路由组件名 3 name: routeName, 4 query: { 5 mapId:this.mapId 6 } 7 }) 8 9 ...
- opencv3 7.3 重映射 仿射变换
重映射的概念 将一幅图像某位置的像素放置到另外一幅图像的指定位置上,需要对非整数像素坐标重映射来表达每个像素的新位置. g(x,y)=f(h(x,y)); 实现重映射 remap()函数 dst(x, ...
- C++ PTA 本题要求实现一个计算m和n之间所有整数的和
6-2 2020mhb_函数_求和 (10分) 本题要求实现一个计算m和n之间所有整数的和(求和时需要将m和n也加入到和中)的函数.注意:如果m<=n则计算m到n的所有整数之和,如果m> ...
- idea中ueditor的入门
首先在https://github.com/fex-team/ueditor下载ueditor1_4_3_3-utf8-jsp.zip:解压去掉里边jsp中的bin目录放到项目中的webapp中: 添 ...
- wait_event_interruptible() 等待队列
在Linux驱动程序中,可以使用等待队列(Wait Queue)来实现阻塞进程的唤醒. 1.定义"等待队列头部" wait_queue_head_t my_queue; wait_ ...
- jmeter 变量的使用
jmeter添加变量 一.添加用户自定义变量 添加用户自定义变量 作用:常用数据参数化.当变量发生变化时,不需要逐个脚本修改,只需要修改用户自定义中的变量就可以了. 变量使用如下图 二.函数助手定义变 ...
- 设计模式 (Design Pattern)C# -- 简介
简介 设计模式(Design Pattern)是对面向对象设计中反复出现的问题的解决方案. 设计模式代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用. 设计模式是软件开发人员在软件开发过程 ...
- Code UTF-8 Console GB2312 Linux 中文乱码
Linux 系统方法: LD_LIBRARY_PATH=. ./userdemo | iconv -f GB2312 -t utf8 Shell 方法 Shell 编码 改成GB2312 // 编 ...
- Linux子系统之【内存管理】
1.内存管理的意义? 内存是进程运行的地方,相当于是战场.完善的机制能让进程多快好省地运行. 2.原始内存管理是怎么样的? 简陋(直接运行在物理内存上).不安全(无隔离,无权限) 缺点:容易出错,进程 ...