当前位置:文档之家› IPv6及TCP协议帧格式

IPv6及TCP协议帧格式

一、TCP协议由RFC 793定义:

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

面向连接:在应用TCP协议进行通信之前双方通常需要通过三次握手来建立TCP连接,连接建立后才能进行正常的数据传输,因此广播和多播不会承载在T CP协议上。

可靠性:由于TCP处于多跳通信的IP层之上,而IP层并不提供可靠的传输,因此在TCP层看来就有四种常见传输错误问题,分别是比特错误(packet bit e rrors)、包乱序(packet reordering)、包重复(packet duplication)、丢包(p acket erasure或称为packet drops),因此TCP要提供可靠的传输,就需要具有超时与重传管理、窗口管理、流量控制、拥塞控制等功能。

字节流式:应用层发送的数据会在TCP的发送端缓存起来,统一分片(例如一个应用层的数据包分成两个TCP包)或者打包(例如两个或者多个应用层的数据包打包成一个TCP数据包)发送,到接收端的时候接收端也是直接按照字节流将数据传递给应用层。作为对比,同样是传输层的协议,UDP并不会对应用层的数据包进行打包和分片的操作,一般一个应用层的数据包就对应一个UDP包。

TCP报文格式:TCP封装在IP报文中的时候,如下图所示,TCP头紧接着I P头(IPV6有扩展头的时候,则TCP头在扩展头后面),不携带选项(option)的T CP头长为20bytes,携带选项的TCP头最长可到60bytes。

其中header length字段由4比特构成,最大值为15,单位是32比特,即头长的最大值为15*32 bits = 60bytes,因此上面说携带选项的TCP头长最长

为60bytes。

TCP的源端口、目的端口、以及IP层的源IP地址、目的IP地址四元组唯一的标识了一个TCP连接

TCP各字段释义:

TCP源端口(Source Port):16位的源端口其中包含发送方应用程序对应的端口。源端口和源IP地址标示报文发送端的地址。

TCP目的端口(Destination port):16位的目的端口域定义传输的目的。这个端口指明报文接收计算机上的应用程序地址接口。

TCP序列号(SequenceNumber):32位的序列号标识了TCP报文中第一个b yte在对应方向的传输中对应的字节序号。当SYN出现,SN=ISN(随机值)单位是byte。比如发送端发送的一个TCP包净荷(不包含TCP头)为12byte,SN为5,则发送端接着发送的下一个数据包的时候,SN应该设置为5+12=17。通过序列号,TCP接收端可以识别出重复接收到的TCP包,从而丢弃重复包,同时对于乱序数据包也可以依靠系列号进行重排序,进而对高层提供有序的数据流。另外如果接收的包中包含SYN或FIN标志位,逻辑上也占用1个byte,应答号需加1。

TCP应答号(Acknowledgment Number简称ACK Number):32位的ACK Number 是期望收到对方下一个报文段的数据的第一个字节的序号。如果设置了ACK控制位,这个值表示一个准备接收的包的序列码,注意是准备接收的包,比如当前接收端接收到一个净荷为12byte的数据包,SN为5,则会回复一个确认收到的数据包,如果这个数据包之前的数据也都已经收到了,这个数据包中的ACK Number 则设置为12+5=17,表示之前的数据都已经收到了,准备接受SN=17的数据包。

头长(Header Length):4位包括TCP头大小,指示TCP头的长度,即数据从何处开始。TCP 最多有 60(15*4)字节的首部

保留(Reserved):4位值域,这些位必须是0。为了将来定义新的用途所保留,其中RFC3540将Reserved字段中的最后一位定义为Nonce标志。后续拥塞控制部分的讲解我们会简单介绍Nonce标志位。

标志(Code Bits):8位标志位,下面介绍。

窗口大小(Window Size):16位即2个字节,用来控制对方发送的数据量,单位是字节,指明对方发送窗口的上限。该值指示了从Ack Number开始还愿意接收多少byte的数据量,也即用来表示当前接收端的接收窗还有多少剩余空间,用于TCP的流量控制。窗口大小最大为 65535(2^16 - 1)。

校验位(Checksum):16位TCP头。发送端基于数据内容计算一个数值,接收端要与发送端数值结果完全一样,才能证明数据的有效性。接收端checksum 校验失败的时候会直接丢掉这个数据包。CheckSum是根据伪头+TCP头+TCP数据三部分进行计算的。校验的范围包括首部和数据两个部分,计算校验和时需要在报文段前加上12字节的伪首部。

优先指针(紧急,Urgent Pointer):16位,指出本报文段中紧急数据最后一个字节的序号。只有当紧急比特URG=1时才有效。如果URG标志没有被设置,紧急域作为填充。

选项(Option):长度不定,但长度必须以是32bits的整数倍。常见的选项包括MSS、SACK、Timestamp等等。

八位标志位分别介绍如下:

CWR(Congestion Window Reduce):拥塞窗口减少标志set by sender,用来表明它接收到了设置ECE标志的TCP包。并且sender 在收到消息之后已经通过降低发送窗口的大小来降低发送速率。

ECE(ECN Echo):ECN响应标志被用来在TCP3次握手时表明一个TCP端是具备ECN功能的。在数据传输过程中也用来表明接收到的TCP包的IP头部的ECN 被设置为11。注:IP头部的ECN被设置为11表明网络线路拥堵。

注:关于CWR和ECE标记为详细信息可参考:/ha dis-yuki/p/5467787.html

紧急比特URG(Urgent):该标志位置位表示紧急(The urgent pointer) 标志有效。该标志位目前已经很少使用参考后面流量控制和窗口管理部分的介绍。当URG=1时,表明紧急指针有效。它告诉系统报文段中有紧急数据,应尽快传送。

确认比特ACK:取值1代表Acknowledgment Number字段有效,这是一个确认的TCP包,取值0则不是确认包。即ACK=1时确认号字段才有效,ACK=0时确认号字段无效。当ACK标志位有效的时候我们称呼这个包为ACK包,使用大写的ACK称呼。

推送比特PUSH(Push):接收方接收到PUSH=1的报文段时会尽快的将其交付给接收应用进程,而不再等到整个接收缓存都填满后再向上交付,PUSH=0一般

相关主题