网络层概述:

IP服务的特点:
IP协议为上层协议提供无状态、无连接、不可靠的服务。

无状态:IP通讯双方不同步传输状态的信息,因此所有IP数据报发送、传输、接收都是相互独立的,没有上下文关系。这样同时也暴露了IP协议的缺点:无法处理乱序和重复的IP数据报
优点:简单、高效,因为不需要为保持通讯的状态而分配内核数据结构,也就是说没有必要为每次传输数据都携带状态信息,在网络协议中无状态是非常常见的,比如UDP协议和HTTP协议都是无状态的协议,我们在浏览器中连续两次浏览网页,它们之间是没有任何联系的,这两次请求都会被web服务器独立处理。

无连接:是指IP通讯双方都不长久的维持对方的任何信息。这样上层协议每次发送数据的时候都必须明确指定对方的IP地址。 是面向连接的协议而言的,比如说TCP协议,他能够自己处理乱序、重复的报文段,提交给上层协议的内容绝对是有序的、正确的。

不可靠:是指IP协议不能保证IP数据报准确的到达接收端,只是尽力而为。在网络环境中很多情况都会导致IP数据报发送失败,比如:接收端发现接收到的IP数据报不正确,该IP数据报就会被丢弃,同时返回给上层一个ICMP错误消息。但是IP协议并不会试图重传错误的数据报,因此使用IP协议的上层协议都需要自己实现超时重传、数据确认等机制,最终来达到可靠传输的目的。

IPv4的头部结构:

4位版本号:指定IP协议的版本,对于IPv4来说它的值为4。
4位头部长度:标识了该IP头部有多少个4字节。
8位服务类型:其中包括3位的优先权字段(现在已经基本忽略掉了)、4位的TOS字段、1位保留字段。4位的TOS字段分别表示是最小延时、最大吞吐量、最高可靠性和最小费用。从这里发现IP服务是一种可弹性的服务(这四种服务中可以任选一种服务),应用程序可以根据实际需要来选择这些服务,比如:应用层的Telnet协议(远程登录协议)需要的是最小延时的服务、FTP协议(文件传输协议)需要的是最大吞吐量的服务。
16位总长度:指的是整个IP数据包的长度。以字节为单位。

下边一行的三个字段:表示的是如何实现IP的分片。
16位标识:唯一的标识主机发送的每一个数据报,初始值由系统随机生成,没发送一个数据报,它的值就加1。同时该值在数据报分片时被复制到每一个分片中,因此同一个数据报的所有分片都具有相同的标识值。
3位标志:第1位是有保留的、第2位表示禁止分片(如果设置了这1位,IP数据报将不会对数据进行分片,在这种情况下,如果IP数据报的长度超过MTU的话,IP模块就会丢弃这个数据报,并返回一个ICMP差错报文)、第3位标识更多分片(除了数据报的最后一个分片外,其他分片都把它设置为1)。
13位片偏移:是分片相对原始IP数据报开始处的偏移

8位生存时间:是数据报到达目的地之前所允许经过的路由器跳数,是被发送端设置的。数据报再转发工程中没经过一个路由,该值就会被路由器减1,当值为0时,路由器将丢弃这个数据报,并向原端发送一个ICMP差错报文,这个数据就可以防止数据陷入路由循环。
8位协议:是用来区分上层协议的,ICMP是1,TCP是6,UDP是17。
16位头部校验和:是由发送端填充,接收端对其利用CRC校验算法来检验IP数据报的头部数据在传输过程中是否被损坏。
32位原端IP地址和32位目的端IP地址:用来标识数据报的发送端和接收端,一般情况下这两个数据在整个IP数据报发送过程中保持不变,无论中间经过多少个中转路由器。
选项:是可变长的可选信息,最多包含40个字节,可选IP选项包括:
1.记录路由(告诉数据报途经的所有路由器都将自己的IP地址填入IP头部的选项部分,这样就可以跟踪数据报的传输路径)
2.时间戳(告诉我们一个路由器都将数据报被转发的时间填入IP头部的选项部分,这样就可以测量途经路由之间的数据报的传输时间)
3.松散源路由选择(指定一个路由器IP地址列表,数据报发送过程中必须经过其中所有的路由器)
4.严格源路由选择(和尚一个选项类似,不过数据报只能经过被指定的路由器)

网络层作用:

IP的分片:
IP数据报的长度超过帧的MTU时,将会被分片传输。
分片可能发生在发送端,也可能发生在中转路由器上。而且可能在传输过程中被多次分片,但只有在最终的目标机器上这些分片才会被内核中的IP模块重新组装

IP头部中的三个字段给IP分片和重组提供了足够的信息:数据报标识、标识和片偏移。
一个IP数据报的每个分片都有自己的IP头部,它们就有相同的标识值,但具有不同的片偏移,并且除了最后一个分片外,其他的分片都将设置MF标志,同时每个分片IP头部的总长度字段都会被设置为该分片的长度,我们知道以太网帧的MTU是1500字节,因此它携带的IP数据报数据部分最大为1480字节,因为IP头部占用了20个字节。加入用IP数据报封装长度为1481字节的ICMP报文,那么数据报在使用以太网帧传输过程中就会被分片。如下图:

上图中,是长度为1481字节的ICMP报文被分为两个分片。
第一个IP分片为1500字节,第二个IP分片位21字节。
同时每个IP分片都包含了自己的IP头部,原始IP数据报中的ICMP头部内容被完整的复制到了第一个IP分片中。
第二个IP分片不包含ICMP头部信息,因为IP模块重组该IP报文的时候,只需要一分ICMP头部信息就可以了。

实例演示IP分片的过程:

第一个终端:使用ping命令向百度发送数据,并指定每次发送1473字节的数据

这里指定发送1473字节的数据的原因是为了强制IP数据报分片(如上图中发送的数据量一致)。

第二个终端:使用tcpdump抓取ping命令中交换的icmp数据报

上图是使用tcpdump命令抓取到的icmp数据报。
红色方块中的内容是一条icmp数据报,原因是id都是9730,说明是同一个IP数据报的分片。
“offset 0”、“offset 1480”:这里的0和1480表示的是偏移值为0和1480。实际上很显然的说明第二个中的1480的偏移值实际上就是第一个IP分片的长度。
“flags[+]”:+设置的是MF标志,以表示后续还有分片。
“flags[none]”:none表示的是这条IP数据报后续没有分片了。
”length 1500“:表示第一个IP分片的长度是1500个字节。
”length 21“:表示第二个IP分片的长度是21个字节。

IP路由选择机制:

路由选择是IP协议的一个核心的任务,它决定了发送数据报到目标机器的途经。

IP路由选择的过程:
1. 查找完全匹配的主机IP地址(如果找到就使用该路由项,如果没有找到就进入第二个步骤)
2. 查找路由表中与目标IP地址具有相同网络ID的网络IP地址(如果找到就是用这一个路由项,如果没有找到就进入第三个步骤)
3. 选择默认路由项(通常这意味这数据包的下一跳路由是网关)

IP转发

前边也提到如果不是发送给本机的IP数据报就会被由数据报转发子模块来处理,路由器都能执行数据报的转发过程,而主机一般只发送和接受数据报。
对于允许IP数据报转发的系统,数据报转发模块对数据报执行如下的操作:

  1. 检查数据报头部的TTL值(如果TTL值为0,则丢弃这个数据报)
  2. 查看数据报的严格源路由选择选项(如果该选项被设置,那么检测数据报的目的IP地址是否和本机的某个IP地址相同,如果不是,发送一个ICMP差错报文)
  3. 给源端发送一个ICMP重定向报文(告诉它下一个更合适的下一跳的路由器)
  4. 将TTL值减1
  5. 处理IP头部选项
  6. 如果有必要,执行IP分片操作

实例演示路由表更新的过程:

route       #查看当前主机下的路由表信息
route add -host 192.168.1.111 dev eth0      #添加主机(192.168.1.111)对应的路由项
route del -net 192.168.15.0 netmask 255.255.255.0       #删除网络(192.168.15.0)对应的路由项

上图中的第一条(defalut ….)是此系统下的默认路由。

ICMP协议详解

ICMP报文格式:

上图中的8位的类型和8位的代码一起决定了IMCP报文的类型。
类型为8,代码为0时:表示回显请求
类型为0,代码为0时:表示回显应答
类型为11,代码为0时:表示超时

ICMP报文具体分为查询报文和差错报文两大类。
ICMP查询报文:
ICMP查询报文的大小为40个字节。
查询报文共有4种:

  • 回送请求和应答报文
    回送请求报文是由主机或路由器向一个特定的目的主机发送的询问。收到此报文的机器必须给源主机发送ICMP回应应答报文。这种询问报文用来测试目标主机是否可达以及了解其他状态

  • 时间戳请求和回答报文
    它允许系统向另一个系统查询当前的时间,该ICMP报文的好处是它提供了毫秒级的的分辨率。而利用其他方法从别的主机获得的时间只能提供秒级的分辨率。请求端填写发起时间然后发送报文,应答系统收到请求报文时填写接收时间戳,再发送应答报文时填写发送时间戳。

  • 掩码地址请求和回答
    主机使用ICMP地址掩码请求报文可以向子网掩码服务器得到某个接口的地址掩码,系统广播它的ICMP请求报文,ICMP报文中的标识符和序列号字段有发送端任意选择设定,这些值在应答中都会被返回,这样发送端就可以把应答和请求进行匹配。
  • 路由器询问和通过
    主机使用ICMP路由器询问和通过报文可了解链接在本网络上的路由器是否正常工作。主机将路由器询问报文进行广播,收到询问报文的一个或多个路由器就使用路由器通过报文广播其路由选择信息。eg:ping命令
    ping命令的实现机制:
    在Linux中实现ping命令是把ICMP的标识字段标志成发送进程的ID号,这样同一台主机上同时运行多个ping命令时,ping命令也可以识别出返回信息,而且一般序列号是从0开始,没发送一个新的回响请求就加1,ping程序打印出返回的每一个分组的序列号,这样就允许我们查看是否有分组丢失、失去或者重复的现象。同时通过在ICMP报文中存放发送请求的时间值来计算往返时间,当应答返回时,用当前时间减去存放在ICMP报文中的时间值,就是两个主机之间的往返时间值。

ICMP差错报告报文共有5种:

  • 终点不可达
    终点不可达分为:网络不可达、主机不可达、协议不可达、端口不可达以及源路由失败这六种情况。代码字段分别为0~5。
  • 源站抑制
    当路由器或主机由于拥塞而丢弃数据包时,就向源站发送源站抑制报文,是源站知道应当将数据报的发送速度放慢。
  • 时间超时
    当路由器收到生存时间为0数据报时,除丢弃该数据报外,还要向源站发送时间超时报文。当目的站在预先规定时间之内不能够接收到一个数据报的全部数据,就将已收到的数据报分片都丢弃,并且向源站发送时间超时报文。
  • 参数问题
    当路由器目的主机收到的数据报中的首部字段的值不正确时,就丢弃该数据报,同时向源站发送参数问题报文。
  • 改变路由(重定向)
    路由器将改变路由报文发送给主机,让主机知道下一次应该将数据包发送给另外的路由器。
    重定向报文的详细信息:
    ICMP重定向报文的格式:

    ICMP重定向报文的类型值为5。
    代码字段有四个可选项,用来区分不同的重定向类型。1:表示主机重定向。主机重定向的详细内容:ICMP重定向报文给接收方提供了两个信息,第一个是引起重定向的IP数据报的原端IP地址,第二个是应该使用的路由器IP地址。那么接收主机根据这两个信息就可以断定引起IP重定向的IP数据报应该使用哪个路由器来进行转发,并且以此来更新路由表。
    这里有一个思考问题:如果我们想知道从主机A发送到主机B的数据包在网络中经过了哪些路由器的时候,我们该怎么办?
    解决方法:
    我们知道当IP数据报在路由中出错时,路由器会向原端发送一个ICMP错误报文,发送端从该ICMP报文中可以得到该路由的IP。
    我们就可以利用以上的原理,要得到从主机A到主机B之间的所有路由器的IP,我们就必须让IP数据包在每个路由器中都出错一次。这里我们知道TTL值在经过每个路由器时都会减1,所以我们可以利用TTL的超时信息,让TTL的值变为0这种情况在每个路由器中都发生一次,这样我们就可以得到从主机A到主机B之间的所有的路由的IP。
    问题:怎样判断数据包正确到达了目标主机B?
    解决方法:
    我们知道数据包正确到达了目标主机B,就不会发送TTL超时错误,而且在目标主机B中没有相对应的应用程序,因此将没有程序回应我们发送的数据包,那么我们将如何知道IP数据包正确到达了目标主机呢?
    其实我们可以为目标主机分配一个目标主机几乎不可能监听的端口,从而当IP数据包到达目标主机后,目标主机会恢复相应的端口不可达的ICMP错误信息,从而我们可以确认IP数据包已经到达了目标主机。

IP协议详解---Linux学习笔记相关推荐

  1. TCP/IP协议基本概括+ARP协议详解+DNS协议详解---Linux学习笔记

    TCP/IP协议的体系结构: TCP/IP协议族四层模型和OSI七层模型 上层协议使用下层协议的服务,下层协议给上层协议提供一个接口. 四层模型中各个层次的作用和特点 上图说明: 最底层是数据链路层, ...

  2. TCP协议详解----Linux学习笔记

    传输层概述 传输层协议主要有两个:TCP协议和UDP协议 TCP服务特点: TCP协议的特点是:面向连接.字节流和可靠传输.(相对UDP协议而言的) 面向连接: 1.使用TCP协议的双方必须先建立连接 ...

  3. TCP/IP协议详解卷一:Chapter21 笔记

    TCP/IP协议详解卷一:Chapter21 笔记 Chapter 21 TCP的超时与重传 21.3 往返时间测量 21.5 拥塞举例 21.6 拥塞避免算法 21.7 快速重传与快速恢复算法 21 ...

  4. TCP /IP协议详解【转】

    转自:https://www.jianshu.com/p/0cf648510bce?utm_campaign=maleskine&utm_content=note&utm_medium ...

  5. TCP/IP协议详解---概述

    工作之后,才发现以前在学校里学的东西忘得太快太干净了,现在需要一点点地捡起来了,要不然写几行程序会闹很多笑话会出现很多bug的.从今天开始,翻一翻<TCP/IP协议详解 卷1>这本书,希望 ...

  6. SOME/IP协议详解「总目录」

    SOME/IP协议详解「总目录」 欢迎大家来到雪云飞星的<SOME/IP协议详解>,开始前博主先列出本专栏学习的大纲,同时这也可以作为大家学习SOME/IP协议知识点的参考.下面蓝字都是传 ...

  7. IP协议详解及IPv4与IPv6协议的区别

    IP协议是在TCP/IP协议模型中的重要组成部分,目前我们使用最多的是IPv4协议,IPv6协议的用户量也在慢慢增加,苹果在几年之前就已经开始支持IPv6协议了.我们先来了解一下IPv4和IPv6协议 ...

  8. 《Node.js开发实战详解》学习笔记

    <Node.js开发实战详解>学习笔记 --持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...

  9. TCP/IP协议详解、TCP三次握手

    TCP/IP协议详解:TCP/IP协议详解_王佳斌-CSDN博客_tcp/ip协议认识HTTP协议它是互联网协议(Internet Protocol Suite),一个网络通信模型,是互联网的一个基本 ...

最新文章

  1. python下载安装教程2.7-Linux下安装python-2.7
  2. day 31 进程的其他方法 进程锁 进程队列
  3. python数据分析知识点_Python基础知识点总结:数据
  4. 流式计算中为什么需要时间戳和WaterMark
  5. [地球人]BlogEngine.NET[Appwo.com版]+采集器
  6. oracle DB死锁
  7. oculus rift 开发(一)
  8. 第四单元和课程总结:简单的架构设计意识
  9. 在Mac OS X中使用VIM开发STM32(2)
  10. 西游记与面向对象编程
  11. PHP报错Warning: Unknown: Input variables exceeded 1000
  12. ACS880变频器主从配置
  13. 用java实现新浪爬虫,代码完整剖析(仅针对当前SinaSignOn有效)
  14. DAP -Link 仿真下载 STM32 教程
  15. 服务器w7系统怎么开启端口,win7如何打开21端口|win7开启21端口的方法
  16. mysql percent_MySQL PERCENT_RANK 函数
  17. 2020android主流机型,2020年最强安卓旗舰机皇的称号!这三款手机当之无愧
  18. 降成本利器——SRM之电子招投标
  19. 编程新技术实务实验二
  20. ubuntu离线安装wireshark

热门文章

  1. java创建指定日期_如何创建指定的日期和时间
  2. python 特性和方法同名_Python类:方法与属性同名
  3. Java冒泡实现类Collections.sort()
  4. java jxl之Excel的读取
  5. 三维重建:点绕特定轴旋转公式
  6. 安卓程序段——时间测试函数
  7. 轩逸车联网功能怎么用_手机上面的NFC功能怎么用的
  8. 网址由http转换成https
  9. 彻底搞清楚javascript中的require、import和export
  10. web前端性能分析--实践篇