IP协议详解

IP协议是TCP/IP协议族的核心协议,也是socket网络编程的基础之一。
IP头部信息。IP头部信息出现在每个IP数据报中,用于指定IP通信的源端IP地址、目的端IP地址,指导IP分片和重组,以及指定部分通信行为。
IP数据报的路由和转发。IP数据报的路由和转发发生在除目标机器之外的所有主机和路由器上。他们决定数据报是否应该转发以及如何转发。
IP服务的特点
IP协议为上层协议提供无状态、无连接、不可靠的服。
无状态指的是IP通信双方不同步传输数据的状态信息(IP数据报的发送、传输和接收相互独立)。
缺点:无法处理乱序和重复的IP数据报。 —–只要收到IP数据报(分片则先重组),就将数据报的数据部分交给上层 不管重复还是无序
TCP协议则可以处理乱序的,重复的报文段。
优点:简单高效。 UDP和HTTP(一个浏览器的连续两次网页请求之间没有任何关联,被web服务器独立处理)都是无状态协议。
无连接是指IP通信双方都不长久地维持对方的任何信息。这样,上层协议每次发数据时,都要指明对方的IP地址。
IP协议详解_第1张图片
(IPv6 traffic class->通信类型 flow lable->流标签 payload length->净荷长度不包括固定头部长度 hop limit->跳数限制 和TTL相同)
1.version 4位 版本号
2.IHL 4位 头部长度 —标示IP头部有多少个4字节,IP头部最长是60字节。
3.Type of service(TOS) 8位 服务类型
包含3位优先权字段,4位TOS字段和1位保留字段(必须置0。
4位TOS表示:最小延时,最大吞吐量,最高可靠性和最小费用。
ssh和telnet这样的登陆程序需要的是最小延时服务。
文件传输程序ftp需要最大吞吐量的服务。
4.Total length 16位总长度—-整个IP数据报的长度。
IP数据报的最大长度为65535(2的16次方-1)字节。(注意是字节)
由于MTU的限制,超过MTU的数据报将被分片传输
5.identification 16位 标识—唯一地标识主机发送的每一个数据报,初始值系统随机生成,每发一个数据报,值会加1,同一数据报所有分片具有相同的标识。
6.flag 3位 标志 第一位保留 第二位(DF dont fragment)表示禁止分片。如果IP数据报长度超过MTU,IP模块将丢弃该数据报并返回一个ICMP差错报文 第三位(MF more fragment)更多分片 除了最后一位分片外,其他分片都要把它置为1。
7.fragment offset 13位分片偏移
8.time to live(TTL) 8位 生存时间 数据报到达目的地之前允许经过的路由器跳数。TTL减为0时,路由器将丢弃数据报,返回ICMP差错报文。
9.protocol 8位 协议 区分上层协议 ICMP为1 TCP为6 更多情况请cat /etc/protocols
10.header checksum 16位 检验ip包头部信息 由发送端填充,接收端用CRC算法检验IP头部
11.source address/destination address 都是32位 发出地/目的地
12.options padding 选填性质区域
记录路由(record route):告诉数据报途径的所有路由器将自己的IP地址的选项部分
时间戳(timestamp):告诉每个路由器都将数据报被转发的时间,填入IP地址的选项部分
松散源路由选择(loose source routing),指定一个路由器IP列表,数据包发送过程中必须经过其中所有的路由器。
严格源路由选择(strict source routing),只能经过指定路由器

观察IPV4头部

1个终端执行 sudo tcpdump -ntx -i lo
1个终端执行 telnet 127.0.0.1

获取的数据
IP协议详解_第2张图片
IP协议详解_第3张图片
第一行 第3个和第4个 10表示TOS选项最小延时服务开启,因为telnet服务使用具有最小延时服务。

IP分片
以太网MTU具有1500字节(在ifconfig里可以查看到)
IP数据报的数据部分最多占1480字节(IP头部占20字节)
IP协议详解_第4张图片
要封装一个1481字节的ICMP报文(8个字节的头部,数据部分1473)则要分片传输。
1.分片长1500 2.分片长21字节
第一个IP头部的flag 第三位设为MF 第二个由于是最有一个分片不用设。
第一个含ICMP头部信息 第二个不含

IP模块工作流程
当收到数据链路层IP数据报时,首先队数据报的头部做CRC校验,确认没问题看是分析头部信息。如果头部设置源站选路选线,则IP模块会调用数据报转发子模块来处理数据报,如果数据报发送给本机,那么发送给指定的上层应用,如果不是,则也调用数据报转发子模块处理。
数据报转发子模块先查看系统释放允许转发,不允许IP模块丢弃数据报,允许则数据报转发子模块进行操作,然后交个IP数据报输出子模块。
IP模块核心数据结构是路由表。此表按数据报目标IP地址分类,同类型IP数据报将发往相同下一跳路由器。
IP输出队列存放所有等待发送的IP数据报,还包括封装本机上层数据(ICMP报文、TCP报文段、UDP数据报)的IP数据报。
route命令可以查看路由表

IP路由机制
(1)查找路由表中和数据报的目标IP地址完全匹配的主机IP地址。如果找到使用路由项,没找到则转到步骤2
(2)查找路由表中和数据报的目标IP地址具有相同网路ID的网络IP地址,找到使用路由项,没找到则转到步骤3
(3)选择默认路由项,通常意味着下一跳路由是网关

sudo route del default //删除默认路由项,导致无法访问互联网

route命令修改路由表,是静态的路由更新方式。
对于大型的路由器,他们通过BGP(Border Gateway Protocol,边际网关协议)、RIP(Routing Information Protocol,路由信息协议)、OSPF等协议发现新路径,动态更新方式。

IP转发
对于允许IP数据报转发的系统,数据报转发子模块操作如下:

检查数据报头部TTL值。为0,丢弃
查看头部填充区域是否设置严格源路由选择项,设置了,则检测目标地址是否魏本机某个IP地址,不是,发送ICMP失败信息。
如果有必要,给源端发ICMP重定向报文,以告诉它更合理的下一跳路由
TTL 减 1
处理IP头部选项
有必要的话,执行IP分片

你可能感兴趣的:(Linux网络编程)