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. Redis清空数据

    进入redis目录下 redis-cli -h IP -p 端口 -a 密码 flushall

  2. html5中的新标签

    header <header> 标签定义文档的页眉(介绍信息). nva 根据W3C的定义规范:nav元素是一个可以用来作为页面导航的链接组: <nav><ul>& ...

  3. Docker for Web Developers目录

    在OpenStack在私有云占主导定位之后,后起之秀Docker在PaaS平台.CI/CD.微服务领域展露锋芒.作为Web Developers,我们有必要学习和掌握这门技术. 1. 运行第一个Doc ...

  4. Linux三剑客之awk最佳实践

    笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 知识点: 记录与字段 模式匹配:模式与动作 基本的awk执行过程 awk常用内置变量(预定义变量) awk数组 a ...

  5. 【转】GLONASS全球卫星导航系统

    GLONASS是“GLOBAL NAVIGATION SATELLITE SYSTE(全球卫星导航系统)”的缩写,作用类似于美国的GPS.欧洲的伽利略卫星定位系统.最早开发于苏联时期,后由俄罗斯继续该 ...

  6. javacript 组合使用构造函数模式和原型模式

    构造函数模式创建对象 基本方法 function Person(name,age){ this.name=name; this.age=age; this.sayName=function(){ al ...

  7. TCP粘包和拆包问题

    问题产生 一个完整的业务可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这个就是TCP的拆包和封包问题. 下面可以看一张图,是客户端向服务端发送包: 1. 第一种情况 ...

  8. Spring 当 @PathVariable 遇上 【. # /】等特殊字符

    @PathVariable注解应该不是新鲜东西了Spring3.0就开始有了 URL中通过加占位符把参数传向后台 举个栗子,如下比较要说的内容比较简单就大概齐的写一下 画面侧 $.ajax({ typ ...

  9. spring重要类说明

  10. 用swing做一个简单的正则验证工具

    直接上代码吧,因为我对swing也不熟悉,照着API一点点拼出来的. import java.awt.event.ActionEvent; import java.awt.event.ActionLi ...