柴猫

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

ip提供不可靠、无连接的数据报传送,任何可靠性必须由上层来提供,无连接表示ip不维护后续数据报的状态信息,每个数据报都是相互独立的。RFC791是ip的正式规范文件。

ip数据报格式如下,普通的ip首部20个字节,除非含有选项字段。

4位版本|4位首部长度|8位服务类型(TOS)|16位总长度

16位标识|3位标志|13位偏移

8位TTL|8位协议|16位首部检验和

32位源IP地址

32位目的ip地址

(选项如果有)

数据

其中:首部长度表示首部4字节的个数;

TOS包括一个3bit的优先权(现已忽略),4bit的TOS子字段,1bit未用但是必须置0,4位tos子字段只能置其中1bit,若4bit均为0,表示一般服务(RFC 1340),4bit分别表示最小时延、最大吞吐量、最高可靠性、最小费用;

总长度字段表示整个ip数据报的长度,以字节为单位,因为有16位,故最长可达65535字节,以太网帧要求最小帧长为46字节,ip数据报可能更短填充其他字节,以此可找到真正的ip数据报内容;

标识字段唯一表示主机发送的每一数据报,通常每发一份就加一;

ttl为0时,数据报将会丢弃并发送icmp报文通知源主机;

协议字段可以根据它识别是哪个协议向ip传送数据;

首部检验和计算方法,先把检验和置0,然后对首部每16bit依次进行二进制反码求和(先二进制求和再取反)结果存在检验和字段中(或者对每16bit二进制求和,然后高低16bit反复相加直至高16bit位0,然后取反如下)

unsigned short checksum(unsigned short *buf,int nword)
{   
     unsigned long sum;
   for(sum=0;nword>0;nword--)
       sum += *buf++;
   sum = (sum>>16) + (sum&0xffff);
   sum += (sum>>16);
   return ~sum;   
}
posted on 2012-03-20 15:21  柴猫  阅读(192)  评论(0编辑  收藏  举报