IP协议
是TCP/IP协议族
的核心协议,也是socket网络编程的基础之一。
IP头部信息。IP头部信息出现在每个IP数据报中,用于指定IP通信的源端IP地址、目的端IP地址,直到IP分片和重组,以及指定部分通信行为。
IP数据报的路由和转发,IP数据报的路由和转发发生在除目标机器之外的所有主机和路由上,它们决定数据报是否应该转发以及如何转发。
IP协议是TCP/IP协议族的动力,它为上层协议提供无状态、无连接、不可靠的服务。
无状态是指IP通信双方不同步传输数据的状态信息,因此所有IP数据报的发送、传输和接收都是相互独立、没有上下文关系的。这种服务最大的缺点是无法处理乱序和重复的IP数据报。无状态服务的优点:简单、高效。无须为保持通信的状态而分配一些内核资源,也无须每次传输数据时都携带状态信息。
无连接是指IP通信双方都不长久地维持对方的任何信息。上层协议每次发送数据时都必须明确指定对方IP地址。
不可靠是指IP协议不能保证IP数据报准确地到达接收端,它只是承诺尽最大努力,很多种情况都能导致IP数据报发送失败。
IPv4头部结构:
IPv4头部结构长度通常为20字节,除非含有可变长的选项部分。
4位版本号指定IP协议的版本。对IPv4来说,其值是4,其他IPv4协议的扩展版本(如SIP协议和PIP协议),则具有不同的版本号(它们的头部结构也不同)。
4位头部长度标识该IP头部有多少个32bit字(4字节)。因为4位最大能标识15,所以IP头部最长是60.
8位服务类型包括一个3位的优先权字段(现在已经被忽略),4位的TOS字段和1位保留字段(必须置0)。4位的TOS字段分别表示:最小延时,最大吞吐量,最高可靠性和最小费用。其中最多有一个能置于1。
16位总长度是指整个IP数据报的长度,以字节为单位,因此IP数据报的最大长度为65535字节,但由于MTU的限制,长度超过MTU的数据报都将被分片传输,所以实际传输的IP数据报(或分片)的长度都远远没有达到最大值。
下面的3个字段则描述了如何实现分片:
16位标识唯一的标识主机发送的每一个数据报。其初始值由系统随机生成:每发送一个数据报,其值就加1,该值在数据报分片时被复制到每个分片中,因此同一个数据报的所有分片都具有相同的标识值。
3位标志字段的第一位保留。第二位表示“禁止分片”。如果设置了这个位,IP模块将不对数据报进行分片(这时候如果IP数据报长度超过MTU的话,IP模块就丢弃该数据报并返回一个ICMP差错报文)。第三位表示“更多分片”。除了数据报的最后一个分片外,其他分片都要置位1。
13位分片偏移是分片相对原始IP数据报开始处(仅指数据部分)的偏移。实际的偏移值是该值左移(乘8)后得到的。因此,除了最后一个IP分片外,每个IP分片的数据部分的长度必须是8的整数倍。
8位生存时间(TTL)是数据报到达目的地之前允许经过的路由器跳数。TTL值被发送端设置(常见的值是64)。数据报在转发过程中每经过一个路由,该值就被路由器减1,当TTL值减为0时,路由器将丢弃数据报,并向源端发送一个ICMP差错报文。TTL值可以防止数据陷入路由循环。
8位协议用来区分上层协议,/etc/protocols文件定义了所有上层协议对应的protocol字段的数值。其中ICMP是1,TCP是6,UDP是17。
16位头部检验和由发送端填充,接收端对其使用CRC算法以检验IP头部(仅检验头部)在传输过程中是否破坏。
32位源端IP地址和目的端口IP用来数据报的发送端和接收端。
IPv4最后一个选项字段是可变长的可选信息,这部分最多包含40字节,可用的IP选项包括:
记录路由,告诉数据报途径的所有路由器都将自己的IP地址填入IP头部的选项部分,这样就可以跟踪数据报的传递路径。
时间戳,告诉每个路由器都将数据报被转发的时间填入IP头部的选项部分,这样就可以测量途径路由之间数据报传输的时间。
松散路由选择,指定一个路由器IP地址列表,数据报发送过程中必须经过其中所有的路由器。
严格源路由选择,和松散源路由选择类似,不过数据报只能经过被指定的路由器。