首页 > 编程知识 正文

TCP报文格式,tcp报文段首部各字段的值

时间:2023-05-03 11:02:23 阅读:15613 作者:1707

TCP段的开头格式: TCP段的开头的前20个字节是固定的,后面的4n字节是根据需要添加的选择线(n是整数)。

源端口和目标端口分别为2个字节,分别写入源端口号和目标端口号。 与UDP的分配类似,但TCP的分配功能也通过端口实现。 序列号,4字节。 号码范围为[ 0,232-1 ],共232个(即4294967296 )号码。 号码增加到2^32-1后,下一个号码又恢复为0。 也就是说,编号使用mod 2^32运算。 TCP面向字节流。 在TCP连接上传输的字节流中的每个字节按顺序编号。 必须在建立连接时设置要传输的整个字节流的起始序列号。 标题中序列号字段的值是指从本报文档发送的数据的第一个字节的序列号。 例如,一个段的编号是301,接受的数据共有100字节。 这示出了本报纸文档数据的第一个字节的编号为301,最后一个字节的编号为400。 当然,下一个消息段的数据号必须从401开始。 也就是说,下一个消息段的编号字段的值必须为401。 此字段的编号也称为“消息段编号”。 确认号码是占用4字节、想接受对方的下一个消息段的第一个数据字节的号码。 例如,b正确地接收到从a发送来的消息片段,序列号字段的值为501并且数据长度为200字节(序列号501~700 )意味着b接收到从a发送来的序列号700的数据因此,b预期来自a的下一个数据号码是701,b在发送到a的确认消息段中将确认号码设置为701。 请注意,目前确认号码不是501也不是700,而是701。

也就是说,确认编号=N时,表示编号N-1之前的所有数据都被正确接收。 数据偏移占4位,指示TCP段的数据开头距离TCP段的开头有多远。 此字段实际上指示TCP消息段的开头长度。 由于标头中还有长度不确定的选项字段,因此需要数据偏移字段,但请注意“数据偏移”的单位是32位字,即4字节的字单位。 4位二进制表示的十进制最大值为15,因此数据偏移的最大值为60字节。 这也是TCP标头的最大字节。 也就是说,选项的长度不能超过40字节。 保留,占6位,为了今后的使用保留,但现在应该是0。

以下六个控制位用于解释本报文章的性质。 紧急URG(urgent )在URG=1时指示紧急指针字段有效。 这将告知系统该消息段具有紧急数据,需要尽快发送,而不是原始队列顺序(相当于高优先级数据)。 例如,长时间发送的程序在远程主机上运行。 但是,之后发现了一些问题,需要取消程序的运行,因此用户从键盘发出中断命令。 如果不使用紧急数据,这两个字符将存储在接收TCP的缓存末尾。 只有在处理完所有资料后,这两个字元才会传递给接收方的APP应用程式程序。 这样做会浪费很多时间。

当URG被设置为1时,发送APP应用通知发送方TCP转发紧急数据。 因此,发送侧TCP将紧急数据插入本报的文章数据的开头,紧急数据之后的数据保持为通常的数据。 在这种情况下,请与第一个“紧急指针”(Urgent Pointer )字段一起使用。 确认确认(ack ),仅在ACK=1时确认号码字段有效,ACK=0时确认号码无效。 TCP规定,建立连接后发送的所有消息段必须将ACK设为1。 当两个APP应用程序进程进行交互式通信时,推送(psh )可能希望在一个APP应用程序进程键入命令后立即收到对方的响应。 在这种情况下,TCP可以使用推送操作。 此时,发送侧TCP将PSH设定为1,立即生成消息段并发送。 接收方TCP接收到PSH=1的报文段后,尽快“推送”清醒保温杯传递给接收APP应用进程。 整个现金都满了才需要交货。 复位rst(reset ) RST=1时,表名TCP连接发生了严重错误)。 例如,由于主机崩溃等原因,需要释放连接,然后重新建立传输连接。 如果将RST设置为1,则还用于拒绝不正确的消息段或拒绝打开连接。 同步(syn )用于在建立连接时同步序列号。 如果SYN=1,ACK=0,则表示这是连接请求消息段。 如果对方同意建立连接,则在响应的消息段中必须SYN=1和ACK=1。 因此,SYN设置为1表示这是连接请求或连接接受消息。 退出fin(finis,意为“结束”“结束”),用于释放一个连接。 FIN=1时,表示该段的发送数据已发送,请求释放运输连接。 窗口,占两个字节。 窗口值是【0,2 ^ 16-1】之间的整数。 所谓窗口,不是指自己的发送窗口,而是指发送本报文字的一方的受理窗口。 窗口的值根据本报文档开头的确认编号,以字节为单位传达接收方当前允许发送给对方的数据量。 之所以需要此限制,是因为接收方的数据缓存空间有限。 也就是说,窗口值是接收方将发送方设置在发送方的依据。

例如,假设发送了一个确认号为701、窗口字段为1000的消息段。 从“701开始,我(也就是发送方消息段一侧)的接收缓存区域还接受1000字节的数据。 字节号为701到1700。 你在给我发送数据的时候,必须考虑这一点。 ”并告诉对方。

总之,窗口字段明确显示了当前对方可以发送的数据量。 窗口的值总是动态变化的。 检查,占2字节。 检查和现场检查的范围包括报头和数据两部分。 类似于UDP用户数据报,在计算校验和时,在TCP分组块之前添加12字节的假报头。 虚拟标头的格式与UDP用户数据报的虚拟标头相同。 但是,必须将虚拟标头中第四个字段的17更改为6。 TCP的协议编号为6。 将字段5中的UDP长度更改为TCP长度。

接收方收到此报文段后,仍要加上这个伪首部来计算检验和。若使用TPv6,则相应的伪首部也要改变。紧急指针,占2字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据) 。因此,在紧急指针指出了紧急数据的末尾在报文段中的位置。当所有紧急数据都处理完时,TCP就告诉应用程序恢复到正常操作。值得注意的是,即使窗口为0时也可以发送紧急数据。选项,长度可变,最长可达4字节。当没有使用“选项”时,TCP的首部长度是20字节。

TCP最初只规定了一种选项,即最大报文段长度MSS(Maximum Segment Szie)。注意MSS这个名词含义。MSS是每一个TCP报文段中的数据字段的最大长度。数据字段加上TCP首部才等于整个的TCP报文段。所以MSS并不是整个TCP报文段的最大长度,而是“TCP报文段长度减去TCP首部长度”。
为什么要规定一个最大报文长度MSS呢?这并不是考虑接受方的接收缓存可能存放不下TCP报文段中的数据。实际上,MSS与接收窗口值没有关系。我们知道,TCP报文段的数据部分,至少要加上40字节的首部(TCP首部20字节和IP首部20字节,这里还没有考虑首部中的可选部分)才能组装成一个IP数据报。若选择较小的MSS长度,网络的利用率就降低。设想在极端情况下,当TCP报文段只含有1字节的数据时,在IP层传输的数据报的开销至少有40字节(包括TCP报文段的首部和IP数据报的首部)。这样,对网络的利用率就不会超过1/41。到了数据链路层还要加上一些开销。但反过来,若TCP报文段非常长,那么在IP层传输时就有可能要分解成多个短数据报片。在终点要把收到的各个短数据报片组成成原来的TCP报文段,当传输出错时还要进行重传,这些也都会使开销增大。
因此,MSS应尽可能大些,只要在IP层传输时不需要分片就行。由于IP数据报所经历的路径是动态变化的,因此在这条路径上确定的不需要的分片的MSS,如果改走另一条路径就可能需要进行分片。因此最佳的MSS是很难确定的。在连接过程中,双方都把自己能够支持的MSS写入这一字段,以后就按照这个数值传输数据,两个传送方向可以有不同的MSS值。若主机未填写这一项,则MSS的默认值是536字节长。因此,所有在互联网上的主机都应该接受的报文段长度是536+20(固定首部长度)=556字节。
后来又增加了几个选项如窗口扩大选项、时间戳选项等。
窗口扩大选项是为了扩大窗口。我们知道,TCP首部中窗口字段长度是16位,因此最大的窗口大小为64K字节。虽然这对早期的网络是足够用的,但对于包含卫星信道的网络,传播时延和宽带都很大,要获得高吞吐量需要更大的窗口大小。
窗口扩大选项占3字节,其中有一个字节表示移位值S。新的窗口值等于TCP首部中的窗口位数从16增大到(16+S)。移位值允许使用的最大值是14,相当于窗口最大值增大到2(16+14)-1=230-1。
窗口扩大选项可以在双方初始建立TCP连接时进行协商。如果连接的某一端实现了窗口扩大,当它不再需要扩大其窗口时,可发送S=0选项,使窗口大小回到16。
时间戳选项占10字节,其中最主要的字段是时间戳字段(4字节)和时间戳回送回答字段(4字节)。时间戳选项有以下两个概念:
第一、 用来计算往返时间RTT。发送方在发送报文段时把当前时钟的时间值放入时间戳字段,接收方在确认该报文段时把时间戳字段复制到时间戳回送回答字段。因此,发送方在收到确认报文后,可以准确地计算出RTT来。
第二、 用于处理TCP序号超过232的情况,这又称为防止序号绕回PAWS。我们知道,TCP报文段的序号只有32位,而每增加232个序号就会重复使用原来用过的序号。当使用高速网络时,在一次TCP连接的数据传送中序号很可能被重复使用。例如,当使用1.5Mbit/s的速度发送报文段时,序号重复要6小时以上。但若用2.5Gbit/s的速率发送报文段,则不到14秒钟序号就会重复。为了使接收方能够把新的报文段和迟到很久的报文段区分开,则可以在报文段中加上这种时间戳。

TCP最主要的特点: TCP是面向连接的运输层协议,应用程序之间的通信好像在“打电话”:通话前要先拨号建立连接,通话结束后要挂机释放连接。每一条TCP连接只能有两个端点(endpoint),每一条TCP连接只能是点对点的(一对一)。TCP提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复并且按序到达。TCP提供全双工通信。TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。在发送时,应用程序在把数据传送给TCP的缓存后,就可以做自己的事,而TCP在合适的时候把数据发送出去。在接收时,TCP把收到的数据放入缓存,上层的应用进程在合适的时候读取缓存中的数据。面向字节流。TCP中的“流”(stream)指的是流入到进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序交下来的数据看成仅仅是一连串的无结构的字节流。TCP并不知道所传送的字节流的含义。TCP不保证接收方应用程序所接收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系(例如,发送方应用程序交给发送方的TCP工10个数据块,但接收方的TCP可能只用了4个数据块就把收到的字节流交付上层的应用程序)。但发送方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。当然,接收方的应用程序必须有能力识别收到的字节流,把它还原成有意义的应用层数据。
TCP和UDP在发送报文时所采用的方式完全不同。TCP并不关心应用进程一次把多长的报文发送到TCP的缓存中,而是根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节(UDP发送的报文长度是应用进程给出的)。如果应用进程传送到TCP缓存的数据块太长,TCP就可以把它划分短一些再传送。如果应用进程一次只发来一个字节,TCP也可以等待积累有足够多的字节后再构成报文段发送出去。 可靠传输的工作原理 停止等待协议:自动重传请求ARQ(Automatic Repeat reQuest),意思是重传的请求是自动进行的,接收方不需要请求发送方重传某个出错的分组。连续ARQ协议:连续ARQ协议规定,发送方每收到一个确认,就把发送窗口冷静的保温杯滑动一个分组的位置。接收方一般都是采用累计确认的方式,也就是说,接收方不必对收到的分组逐个发送确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认,这就表示:到这个分组为止的所有分组都已正确收到了。累计确认有优点也有缺点,优点是:容易实现,即使确认丢失也不必重传,但缺点是不能向发送方反映出接收方已经正确收到的所有分组的信息。例如,如果发送方发送了前5个分组,而中间的第3个分组丢失了。这是接收方只能对前两个分组发出确认。发送方无法知道后面三个分组的下落,而只好把后面的三个分组都再重传一次。这就叫做Go-back-N(回退N),表示需要再退回来重传已发送过的N个分组。可见当通信线路质量不好时,连续ARQ协议会带来负面的影响。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。