IPV4协议应用
一、IP数据报格式:
(注:每个ip数据包都包含有一个头部和一个正文部分,其中头部又包含一个20字节的定长部分和一个可选的变长部分.数据包头部的传输采用big-endian字节序.)
1、头部20字节分别记录有版本(version) (占用4个bit位)取值为:IPv4: 4, IPv6: 6 。
2、 IHL(头部长度,以字为单位,至少为5,最大为15,即可限制头部长度为60字节,因此可选项最多为40字节)(4bit位),
3、服务类型(type of service)一共6个bit位,从左到右依次为一个3位的precedence域,和4个标志D,T,R,C(延迟,吞吐量,可靠性,最小费用) 和一位保留位。接 下来是2个字节的总长度,最大长度为65535字节.该字段通常不使用。
4、包的总长度: 16位,最长为:65535, 实际上决定于MTU(最大传输单元),对以太网为1500字节。
5、TTL域,存活周期,是一个限制分组生存期的计数器.计数时间为秒,一共占8位,所以最大生存期为255(秒/点)通常为64。当他递减到0时,路由器给源主机发送一个警告分组,原分组被丢弃.这样可以避免数据报长时间存在网络中.
6、标志(Identification)的用途 是让目标主机确定一个新的数据段属于哪个数据包,同一个数据报的分段有相同的标志值.接下来是一个空的bit位, 后面是2个1位域,DF表示不分段, 而MF表示更多的分段,除最后一个分段外其他所有分段都要设这一位.因为接收方可以知道一个数据报的所由分段都已经到达了. 然后是13位的分段偏移,所以每个数据报最多有8192个分段.
7、协议:8位,占8位,协议字段指出此数据报携带的数据是使用何种协议(上层协议),以便使目的主机的IP层知道应将数据部分上交给哪个处理过程。协议可包括TCP、UDP、TELNET等。
1=ICMP,2=IGMP,3=TCP,17=UDP...
8、首部校验和:16位,首部检验和字段是根据I P首部计算的检验和码。它不对首部后面的数据进行计算。I C M P、I G M P、U D P和T C P在它们各自的首部中均含有同时覆盖首部和数据检验和码。为了计算一份数据报的I P检验和,首先把检验和字段置为0。然后,对首部中每个16 bit 进行二进制反码求和(整个首部看成是由一串16 bit的字组成),结果存在检验和字段中。当收到一份I P数据报后,同样对首部中每个16 bit 进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该 为全1。如果结果不是全1(即检验和错误),那么I P就丢弃收到的数据报。但是不生成差错报文,由上层去发现丢失的数据报并进行重传。
9、源IP地址:32位,发送IP的主机地址。
10、目的IP地址:32位,数据发往的IP主机
下面,我们再自己根据上面的IP数据报格式,定义一个IP数据结构:
typedef struct ip_hdr
{
unsigned char ip_verlen; // 8bit 4版本 + 4首部长度
unsigned char ip_tos; // 8bit 服务类型
unsigned short ip_totallength; // 16bit 总长度(字节数)
unsigned short ip_id; // 16bit 标识
unsigned short ip_fragoffset; // 16bit 3bit标志 + 13bit片偏移,
unsigned char ip_ttl; // 8bit 生存时间(TTL)
unsigned char ip_protocol; // 8bit 上层协议
unsigned short ip_checksum; // 16bit 首部检验和
unsigned int ip_srcaddr; // 32bit 源IP地址
unsigned int ip_destaddr; // 32bit 目的IP地址
} IPV4_HDR, *PIPV4_HDR, FAR * LPIPV4_HDR;