一直搞不清传输层和网络层的校验和为什么校验内容不一样,最近问了一些前辈,找寻了一些答案,总结一下自己的思考。

先说一下传输层(TCP)和网络层(IP)的校验和:

  • TCP校验和有伪首部、TCP herder、数据段。而IP的校验和只覆盖IP header,不覆盖IP数据报中的任何数据。TCP校验和、IP校验和的计算方法是一致。
  • TCP的校验和是必需的,而UDP的校验和是可选的。
  • 12字节伪首部:源IP地址、目的IP地址、保留字节(置0)、传输层协议号(TCP是6)、TCP报文长度(报头+数据)。

先提出三个问题:

  1. 为什么IP算的cksum只有头部呢?TCP却包含数据?
  2. 这个伪首部啥意思,为什么叫'伪'?
  3. 为何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为何包含伪首部的更多相关文章

  1. OSI参考模型(应用层、表示层、会话层、传输层、网络层、数据链路层、物理层)

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/104589085 学习课程:<2019王道考研计算机网络> 学习目的 ...

  2. TCP/IP参考模型(应用层、传输层、网际层、网络接口层)、五层参考模型(应用层、传输层、网络层、数据链路层、物理层)、OSI与TCP/IP参考模型比较

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/104597450 学习课程:<2019王道考研计算机网络> 学习目的 ...

  3. 传输层-Transport Layer(下):UDP与TCP报头解析、TCP滑动窗口、TCP拥塞控制详解

    第六章 传输层-Transport Layer(下) 上一篇文章对传输层的寻址方式.功能.以及流量控制方法做了简短的介绍,这一部分将介绍传输层最重要的两个实例:TCP协议和UDP协议,看一看之前描述的 ...

  4. [19/04/13-星期六] 网络编程_基本概念(关注传输层、数据传输,TCP和UDP)

    一.概念 ▪ 什么是计算机网络? 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统, 网络管理软件及网络通信协议的管理和协调下,实现资源共享和信 ...

  5. 传输层的TCP和UDP协议

    作者:HerryLo 原文永久链接: https://github.com/AttemptWeb... TCP/IP协议, 你一定常常听到,其中TCP(Transmission Control Pro ...

  6. TCP/IP传输层,你懂多少?

    1. 传输层的主要功能是什么?2. 传输层如何区分不同应用程序的数据流?3. 传输层有哪些协议?4. 什么是UDP协议?5. 为什么有了UDP,还需要TCP?6. 什么是TCP协议?7. 怎么理解协议 ...

  7. 稳住,传输层里的TCP与UDP协议

    传输层协议 1.TCP协议介绍及报文格式 2.TCP三次握手三次挥手 3.UDP协议介绍 1.传输层有两个协议:TCP(传输控制协议)  UDP(用户数据协议) . TCP是面向连接的,可靠的进程到进 ...

  8. Windows网络驱动、NDIS驱动(微端口驱动、中间层驱动、协议驱动)、TDI驱动(网络传输层过滤)、WFP(Windows Filtering Platform)

    catalog . 引言 . Windows 2000网络结构和OSI模型 . NDIS驱动 . NDIS微端口驱动编程实例 . NDIS中间层驱动编程实例 . NDIS协议层驱动编程实例 . TDI ...

  9. 传输层-Transport Layer(上):传输层的功能、三次握手与四次握手、最大-最小公平、AIMD加法递增乘法递减

    第六章 传输层-Transport Layer(上) 6.1传输层概述 在之前的几章内容中,我们自底向上的描述了计算机网络的各个层次,还描述了一些处于不同层次下的经典网络协议(如以太网.无线局域网.或 ...

  10. 以QQ举例 说明计算机网络中的一些概念区别(TCP与UDP,广播与单播)

    QQ 中的 广播与单播 今天简单地学习了一下 广播和多播(组播) 的知识.关于 单播和多播 的概念,可以用 QQ 中的一些例子来解释. 单播,就像 两个人聊QQ 一样,信息的接收和传递只在两个节点之间 ...

随机推荐

  1. 安装ELK(Elasticsearch、Kibana、Logstash)

    1.首先准备两台centos7虚拟机(关闭防火墙)(到步骤3为止都是两台虚拟机都要准备的) 2.传入安装包 3.解压ELK.进入解压后ELK文件.解压jdk文件 4.在ip为41的虚拟机上安装Elas ...

  2. Check If Binary Tree Is Completed

    Check if a given binary tree is completed. A complete binary tree is one in which every level of the ...

  3. 基于python-nmap的扫描代码

    本次代码只利于人员进行分析,没有啥用,小学期作业,被迫工作. 1 import tkinter 2 from tkinter import * 3 import time 4 import nmap ...

  4. NGINX+Lua模块编译安装

    NGINX+Lua 环境配置 目录 NGINX+Lua 环境配置 一.环境装备 二.解压安装相应的软件 测试Lua环境 上面都是经过安装的一些坑之后安装完成的,下面是安装过程中出现的坑 一.环境装备 ...

  5. AX2012 使用HTML自定义popup内样式

    在Class Box下新增方法如下: public client static DialogButton yesNoHTML( str _text, DialogButton _defaultButt ...

  6. 怎样修改linux内核

    1.先查看linux内核 uname -a 2.打开内核配置文件 sudo vi /etc/default/grub 3.跟新grub文件 sudo update-grub 4.最后重启电脑 sudo ...

  7. visio使用直线绘图后不能更改

    选中图形->开发工具->行为

  8. C# 锁汇总

    一.前言 本文章汇总c#中常见的锁,基本都列出了该锁在微软官网的文章,一些不常用的锁也可以参考微软文章左侧的列表,方便温习回顾. 二.锁的分类 2.1.用户模式锁 1.volatile 关键字 vol ...

  9. Pintia 7-3 列车调度

    7-3 列车调度 (25 分) 火车站的列车调度铁轨的结构如下图所示. 两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道.每趟列车从入口可以选择任意一条轨 ...

  10. SQL Server 手工 锁表、查询被锁表、解锁相关语句

    SQL Server 手工 锁表.查询被锁表.解锁相关语句 --锁表(其它事务不能读.更新.删除) BEGIN TRAN SELECT * FROM <表名> WITH(TABLOCKX) ...