我是靠谱客的博主 积极哑铃,最近开发中收集的这篇文章主要介绍TCP报文段首部分析详解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

TCP协议

传输控制协议TCP(Transmission Control Protocol) 是运输层的主要协议,运输层另一个重要的协议是用户数据报协议UDP(User Datagram Protocol),这两个控制协议在协议栈中的位置入下图:
这里写图片描述

TCP最主要的特点

  1. TCP是面向连接的运输层协议
  2. 每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的。
  3. TCP提供可靠交付的服务。
  4. TCP提供全双工通信。
  5. TCP是面向字节流的。

TCP报文段的首部格式

本篇博客主要讲解TCP首部固定部分个字段的意义,我们首先看一下TCP报文段的首部格式:
这里写图片描述

(1)源端口和目的端口: 各占两个字节,分别写入源端口号和目的端口号。
(3)序号:占4个字节。序号的范围是[0,2^32-1],序号增加到2^32-1后,下一个序号就又回到0。TCP是面向字节流的,在一个TCP连接中传送的字节流中每一个字节都按顺序编号。整个要传送的字节流的起始序号必须在连接建立时设置。首部的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。
(4)确认号: 占4个字节,是期望收到对方下一个报文段的第一数据字节的序号。。例如,B正确收到A发过来的一个报文段,其序号字段值是201,而数据长度为100字节(序号201-300),B收到A发送的序号300为止的数据,因此,B期望收到下一个数据序号为301,所以B发给A的确认号为301。

若确认号 = N,则表明:到序号N-1为止的所有数据都已正确收到。

(5)数据偏移: 占4位,它指出TCP报文段的数据起始处距离TCP报文段的起始处有多远。这个报文段实际是指出TCP报文段的首部长度。由于四位二进制数能够表示的最大十进制数字是15,因此数据偏移的最大值是60字节,这也是TCP首部的最大长度。
(6)保留::占6位,保留为今后使用,但目前应置为0。
(7)紧急UPG(URGent): 当URG = 1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。例如:已经发送了很长的一个程序要在远地的主机上运行。但后来发现了一些问题,需要取消该程序,因此用户从键盘发出中断命令(Control + C)。如果不使用紧急数据,那么这两个字符将存储在接收TCP的缓存末尾。只有在所有的数据被处理完毕后,这两个字符才被交付接收方的应用进程。
当URG置1时,发送应用进程就告诉发送方的TCP有紧急数据要传送,于是发送发TCP就把紧急数据插入到本报文段数据的最前面,这个时候要与首部中的紧急指针(Urgent Pointer)字段配合使用。
(8)确认 ACK(ACKnowledgment) 仅当ACK = 1时确认号字段才有效。当ACK = 0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1。
(9)推送 PSH(PuSH):告诉对方收到该报文段后是否应该立即把数据推送给上层。如果为1,则表示对方应当立即把数据提交给上层,而不是缓存起来。
(10)复位RST (ReSeT):只有当RST=1时才有用。如果你收到一个RST=1的报文,说明你与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明你上次发送给主机的数据有问题,主机拒绝响应。
(11)同步SYN(SYNchronization):在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1。
(12)终止FIN(FINis):标记数据是否发送完毕。如果FIN=1,就相当于告诉对方:“我的数据已经发送完毕,你可以释放连接了”
(13)窗口: 占2字节,窗口值是[0,2^16-1]之间的整数。窗口指的是发送本报文段的一方接收窗口。窗口值作为接收方让发送方设置其发送窗口的依据。
(14)校验和:占2字节,校验和字段检查的范围包括首部和数据这两部分。
(15)紧急指针:占2字节,当URG = 1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。因此,紧急指针指出了紧急数据的末尾在报文段中的位置,当所有紧急数据处理完毕时,TCP就告诉应用程序恢复到正常操作。注意:即使窗口为-时也可以发送紧急数据。
(16)选项:长度可变,最长可达40字节,当没有使用“选项“时,TCP的首部长度是20字节。
选项部分的应用:

  1. MSS最大报文段长度(Maxium Segment Size):指明数据字段的最大长度,数据字段的长度加上TCP首部的长度才等于整个TCP报文段的长度。MSS值指示自己期望对方发送TCP报文段时那个数据字段的长度。通信双方可以有不同的MSS值。如果未填写,默认采用536字节。MSS只出现在SYN报文中。即:MSS出现在SYN=1的报文段中。
  2. 窗口扩大选项(Windows Scaling):由于TCP首部的窗口大小字段长度是16位,所以其表示的最大数是65535。但是随着时延和带宽比较大的通信产生(如卫星通信),需要更大的窗口来满足性能和吞吐率,所以产生了这个窗口扩大选项。
  3. SACK选择确认项(Selective Acknowledgements):用来确保只重传缺少的报文段,而不是重传所有报文段。比如主机A发送报文段1、2、3,而主机B仅收到报文段1、3。那么此时就需要使用SACK选项来告诉发送方只发送丢失的数据。那么又如何指明丢失了哪些报文段呢?使用SACK需要两个功能字节。一个表示要使用SACK选项,另一个指明这个选项占用多少字节。描述丢失的报文段2,是通过描述它的左右边界报文段1、3来完成的。而这个1、3实际上是表示序列号,所以描述一个丢失的报文段需要64位即8个字节的空间。那么可以推算整个选项字段最多描述(40-2)/8=4个丢失的报文段。
  4. 时间戳选项(Timestamps):可以用来计算RTT(往返时间),发送方发送TCP报文时,把当前的时间值放入时间戳字段,接收方收到后发送确认报文时,把这个时间戳字段的值复制到确认报文中,当发送方收到确认报文后即可计算出RTT。也可以用来防止回绕序号PAWS,也可以说可以用来区分相同序列号的不同报文。因为序列号用32为表示,每2^32个序列号就会产生回绕,那么使用时间戳字段就很容易区分相同序列号的不同报文。
  5. NOP(NO-Operation):它要求选项部分中的每种选项长度必须是4字节的倍数,不足的则用NOP填充。同时也可以用来分割不同的选项字段。如窗口扩大选项和SACK之间用NOP隔开。

最后

以上就是积极哑铃为你收集整理的TCP报文段首部分析详解的全部内容,希望文章能够帮你解决TCP报文段首部分析详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部