TCP/IP之IP协议

Posted sollor525

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP/IP之IP协议相关的知识,希望对你有一定的参考价值。

概念:

IP:网络之间互连的协议(Internet Protocol),是TCP/IP协议族中最为核心的协议。所有的TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输。

  • 不可靠(unreliable)的意思是它不能保证 IP数据报能成功地到达目的地。IP仅提供最好的传输服务。如果发生某种错误时,如某个路由器暂时用完了缓冲区,IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP消息报给信源端。任何要求的可靠性必须由上层来提供(如TCP)。
  • 无连接(connectionless)这个术语的意思是IP并不维护任何关于后续数据报的状态信息。每个数据报的处理是相互独立的。这也说明,IP数据报可以不按发送顺序接收。如果一信源 向相同的信宿发送两个连续的数据报(先是A,然后是B),每个数据报都是独立地进行路由选择,可能选择不同的路线,因此B可能在A到达之前先到达。

IP首部(IPv4):

普通的IP首部长为20个字节,除非含有选项字段。

图中最高位在左边,记为0bit;最低位在右边,记为31bit。
4个字节的32bit值以下面的次序传输:首先是0~7bit,其次8~15bit,然后16~23bit, 最后是24~31bit。这种传输次序称作big endian字节序。由于TCP/IP首部中所有的二进制整数 在网络中传输时都要求以这种次序,因此它又称作网络字节序。以其他形式存储二进制整数的机器,如little endian格式,则必须在传输数据之前把首部转换成网络字节序。

  • 版本(Version):IP协议的版本号。当使用IPv4协议时是4。
  • 首部长度(Header Length):首部(含选项部分)占32bit字的数目。由于占4bit,所以最大可以表示4X15=60字节。普通IP数据报(没有任何选择项)字段的值是5。
  • 服务类型(TOS:Type of Service):TOS字段包括一个3bit的优先权子字段,4bit的TOS子字段和1bit未用位但必须置0。4bit的TOS分别代表:最小时延、最大吞吐量、最高可靠性和最小费用。4bit中只能置其中1bit。如果所有4bit均为0,那么就意味着是一般服务。RFC 1340 [Reynolds and Postel 1992]描述了所有的标准应用如何设置这些服务类型。 RFC 1349 [Almquist 1992]对该RFC进行了修正,更为详细地描述了TOS的特性。
  • 总长度(Total Length):指的是整个IP数据报的长度,以字节为单位。利用首部长度字段和总长度字段,就可以知道IP数据报中数据内容的起始位置和长度。
  • 标识(Identifier):唯一的标识主机发送的每一份数据报。通常每发送一份报文它的值就会加1。该字段和Flags和Fragment Offest字段联合使用,对较大的上层数据包进行分段(fragment)操作。路由器将一个包拆分后,所有拆分开的小包被标记相同的值,以便目的端设备能够区分哪个包属于被拆分开的包的一部分。
  • 标志(Flags):长度3比特。该字段第一位不使用。第二位是DF(Don’t Fragment)位,DF位设为1时表明路由器不能对该上层数据包分段。如果一个上层数据包无法在不分段的情况下进行转发,则路由器会丢弃该上层数据包并返回一个错误信息。第三位是MF(More Fragments)位,当路由器对一个上层数据包分段,则路由器会在除了最后一个分段的IP包的包头中将MF位设为1。
  • 片偏移(Fragment Offset):长度13比特。表示该IP包在该组分片包中位置,接收端靠此来组装还原IP包。
  • 生存时间(TTL):长度8比特。当IP包进行传送时,先会对该字段赋予某个特定的值。当IP包经过每一个沿途的路由器的时候,每个沿途的路由器会将IP包的TTL值减少1。如果TTL减少为0,则该IP包会被丢弃。这个字段可以防止由于路由环路而导致IP包在网络中不停被转发。
  • 协议(Protocol):长度8比特。标识了上层所使用的协议。
    以下是比较常用的协议号:
    • 1:ICMP
    • 2:IGMP
    • 6:TCP
    • 17:UDP
    • 88:IGRP
    • 89:OSPF
  • 首部校验和(Header Checksum):长度16位。用来做IP头部的正确性检测,但不包含数据部分。 因为每个路由器要改变TTL的值,所以路由器会为每个通过的数据包重新计算这个值。
  • 源IP地址和目的IP地址(Source and Destination Addresses):这两个地段都是32比特。标识了这个IP包的起源和目标地址。要注意除非使用NAT,否则整个传输的过程中,这两个地址不会改变。
  • 可选项(Options):这是一个可变长的字段。该字段属于可选项,主要用于测试,由起源设备根据需要改写。可选项目包含以下内容:
    • 松散源路由(Loose source routing):给出一连串路由器接口的IP地址。IP包必须沿着这些IP地址传送,但是允许在相继的两个IP地址之间跳过多个路由器。
    • 严格源路由(Strict source routing):给出一连串路由器接口的IP地址。IP包必须沿着这些IP地址传送,如果下一跳不在IP地址表中则表示发生错误。
    • 路由记录(Record route):当IP包离开每个路由器的时候记录路由器的出站接口的IP地址。
    • 时间戳(Timestamps):当IP包离开每个路由器的时候记录时间。
    • 填充(Padding):因为IP包头长度(Header Length)部分的单位为32bit,所以IP包头的长度必须为32bit的整数倍。因此,在可选项后面,IP协议会填充若干个0,以达到32bit的整数倍。

IP首部的一般定义如下:

typedef struct _iphdr //定义IP首部

    unsigned char h_lenver; //4位首部长度+4位IP版本号
    unsigned char tos; //8位服务类型TOS
    unsigned short total_len; //16位总长度(字节)
    unsigned short ident; //16位标识
    unsigned short frag_and_flags; //3位标志位
    unsigned char ttl; //8位生存时间 TTL
    unsigned char proto; //8位协议 (TCP, UDP 或其他)
    unsigned short checksum; //16位IP首部校验和
    unsigned int sourceIP; //32位源IP地址
    unsigned int destIP; //32位目的IP地址
IP_HEADER;

IP路由选择:

IP可以从TCP、UDP、ICMP和IGMP接收数据报(即在本地生成的数据报)并进行发送,或者从一个网络接口接收数据报(待转发的数据报)并进行发送。 IP层在内存中有一个路由表,当有数据要发送时,它要对该表进行一次搜索以确认转发地址。如果数据报来自某个网络接口时,当收到的数据到达IP层时,IP层会检查数据报的目的地址是否为本机IP或广播IP:

  • 如果是,就根据IP首部协议字段的协议分发到相应的模块进行处理。
  • 如果不是,那么:
    IP层被设为路由器功能,则对此数据报进行转发。
    否则,丢弃该数据被报。

路由表内容如下所示:

  • 目的IP地址:可以是网络地址,也可以是主机地址,由路由表中的标志字段区分。
  • 下一跳路由器IP地址:与当前网络接口直接相连的路由器或主机网络接口的IP地址,具体是哪一个由路由表中的标志字段区分。
  • 标志:其中一个标志区分目的IP是网络地址还是主机地址,另一个标志区分下一跳路由器是真的路由器还是网络接口。
  • 网络接口:指明对应的数据报应该从哪个网络接口发出去。

IP路由选择是逐跳地(hop-by-hop)进行的。IP路由选择主要完成以下这些功能:

  • 搜索路由表,寻找能与目的IP地址完全匹配的表目(网络号和主机号都要匹配)。如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(取决于标志字段的值)。
  • 搜索路由表,寻找能与目的网络号相匹配的表目。如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(取决于标志字段的值)。目的网络上的所有主机都可以通过这个表目来处置。例如,一个以太网上的所有主机都是通过这种表目进行寻径的。这种搜索网络的匹配方法必须考虑可能的子网掩码。
  • 搜索路由表,寻找标为“默认(default)”的表目。如果找到,则把报文发送给该表目指定的下一站路由器。
  • 如果上面这些步骤都没有成功,那么该数据报就不能被传送。如果不能传送的数据报来自本机,那么一般会向生成数据报的应用程序返回一个“主机不可达”或“网络不可达”的错误。

子网寻址:

把IP地址中的主机号再分成一个子网号和一个主机号。
即,将原来的IP地址
IP地址 ::= <网络号>, <主机号>
划分为:
IP地址 ::= <网络号>, <子网号>, <主机号>

子网掩码:

这个掩码是一个32bit的值,其中值为1的比特留给网 络号和子网号,为0的比特留给主机号。
给定IP地址和子网掩码以后,主机就可以确定IP数据报的目的是:

  • 本子网上的主机;
  • 本网络中其他子网中的主机;
  • 其他网络上的主机。

如果知道本机的IP地址,那么就知道它是否为A类、B类或C类地址(从IP地址的高位可以得知),也就知道网络号和子网号之间的分界线。而根据子网掩码就可知道子网号与主机号之间的分界线。

以上是关于TCP/IP之IP协议的主要内容,如果未能解决你的问题,请参考以下文章

TCP/IP之TCP协议首部三次握手四次挥手FSM

TCP/IP协议原理与应用笔记25:网际协议(IP)之 数据报(Datagram)

003::每天五分钟入门TCP/IP协议栈::IP协议之TOS字段说明

TCP/IP协议栈--IP首部选项字段的分析

TCP/IP协议之ping和traceroute

004::每天五分钟入门TCP/IP协议栈::IP协议之16位总长度字段引出的MTU值问题