一、以下各个头文件所在的位置为
Ubuntu下目录/usr/include/linux/
Fedora下目录 /usr/src/kernels/2.6.35.6-45.fc14.i686/include/linux/
二、ip头部的结构体定义如下
下面主要说明几个字段:
iphdr->ihl:首部长度(4bit),首部长度指的是IP头部占32 bit(4字节)字的数目(也就是IP头部包含多少个4字节),包括任何选项。由于它是一个4比特字段, 因此首部最长为60个字节。
iphdr->check:IP首部检验和字段(16位,2字节),只计算IP头部的的所有字段的校验和,它不对首部后面的数据进行计算。
发送方:计算一份数据报的IP头部检验和,则需要首先把此检验和字段置为0。然后对首部中每个16 bit(2字节)进行二进制反码求和(整个首部看成是由一串16 bit的字组成),然后结果存在此检验和字段中。
接受方:当收到一份IP数据报后,对首部中每个16 bit(2字节)进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全1。如果结果不是全1(即检验和错误),那么IP就丢弃收到的数据报。但是不生成差错报文,由上层去发现丢失的数据报并进行重传。
iphdr->tot_len:总长度字段(16位)是指整个IP数据报的长度(包含后面的协议头和数据),以字节为单位。
利用首部长度字段和总长度字段,就可以知道 IP数据报中数据内容的起始位置和长度。由于该字段长16比特,所以IP数据报最长可达65535字节,总长度字段是IP首部中必要的内容,因为一些数据链路(如以太网)需要填充一些数据以达到最小长度。尽管以太网的最小帧长为46字节,但是IP数据可能会更短。如果没有总长度字段,那么IP层就不知道46字节中有多少是IP数据报的内容。
三、tcp头部的结构体定义如下
tcphdr->doff:TCP头部长度,指明了在TCP头部包含多少个32位的字。
此信息是必须的,因为options域的长度是可变的,所以整个TCP头部的长度也是变化的。从技术上讲,这个域实际上指明了数据部分在段内部的其起始地址(以32位字作为单位进行计量),因为这个数值正好是按字为单位的TCP头部的长度,所以,二者的效果是等同的。
tcphdr->check:检验和,覆盖了整个的TCP报文段(包含后面的数据),这是一个强制性的字段,一定是由发送端计算和存储,并由接收端进行验证。
四、udp头部的结构体定义如下
1、源端口号(Source Port):长度为16位(2字节),指明发送数据的进程的端口号。
2、目的端口号(Destination Port):长度为16位(2字节),指明目的主机接收数据的进程的端口号。
3、长度(Data Length):长度为16位(2字节),该字段值为udp报头和数据两部分的总字节数。
4、检验和(Checksum):长度为16位(2字节),udp检验和是udp报头和udp数据的所有数据的检验和。对报文中每个16 bit(2字节)进行二进制反码的求和。由发送端计算和存储,由接收端校验。
5、数据
五、Ip头和tcp头udp头的数据校验和的算法函数