TCP/IP读书笔记(4) IPv4和IPv6 路由选择

网络层是位于链路层之上,TCP/IP模型中网络层的核心协议是IP协议(Internet protocol)。

目前主流的IP协议是IPv4(Internet protocol version 4),但是IPv6(Internet protocol version 6)会是趋势。

IP协议提供不可靠,无连接的数据传输服务,它只负责接受数据包,转发数据库,不维护两端的连接状态。IP层唯一的校验是,IPv4规定通过在路由节点计算校验和来确保IP数据报头是正确的,但是IPv6的时候已经没有了。因为这些本就不该是IP层应该考虑的事情。

IP协议定义了网络层数据包的格式,和如何转发数据包。

IP数据包的格式

IPv6是对IPv4的一个最小扩展,只修改了IP头部,IPv4和IPv6头部数据包的格式,参考TCP/IP卷一第二版第182页。

无论是IPv4还是IPv6,数据包包括两部分:IP头部、IP数据,头部都提供了

  • 版本号 IPv4这个值是4,IPv6是6
  • 包长度 这个数据包的长度
  • 源IP的地址 发送端的IP地址,在IPv4中占4字节,IPv6中占16字节,局域网内传输时通常不会改变,但是如果使用了nat的话,会被修改。
  • 目的IP的地址 完全同上
  • 上层协议号 标识上层协议,列如TCP,UDP,VRRP等。在v4和v6中都只有8位字节,也就是最多256种上层协议。
  • 数据包生存时间 为了防止一个数据包被永远转发下去,需要需要设置:这个数据包被路由器发送“生存时间“次数后如果还是没到达目的地就将它抛弃,每个路由器转发数据包之后都会将生存时间-1,直到它变成0就不再转发。
  • 服务类型 主要是运营商做qos使用,IPv4允许选择置3位优先级级别(现已被忽略),4位TOS(服务类型),包括4种类型:最小时延,最大吞吐率,最高可靠性。IPv6提供8位的Traffic Class(通信级别),类似的作用。

IPv6和IPv4头部的一些主要区别在于:

  • IPv6头部中没有校验和,路由器不需要对每个达到的数据包计算校验和,判断头部是否正确,提高速度。
  • IPv4可以设置分片标识,这里牵扯到上一篇笔记中提到的MTU的概念,如果一个数据包长内容长1400字节又允许分片,而当前路由器的MTU是500,那就会将它分成500,500,400的三部分发出去,如果不允许分片,这个数据包会被丢弃,并产生一个错误。
  • IPv6头部中没有分片标识,它只允许数据发送方决定对数据包进行分片,中间路由器不可以分片,如果发送方的分片不合适,中间路由器会丢弃数据。
  • IPv6支持的服务类型更多,详细可以看思科的这篇文章实现服务质量策略与DSCP

为什么IPv4中传输层,网络层,链路层都有校验和,IPv6网络层不设置校验和?

链路层的校验只能保证数据从一个路由器到另一个路由器中间没有出错(绝大多数情况下能保证)。

数据包到了路由器之后,路由器会把这个数据包拆开,根据下一跳的地址,设置新的链路层头部的目的地址,crc校验值,IP首部的的ttl值,甚至可能还会对数据包进行分片,这样修改的更多了,如果在路由器处理的过程中这个数据出错,那么链路层的校验是发现不了错误的。

所以要保证数据包从发送端到目的地址都没有出错,还需要传输层有自己的校验。
至于网络层的校验,现在看来确实是没必要的,IPv6网络层为了提高速度,已经不再校验。
IPv6中间路由器也不会对数据包进行分片

路由选择

路由转发,ip层通过路由器,将数据从源目的地址发送到目的地址的功能,没啥好说的,大学都很清楚了。
路由转发不仅仅是路由器的功能,服务器也有路由转发,在linux机器上执行route -n可以看到类似下图的结果

当ip层发送一个数据包时:

  • 它会根据目的ip地址,在路由表中搜寻完全匹配的项
  • 如果搜寻不到,搜寻网络地址(cidr中的地址)匹配的项
  • 如果搜寻不到,搜寻默认地址
  • 将数据包从搜寻到的项中的接口对应的设备发出

需要注意的是,使用静态路由时,路由表在以下几种情况可能会被修改:

  • 路由器发现这个数据包不应该被发送给它(路由器r2将数据发给r1,r1发现它需要将数据发给r2)时,产生ICMP重定向错误,告诉发送方直接把数据发给r2
  • 主机或者网卡启动时发送三份路由请求报文,如果收到,就停止发送,根据报文内容更新路由表。可能之前网络是通的,启动了一个网卡之后,默认路由被更改,部分网络不再联通
  • 链路断开时,部分路由项被移除

另外,服务器默认不转发不是由它产生的数据包,可以将网卡配置成混杂模式,当做路由器使用,转发不属于它产生的数据包。

TCP/IP读书笔记(4) IPv4和IPv6 路由选择的更多相关文章

  1. 图解TCP/IP读书笔记(二)

    图解TCP/IP读书笔记(二) 第二章.TCP/IP基础知识 一.TCP/IP出现的背景及其历史 年份 事件 20世纪60年代后半叶 应DoD(美国国防部)要求,美国开始进行通信技术相关的研发 196 ...

  2. 图解TCP/IP读书笔记(一)

    图解TCP/IP读书笔记(一) 第一章 网络基础知识 本学期的信安概论课程中有大量的网络知识,其中TCP/IP占了相当大的比重,让我对上学期没有好好学习计算机网络这门课程深感后悔.在老师的推荐下开始阅 ...

  3. # 图解TCP/IP读书笔记(五)

    第五章.IP协议相关技术 IP旨在让最终目标主机收到数据包,但是在这一过程中仅仅有IP是无法实现通信的,因此还有需要作为为IP的辅助的各种协议支持. 协议 作用 特点 DNS(Domain Name ...

  4. 图解TCP/IP读书笔记(四)

    第四章.IP协议 IP(Internet Protocol,网际协议),作为整个TCP/IP中至关重要的协议,主要负责将数据包发送给最终的目标计算机.因此,IP能够让世界上任何两台计算机之间进行通信. ...

  5. 图解TCP/IP读书笔记(三)

    第三章.数据链路 数据链路层是计算机网络最基本的内容. 数据链路层的协议定义了通过通信媒介互连的设备之间传输的规范. 一.数据链路相关技术 1.MAC地址 关于MAC地址的几个要点: ①MAC地址长度 ...

  6. tcp/ip学习笔记-TCP

    tcp/ip学习笔记-TCP 彭会锋 报文发送采用的是tcp_output函数,

  7. TCP/IP学习笔记(3)-IP、ARP、RARP协议

    这三个协议放到一起学习是因为这三个协议处于同一层,ARP协议用来找到目标主机的Ethernet网卡Mac地址,IP则承载要发送的消息.数据链路层可以从ARP得到数据的传送信息,而从IP得到要传输的数据 ...

  8. TCP/IP学习笔记(3)----IP,ARP,RARP协议

    把这三个协议放到一起学习是因为这三个协议处于同一层(网络层协议),ARP协议用来找到目标主机的Ethernet网卡Mac地址,IP则承载要发送的消息.数据链路层可以从ARP得到数据的传送信息,而从IP ...

  9. 《图解TCP/IP》笔记

    OSI参考模型 协议分层 为什么需要分层? 简化网络协议. 每一层只需要衔接上下层的服务. 利于模块化开发. 解耦. 分层的问题 过分模块化.提高数据处理的开销. OSI参考模型 作用及意义 将复杂的 ...

随机推荐

  1. 浅谈Await

    1.Await为什么不会导致堵塞 我们都知道Await关键字是.Net FrameWork4.5引入的特性.await使得我们使用异步更加时特别便捷,并且还不会导致线程堵塞.我们在使用时也就莫名其妙的 ...

  2. 微信开发获取media_id错误码汇总

    微信开发遇到的错误汇总: 1. 错误代码40001 "errcode": 40001,    "errmsg": "invalid credentia ...

  3. Mysql之左连接右连接内连接——示例 (转)

    下面是两张表 表stu 表tech 1.右连接 当使用右连接语句查询时,返回结果如下: 1 SELECT stu.id,stu.name,stu.classe_name,tech.id,tech.na ...

  4. 【转】ArcGIS中File Geodatabase与Personal Geodatabase的区别

    原文地址:ArcGIS中File Geodatabase与Personal Geodatabase的区别作者:最爱忆宝贝 一.平台支援: 1.Personal Geodatabase:仅可在Windo ...

  5. 简述 Hibernate 和 JDBC 的区别、优缺点

    1.hibernate是一个开源的.采用面向对象的思想实现ORM映射框架,它对jdbc进行了一层封装,对于数据库的连接.关闭.数据的持久化(增删改查).事务的管理都进行了封装,使得程序开发的时候可以用 ...

  6. ASP.NET Core Web API下事件驱动型架构的实现(三):基于RabbitMQ的事件总线

    在上文中,我们讨论了事件处理器中对象生命周期的问题,在进入新的讨论之前,首先让我们总结一下,我们已经实现了哪些内容.下面的类图描述了我们已经实现的组件及其之间的关系,貌似系统已经变得越来越复杂了. 其 ...

  7. bzoj 2208 [Jsoi2010]连通数

    2208: [Jsoi2010]连通数 Time Limit: 20 Sec  Memory Limit: 512 MB Description Input 输入数据第一行是图顶点的数量,一个正整数N ...

  8. [Bug] 解决 Sql Server 数据库死锁问题

    SELECT request_session_id spid, OBJECT_NAME(resource_associated_entity_id) tableName FROM sys.dm_tra ...

  9. 洛谷 [P2761] 软件补丁问题

    并不是网络流 状压+SPFA 通过题目中的描述及数据范围可知,我们状压当前的漏洞,以每个二进制位表示是否有这个漏洞,并以状压的结果为顶点,以补丁的时间为边跑SPFA即可 #include <io ...

  10. 【STL】c++ priority_queue的使用方法

    最开始在项目文档看到priority_queue这个模板时,还以为是自己定义的呢,后来查了一下,原来这是STL中存在的一种优先队列. 1.最简单的使用方法 std::priority_queue< ...