正文

TCP/IP数据报格式2009-06-15 18:38:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/xman/44383.html

分享到:

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

标志位长度为3比特,用于分段控制:第0位为预留位,第1位表示可否分段。当该位的值为0时,表示数据报不可分段,值为1时,表示数据报可被分段。第2位为段是否结束位,当该位的值为0时,表示该段是原数据报的最后一段,值为1时,表示后面不有更多的分段。
  当网络设备要发送的数据报长度比所在网络的最大传输单元(MTUMax Transfer United)大,并且标志位的第1位设置为不能分段(0)时,网络设备会向发送方返回一个因特网控制消息协议ICMP错误消息,并丢弃该数据报。除了最后一个分段外,其余分段的第2位均设置为1

段偏移13比特长度,用于指定分段在原始数据报中的位置,8个字节为单位.

生存时间TTL长度为8比特,用于指定数据报允许保留在网络上的时间。

协议字段长度为8比特,用于指定数据报数据区中携带的消息是由哪种高级协议建立的。ICMP1,TCP6UDP17。 协议号分配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将段中的数据放入接收缓冲器,然后将段重装为应用程序数据,再将这些数据发送到目的的应用程序进程。
      
尽管TCPUDP都使用相同的网络层(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协议通过使用"端口"来标识源端和目标端的应用进程。端口号可以使用065535之间的任何数字。在收到服务请求时,操作系统动态地为客户端的应用程序分配端口号。在服务器端,每种服务在"众所周知的端口"Well-Know Port)为用户提供服务。

顺序号字段:占32比特。用来标识从TCP源端向TCP目标端发送的数据字节流,它表示在这个报文段中的第一个数据字节。
  
确认号字段:占32比特。只有ACK标志为1时,确认号字段才有效。它包含目标端所期望收到源端的下一个数据字节。
  
头部长度字段:占4比特。给出头部占32比特的数目。没有任何选项字段的TCP头部长度为20字节;最多可以有60字节的TCP头部。

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

标志位字段(UAPRSF):占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

阅读(11318) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册