IP数据报格式 图1.IP数据报格式 版本字段长度为4,用来表明建立数据报的IP版本,目前的IP版本是IPv4,IPv6正在发展中。IPv4的字段为0100 。 首部长度(报头长度)指的是首部占32 bit字的数目,包括任何选项。由于它是一个4比特字段,因此首部最长为60个字节。15x32/8=60字节.IP首部始终是32 bit的整数倍.IP数据报报头的最小长度为20个字(不含填充字段和IP选项字段的IP报头是最常见的IP报头,为20个字节) 标志位长度为3比特,用于分段控制:第0位为预留位,第1位表示可否分段。当该位的值为0时,表示数据报不可分段,值为1时,表示数据报可被分段。第2位为段是否结束位,当该位的值为0时,表示该段是原数据报的最后一段,值为1时,表示后面不有更多的分段。 段偏移13比特长度,用于指定分段在原始数据报中的位置,以8个字节为单位. 生存时间TTL长度为8比特,用于指定数据报允许保留在网络上的时间。 协议字段长度为8比特,用于指定数据报数据区中携带的消息是由哪种高级协议建立的。ICMP为1,TCP为6,UDP为17。 协议号分配RFC790. 报头校验和16比特,仅用于IP报头校验和。 源IP地址及目的IP地址。 选项,填充字段用于确保将选项字段填充为最少32个比特位,以保证IP报头以32位结束。 分段:分段是将一个大的IP数据报分解成几个较小的数据报段的过程。当IP模块需要通过一个具有较小MTU的网络传送较大的数据包时,就必须将其分段。 //定义ip报头数据结构 typedef struct _iphdr { byte ver_len; //版本4位,头长度4位,报头长度以32位为一个单位 byte type; //类型8位 byte length[2]; //总长度,16位,指出报文的以字节为单位的总长度 //报文长度不能超过65536个字节,否则认为报文遭到破坏 byte id[2]; //报文标示,用于多于一个报文16位 byte flag_offset[2];//标志,3位 数据块偏移13位 byte time; //生存时间,8位 byte protocol; //协议,8位 byte crc_val[2]; //头校验和,16位 byte src_addr[4]; //源地址,32位 byte tar_addr[4]; //目标地址,32位 byte options[4]; //选项和填充,32位 }IP_HEADER; TCP报文格式 传输控制协议(TCP)向上与用户应用程序进程接口,向下与网络层协议IP接口。用户应用程序采用首先调用TCP(或UDP),然后将应用程序数据递交给TCP这一方式,在IP网络上传送数据。TCP将这些数据打包分段并调用IP模块向目的主机传送每个数据段。接收方的TCP将段中的数据放入接收缓冲器,然后将段重装为应用程序数据,再将这些数据发送到目的的应用程序进程。 图 源端口号(16位),标识主机上发起传送的应用程序;目的端口(16位)标识主机上传送要到达的应用程序。源端和目的端的端口号,用于寻找发端和收端应用进程。这两个值加上I P首部中的源端I P地址和目的端I P地址唯一确定一个T C P连接。一个I P地址和一个端口号有时也称为一个插口(socket),插口对(socket pair)(包含客户I P地址、客户端口号、服务器 I P地址和服务器端口号的四元组 )可唯一确定互联网络中每个T C P连接的双方。IP+TCP端口唯一确定一个TCP连接。 TCP协议通过使用"端口"来标识源端和目标端的应用进程。端口号可以使用0到65535之间的任何数字。在收到服务请求时,操作系统动态地为客户端的应用程序分配端口号。在服务器端,每种服务在"众所周知的端口"(Well-Know Port)为用户提供服务。 ●顺序号字段:占32比特。用来标识从TCP源端向TCP目标端发送的数据字节流,它表示在这个报文段中的第一个数据字节。 预留:由跟在数据偏移字段后的6位构成,预留位通常为0. ●标志位字段(U、A、P、R、S、F):占6比特。各比特的含义如下: //定义TCP报头 typedef struct _tcphdr { byte source_port[2]; //发送端端口号,16位 byte dest_port[2]; //接收端端口号,16位 byte sequence_no[4]; //32位,标示消息端的数据位于全体数据块的某一字节的数字 byte ack_no[4]; //32位,确认号,标示接收端对于发送端接收到数据块数值 byte offset_reser_con[2];//数据偏移4位,预留6位,控制位6为 byte window[2]; //窗口16位 byte checksum[2]; //校验码,16位 byte urgen_pointer[2]; //16位,紧急数据指针 byte options[3]; //选祥和填充,32位 }TCP_HEADER;
本文转自: 1.《IP数据报格式》 http://blog.csdn.net/byxdaz/archive/2007/08/01/1720958.aspx 2.《TCP报文格式》 |
|