一、IP报文格式
                            
IP字段解释:
| 字段 | 长度 | 含义 | 
| 
 Version(版本) | 
 4比特 | 表示版本信息。 *4:表示IPv4 *6:表示IPv6 | 
| 
 IHL(头部长度) | 
 4比特 | 表示此刻IP报文的大小。如果不带Option字段,则为20字节(B),最长可为60字节。该值限制了记录路由选项。以4字节为一个单位。 | 
| 
 Type of Service (服务类型) | 
 8比特 | 给IP报文做优先级处理。通过调整这八位中某些二进制位告诉设备转发数据时是按顺序转发还是优先转发。(默认转发规则为FIFO,先进先出)只有在有QoS差分服务要求时这个字段才起作用。 | 
| 
 Total Length(总长度) | 
 16比特 | 整个IP数据报的长度,包括IP报头和后面TCP/UDP以及数据之和。单位为字节,最大长度216 – 1=65535,总长度不超过最大传输单元MTU。 | 
| Identification(标识) | 16比特 | 主机每发送一个报文都会加1,类似于计数。什么时候该分片。分片重组时会用到该字段。 | 
| 
 
 Flags(标志位) | 
 
 3比特 | *R:保留位。暂时无意义,必须为0。 *DF(Don’t Fragment):能否分片位。0表示可以分片;1表示不能分片。若Identification计数此时需要分片,但因为DF=1不能分片,设备将会丢包。 *MF(more Fragment):表示是否该报文为最后一片。0表示最后一片;1表示后面还有。若MF=1,DF一定为0,MF=0,DF可为0/1。 | 
| Fragment Offset (片偏移) | 12比特 | 分片重组时会用到该字段。表示较长的分组在分片后,某片在原组中的相对位置。以8个字节为偏移单位。 | 
| 
 
 Time to Live(生存时间) | 
 
 8比特 | 可经过的最多路由数。表示数据包在网络中可以通过的路由器的最大值。范围为0~255(28)数据包每经过一台路由器TTL值减1,直到为0,数据包死亡,路由器将丢弃该数据包。(若一个路由器收到一个数据包的TTL=1,路由器将会丢弃数据包。因为路由器处理完数据后TTL减1后为0,此时数据包不会发出了会直接丢弃) | 
| 
 
 
 
 Protocol (协议) | 
 
 
 
 8比特 | 协议:下一层协议。指出数据包携带的数据使用的何种协议,以便目的主机的IP层将数据上交给哪个进程处理。 常见值: * 0:保留Reserved * 1:ICMP * 6:TCP * 17:UDP * GRE:47 * 58:IPv6-ICMP * OSPF:89 * VRRP:112 | 
| Header Checksum (首部校验和) | 
 16比特 | 检验数据的完整性。(hash哈希算法:MD5,SHA等)只校验数据包的首部,不检验数据部分。这里不采用CRC检验码,而采用简单的计算方法。 | 
| Source Address (源IP地址) | 32比特 | 源IP地址 | 
| Destination Address (目标IP地址) | 32比特 | 目标IP地址 | 
| 
 Options(选项字段) | 
 可变 | 用来支持排错,测试以及安全等措施,内容丰富。选项字段长度可变,从1字节到40字节不等,取决于所选项的功能。 | 
| Padding(填充字段) | 可变 | 全填0。 | 
二、TCP报文格式
                                                         
TCP字段解释:
| 字段 | 长度 | 含义 | 
| Source Port(源端口) | 16比特 | 标识那个应用程序发送。 | 
| Destination Port (目标端口) | 16比特 | 标识哪个应用程序接收。 | 
| 
 Sequence Number (序列号) | 
 32比特 | TCP链接中传输的数据流中每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号。 | 
| 
 Acknowledgment Number (确认号) | 
 32比特 | 是期望收到对方的下一个报文段的数据的第一个字节的序号,即上次已成功接收到的数据字节号加1。只有ACK标识为1时,此字段有效。 | 
| 
 Data Offset(数据偏移) | 
 4比特 | 即首部长度,指出TCP报文段的数据起始处距离TCP报文的起始处有多远,以32比特(4字节)为计算单位。最多有60字节的首部,若无选项字段,正常为20字节。 | 
| Reserved(保留) | 6比特 | 必须填0。 | 
| URG(紧急指针有效标识) | 1比特 | 它告诉系统此报文段中有紧急数据,应尽快传送。(相当于高优先机的数据) | 
| ACK(确认序号有效标识) | 1比特 | 只有ACK=1时确认号字段才有效。当ACK=0时,确认号无效。 | 
| 
 PSH | 
 1比特 | 标识接收方应该尽快将这个报文段交给应用层。接收到PSH=1的TCP报文段,应尽快交付给应用进程,而不再等待整个缓存都填满了后再上交付。 | 
| 
 RST(重建连接标识) | 
 1比特 | 当RST=1时,表明TCP连接中出现严重错误(如由于主机崩溃或其他原因),必须释放连接,就算被修复好,也无法继续连接,只能重新建立连接。 | 
| SYN(同步序号标识) | 1比特 | 用来发起一个连接。SYN=1标识这是一个连接请求或连接接受请求。 | 
| FIN(发端完成发送任务标识) | 1比特 | 用来释放一个连接。FIN=1表明此报文段的发送端的数据已经发送完毕,并要求释放连接。 | 
| 
 Window(窗口) | 
 16比特 | TCP的流量控制。窗口起始于确认序号字段指明的值,这个只是接收端期望接收的字节数。窗口最大为216=65535字节。 | 
| 
 Checksum(校验字段) | 
 16比特 | 包括TCP首部和TCP数据,是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。 | 
| 
 
 Urgent Pointer (紧急指针) | 
 
 16比特 | 只有当URG标志置1时紧急指针才有效。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。紧急指针指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面) | 
| 
 
 
 
 Options(选项字段) | 
 
 
 
 可变 | TCP协议最初只规定了一种选项,即最长报文段长度(数据字段加上TCP首部),又称为MSS。MSS告诉对方TCP“我的缓存所能接收的报文段的数据字段的最大长度是MSS个字节”。 新的RFC规定有以下几种选型:选项表结束,无操作,最大报文段长度,窗口扩大因子,时间戳。 * 窗口扩大因子:3字节,其中一个字节表示偏移值S。新的窗口值等于TCP首部中的窗口位数增大到(16+S),相当于把窗口值向左移动S位后获得实际的窗口大小。 * 时间戳:10字节,其中最主要的字段是时间戳值(4字节)和时间戳回送应答字段(4字节)。 * 选项确认选项。 
 | 
| Padding(填充字段) | 可变 | 用来补位,使整个首部长度是4字节的整数倍。 | 
| data | 可变 | TCP负载。 | 
三、UDP报文格式
                                                            
UDP字段解释:
| 字段 | 长度 | 含义 | 
| Source Port (源端口) | 2字节 | 标识哪个应用程序发送。(发送进程) | 
| Destination Port (目标端口) | 2字节 | 标识哪个应用程序接收。(接收进程) | 
| Length(长度) | 2字节 | UDP首部加上UDP数据的字节数,最小为8。 | 
| 
 Checksum (校验和) | 
 2字节 | 覆盖UDP首部和UDP数据。是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。是可选的。 | 
| data octets | 变长 | UDP负载,可选的。 | 
 爱站程序员基地
爱站程序员基地


