IP协议

        IP协议是TCP/IP协议族的核心,IP协议为上层协议提供无状态、无连接、不可靠的服务
        无状态是指IP通信双方不同步传输数据的状态信息,无须为保持通信的状态而分配一些内核资源,也无须每次传输数据时都携带状态信息。因此所有IP数据报的发送、传输和接收都是相互独立、没有上下文关系的。这种服务最大的缺点是无法处理乱序和重复的IP数据报。比如发送端发送出的第N个IP数据报可能比第N+1个IP数据报后到达接收端,而一个IP数据报也可能经过不同的路径多次到达接收端。在这两种情况下,接收端的IP模块无法检测到乱序和重复,因为这些IP数据报之间没有任何上下文关系。接收端的IP模块只要收到了完整的IP数据报(如果是IP分片的话,IP 模块将先执行重组),就将其数据部分(TCP 报文段、UDP数据报或者ICMP报文)上交给上层协议,那么从上层协议来看,这些数据就可能是乱序的、重复的。面向连接的协议,比如TCP协议,则能够自己处理乱序的、重复的报文段,它递交给上层协议的内容绝对是有序的、正确的。
        无连接是指IP通信双方都不长久地维持对方的任何信息,这样上层协议每次发送数据的时候,都必须明确指定对方的IP地址。
        不可靠是指IP协议不能保证IP数据报准确地到达接收端,它只是承诺尽最大努力,比如,某个中转路由器发现IP数据报在网络上存活的时间太长(根据IP数据报头部字段TTL判断),那么它将丢弃之并返回一个ICMP错误消息(超时错误)给发送端接收端发现收到的IP数据报不正确(通过校验机制),它将丢弃之并返回一个错误消息给发送端。无论哪种情况,发送端的IP模块一旦检测到 IP数据报发送失败,就通知上层协议发送失败,而不会试图重传。因此,使用IP服务的上层协议需要自己实现数据确认、超时重传等机制以达到可靠传输的目的。
        IPv4的头部结构如下所示,其长度通常为20个字节,最多有60个字节。

        4位版本号:指定IP协议的版本,对IPv4来说,其值是4。
        4位头部长度:标识该IP头部有多少个32bit(4字节),因为4位最大能表示15,所以IP头部最长是60字节。
        8位服务类型:包括.一个3位的优先权字段(现在已经被忽略),4位的TOS字段和1位保留字段(必须置0)。4位的TOS字段分别表示:最小延时,最大吞吐量,最高可靠性和最小费用。其中最多有一个能置为1,应用程序应该根据实际需要来设置它。比如像ssh和telnet这样的登录程序需要的是最小延时的服务,而文件传输程序ftp则需要最大吞吐量的服务。
        16位总长度:指整个IP数据报的长度,以字节为单位,因此IP数据报的最大长度为65535 (2^16-1) 字节。但由于MTU的限制,长度超过MTU的数据报都将被分片传输,所以实际传输的IP数据报(或分片)的长度都远远没有达到最大值。
        16位标识:唯一地标识主机发送的每一个数据报,其初始值由系统随机生成,每发送一个数据报,其值就加1,该值在数据报分片时被复制到每个分片中,因此同一个数据报的所有分片都具有相同的标识值。
        3位标志:字段的第一位保留,第二位表示“禁止分片”,如果设置了这个位,IP 模块将不对数据报进行分片,在这种情况下,如果IP数据报长度超过MTU的话,IP 模块将丟弃该数据报并返回一个ICMP差错报文,第三位表示“更多分片”,除了数据报的最后一个分片外,其他分片都要把它置1。
        13位分片偏移:分片相对原始IP数据报开始处(仅指数据部分)的偏移,实际的偏移值是该值左移3位(乘以8)后得到的,由于这个原因,除了最后一个IP分片外,每个IP分片的数据部分的长度必须是8的整数倍,这样才能保证后面的IP分片拥有一个合适的偏移值。
        8位生存时间:指数据报到达目的地之前允许经过的路由器跳数。TTL值被发送端设置(常见的值是64)。数据报在转发过程中每经过一个路由,该值就被路由器减1,当TTL值减为0时,路由器将丢弃数据报,并向源端发送一个ICMP差错报文。TTL值可以防止数据报陷入路由循环。
        8位协议:用来区分上层协议,/et/protocols 文件定义了所有上层协议对应的protocol字段的数值。其中,ICMP是1,TCP是6,UDP是17,/etc/protocols文件是RFC1700的一个子集。
        16位头部校验和:由发送端填充,接收端对其使用CRC算法以检验IP数据报头部,仅仅检验头部在传输过程中是否损坏。
        32位源端IP地址:用来标识数据报的发送端。
        32位目的端IP地址:用来标识数据报的接收端。一般情况下,源端IP地址和目的端IP地址在整个数据报的传递过程中保持不变,不论它中间经过多少个中转路由器。
        IPv4使用32位(4字节)地址,一共能表示2^32个地址,对于用户来说,一些地址是不能被使用的,随着互联网的不断发展,IP地址逐渐耗尽,因此引入了IPv6,IPv6使用128位(16字节)地址,其地址数量号称可以为全世界的每一粒沙子编上一个地址。
        IPv6头部由40字节的固定头部和可变长的扩展头部组成,固定头部结构如下所示:

        4位版本号:指定IP协议的版本,对IPv6来说,其值是6。
        8位通信类型:指示数据流通信类型或优先级,和IPv4中的ToS类似。20位流标签(low label)是IPv6新增加的字段,用于某些对连接的服务质量有特殊要求的通信,比如音频或视频等实时数据传输。
        16位净荷长度:指IPv6扩展头部和应用程序数据长度之和,不包括固定头部长度。
        8位下一个包头:指出紧跟IPv6固定头部后的包头类型,如扩展头(如果有的话)或某个上层协议头(比如TCP, UDP或ICMP)。它类似于IPv4头部中的协议字段,且相同的取值有相同的含义。
        8位跳数限制:和IPv4中的TTL含义相同,指数据报到达目的地之前允许经过的路由器跳数。TTL值被发送端设置(常见的值是64)。数据报在转发过程中每经过一个路由,该值就被路由器减1,当TTL值减为0时,路由器将丢弃数据报,并向源端发送一个ICMP差错报文。TTL值可以防止数据报陷入路由循环。
        128位源端IP地址:用来标识数据报的发送端。
        128位目的端IP地址:用来标识数据报的接收端。
         32位表示的IPv4地址一般用点分十进制来表示,而IPv6地址则用十六进制字符串表示,比如“FE08:0000:0000:0000: 1234:5678:0000:0012"。IPv6地址用“:”分成8组,每组包含2字节。但这种表示方法过于麻烦,通常可以使用所谓的零压缩法来将其简写,也就是省略连续的、全零的组。比如,上面的例子使用零压缩法可表示为“FE08::1234:5678:0000:0012"。不过零压缩法对一个IPv6地址只能使用一次,比如上面的例子中,字节组“5678"后面的全零组就不能再省略,否则我们就无法计算每个“:”之间省略了多少个全零组。
        扩展头部:IPv4 的数据报在其首部使用了选项,沿着数据报传送的路径上的每个路由器都必须对这些选项一进行检查, 这就降低了路由器处理数据报的速度,然而实际上很多的选项在途中的路由器上是不需要检查的,因为不需要使用这些选项的信息。IPv6把原来IPv4头部中选项的功能都放在扩展头部中,并把扩展头部留给路径两端的源点和终点的主机来处理,而数据报途中经过的路由器都不处理这些扩展头部,只有一个头部例外,即逐跳选项扩展头部,这样就大大提高了路由器的处理效率。
        在RFC2460中定义了以下六种扩展头部:逐跳选项、 路由选择、 分片、鉴别、封装安全有效载荷和目的站选项。每一个扩展头部都由若干个字段组成,它们的长度也各不同。但所有扩展头部的第一个字段都是8位的“下一个报头”字段,此字段的值指出了在该扩展头部后面的字段是什么。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值