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个字节)

服务类型TOS(Type Of Service)总长度字段是指整个I P数据报的长度,以字节为单位.由于该字段长16比特,所以I P数据报最长可达6 5 5 3 5字节(64KB).总长度字段是I P首部中必要的内容。数据长度=总长-报头长度。

标识符长16比特。

标志位长度为3比特,用于分段控制:第0位为预留位,第1位表示可否分段。当该位的值为0时,表示数据报不可分段,值为1时,表示数据报可被分段。第2位为段是否结束位,当该位的值为0时,表示该段是原数据报的最后一段,值为1时,表示后面不有更多的分段。

当网络设备要发送的数据报长度比所在网络的最大传输单元(MTU,Max Transfer United)大,并且标志位的第1位设置为不能分段(0)时,网络设备会向发送方返回一个因特网控制消息协议ICMP错误消息,并丢弃该数据报。除了最后一个分段外,其余分段的第2位均设置为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将段中的数据放入接收缓冲器,然后将段重装为应用程序数据,再将这些数据发送到目的的应用程序进程。

尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务。

TCP提供一种面向连接的、可靠的字节流服务。

图2.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目标端发送的数据字节流,它表示在这个报文段中的第一个数据字节。

●确认号字段:占32比特。只有ACK标志为1时,确认号字段才有效。它包含目标端所期望收到源端的下一个数据字节。

●头部长度字段:占4比特。给出头部占32比特的数目。没有任何选项字段的TCP头部长度为20字节;最多可以有60字节的TCP头部。

预留:由跟在数据偏移字段后的6位构成,预留位通常为0.

●标志位字段(U、A、P、R、S、F):占6比特。各比特的含义如下:

◆URG:紧急指针(urgent pointer)有效。

◆ACK:确认序号有效。

◆PSH:接收方应该尽快将这个报文段交给应用层。

◆RST:重建连接。

◆SYN:发起一个连接。

◆FIN:释放一个连接。

●窗口大小字段:占16比特。此字段用来进行流量控制。单位为字节数,这个值是本机期望一次接收的字节数。

●TCP校验和字段:占16比特。对整个TCP报文段,即TCP头部和TCP数据进行校验和计算,并由目标端进行验证。

●紧急指针字段:占16比特。它是一个偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。

●选项字段:占32比特。可能包括"窗口扩大因子"、"时间戳"等选项。
 

//定义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报文格式》 http://blog.csdn.net/byxdaz/archive/2007/08/01/1720966.aspx

原文: TCP/IP数据报格式

 

 

参考推荐

IP地址段与子网掩码

IPv6 理解的十个误区

IPv4 与 IPv6 的比较

2018年中国互联网络发展状况统计报告

阿里云、腾讯云等弹性IP的开发API接口

9大代理服务器软件的比较与分析