化妆品营销型网站模板,2022适合小学生的简短新闻摘抄,品牌建设的创新与特色,简约淘宝网站模板免费下载本篇文章基于 RFC 9293: Transmission Control Protocol (TCP) 对TCP报头进行讲解#xff0c;部分内容会与旧版本有些许区别。 TCP协议传输的数据单元是报文段#xff0c;一个报文段由TCP首部#xff08;报文头#xff09;和TCP数据两部分组成#xff0c;其中TCP首部尤其重… 本篇文章基于 RFC 9293: Transmission Control Protocol (TCP) 对TCP报头进行讲解部分内容会与旧版本有些许区别。 TCP协议传输的数据单元是报文段一个报文段由TCP首部报文头和TCP数据两部分组成其中TCP首部尤其重要首部用于控制(新建、断开)连接、流量和拥塞等。TCP首部的固定长度是20B最大长度是60B其中可变选项长度最长为40B(4B×10)。 字段解释 源端口Source Port占用 2 Byte标识发送方应用程序使用的端口号目的端口Destination Port占用 2 Byte标识发送方应用程序的目标端口号也就是接收方应用程序的端口号序号SeqSequence Number占用 4 Byte范围是[0, 2^32)标识TCP报文段中的第一个字节数据的序列号用于保证传输数据的可靠性和顺序性。TCP是一个面向字节流的传输控制协议且支持全双工通信所以为了保证发送方和接收方都能独立进行传输两端通信时都必须得知道各自分别发送和接收了多少个字节数据不含TCP首部以及接收到数据后如何进行读取、拼接组合。TCP发送方用Seq字段告知接收方自建立连接以来我方已累计不包含本报文段已发送了Seq-1个字节数据本次传输的报文数据第一个字节序列号是Seq而接收方在成功接收完一段或多段数据后可以根据Seq的大小顺序对数据进行拼接组合并且用Ack字段告知发送方我方已成功接收了Ack-1个字节数据期望下次接收的报文段是从Ack序号开始。【为什么都要减1呢因为TCP成功建立连接后Seq和Ack都会置为1所以Seq和Ack的起始值都是1。第N次发送数据时的 Seq Seq初始值1 第1次发送的字节长度 ··· 第N-1次发送的数据字节长度也就是第N次发送数据时的 Seq 第N-1次发送数据时的 Seq 第N-1次发送的数据字节长度】。请注意TCP建立连接和断开连接时Seq和Ack跟TCP报文数据长度无关。当Seq到达2^32-14GB内容.....后又会从0重新开始。确认号AckAcknowledgment Number占用 4 Byte标识接收方期望收到下一个报文段的序列号是Ack也可以理解成接收方已成功接收了Ack-1个字节数据。只有标志位ACK为1时确认号才有效。接收方在成功接收完数据后需要给发送方一个确认告诉发送方已收到某个报文段事实上接收方往往是在成功接收了多条报文段后才发送一次Ack。 数据偏移Data Offset占用 4 bit标识TCP报文段中报文数据的起始位置距离报文段开始位置有多远也就是TCP的首部长度是多少单位是32bit4字节。从下图可以看到TCP首部长度 Header Length 为 0101转换成十进制是54Byte × 5 20 Byte。而TCP首部固定长度是20Byte可变长度是40 Byte最长是60 Byte所以数据偏移值最小是5最大是15[0101, 1111]。 保留Reserved占用 3 bit预留给未来使用的一组控制位目前该值设置为0。TCP首部的数据偏移(首部长度)、保留位和标志位公用16 bit也就是2 byte其中数据偏移独占4 bit保留位和标志位一共可分配12 bit如果我们把保留位Reserved也当成一个预留的或空白的标志位那么完全可以理解成TCP最多可分配12个标志位目前rfc9293版已明确的标志位共有8个还有1个处于实验阶段的标志位AE一共是9个标志位每个标志位占用1 bit剩余的3 bit由Reserved占用。标志位Flags也叫控制位每一个标志位占用 1 bit。目前已有9个标志位包括AE、CWR、ECE、URG、ACK、PSH、RST、SYN和FIN值为0或1用于控制TCP的拥塞、连接的建立、管理和关闭等。 AEAccurate ECN处于试验期的标志位。外文资料也比较少看了半天也不知道是用来干嘛的暂且搁置吧。CWRCongestion Window Reduce拥塞窗口减半标志发送端通过降低“cwnd”和“ssthresh”来应对网络拥塞。CWR和ECE都是用来控制网络拥塞的而CWR是用来响应ECE的所以在了解CWR作用之前我们得先搞懂ECE是用来干嘛的。Explicit Congestion Notification翻译过来就是“显式拥塞通知”简写ECN。数据报在发送方发出后可能要经过多个路由器才能到达接收方如果中间某个路由器根据算法结果判断出自身发生了拥塞就会在报文的IP首部设置CE标志(ECE)接收方在接收到这段报文后发现IP头设置了CE标志表明数据发送途中网络有拥塞得赶紧把这个消息告诉发送方不然可能要丢包。接收方在后续返回给发送方的每一条ACK报文都会设置ECN-Echo(ECE)为1用于告知发送方从贵方到我方的网络有拥塞。而发送方在接收到对方返回的ECE报文后得知网络有拥塞就会将拥塞窗口“cwnd”减半并降低慢启动阈值“ssthresh”之后再发送CWR报文给接收方接收方收到CWR报文后表明发送方也采取相应措施来应对网络拥塞随后便不再发送ECE报文。请注意数据重传时TCP报头中不会设置CWR标志位。ECEECN-Echo用于通知对方从对方到我方的网络有拥塞。如果发送方收到ECN-Echo (ECE) ACK包(即TCP报头中设置了ECN-Echo标志的ACK包)则发送方知道在从发送方到接收方的路径上遇到了网络拥塞。URGUrgent标识是否为紧急报文配合紧急指针urgent pointer一起使用值为0或1 。当标志位URG为1时表明该报文段有紧急数据需要尽快发送发送端此时不会把报文数据写入到缓冲区而是直接发送给应用层即使对端窗口大小此时为0系统也要以高优先级发送该段报文紧急数据会放在TCP报文段数据部分的最前端紧急指针用于标识紧急数据在TCP报文段数据部分的结束位置紧急数据之后的字节内容依然是普通数据。ACKAcknowledgment标识确认应答是否有效配合确认号AckAcknowledgment Number一起使用值为0或1 。当标志位ACK为1时确认号Ack才有效。除了最初建立连接时发送的SYN报文段之外其它情况下发送的报文段ACK都为1。PSHPush标识是否立即把报文数据推送给应用层值为0或1。如果TCP接收方接收到PSH为1的报文段应尽快把这段报文数据从接收缓冲区中读出并立即推送给应用层不必等到缓冲区写满后再推送。常用于请求方发送完一个新请求后希望立即得到对端的响应。 RSTReset标识是否重置连接值为0或1 。当RST为1时表明TCP连接发生错误需要先强制断开连接再重新建立新的连接称之为复位TCP连接这种报文也称之为复位报文段。SYNSynchronize该标志位用于在建立连接时同步Seq和Ack的初始值仅在建立连接时使用。TCP三次握手中第一次握手时客户端先发送“SYN1ACK0”的报文段表示请求建立第二次握手时如果服务端同意建立连接就返回“SYN1ACK1”的报文段。我们把含有SYN标志位的报文称为同步报文段。FINFinish该标志位用于断开/释放连接仅在断开连接时使用。当通信结束后需要断开连接时主动要求断开连接的一方会发送“FIN1ACK1”的报文段给对端告知对端通信已结束希望断开连接对端接收后会相应地返回“ACK1”的报文段至此连接会彻底关闭。我们把含有FIN标志位的报文称为结束报文段。
窗口Window占用 2 Byte16bit表示TCP接收方当前可用的最大缓冲区(Receive Buffer)大小常配合Options字段中的Window Scale一起使用用于实现滑动窗口机制对流量进行控制接收方通过Window告知发送方我方剩余的接收缓冲区还剩这么多发送发会根据Window大小灵活调整发送速率从而避免网络拥塞并确保通信的稳定性。请注意Window大小值有时候并不代表当前的实际可用窗口大小因为Window共占用16位最大值是2^16-1也就是64K(65535)在当前的网络高带宽情况下64K显然已无法满足大部分的网络通信所以后来就在TCP的Options字段中新增了Window Scale对窗口进行放大Window Scale代表的是一个向左的位移值(Shift count)最大值是14。二进制数据每增加一位1其换算指数都会加1所以实际窗口大小最大允许值应该是 2^(1614) -1 2^30 - 1长达1Gb。TCP在建立连接时的前两次握手过程中双方都会用Window Scale来向对端声明我方的窗口放大因子并缓存对端的窗口放大因子后期通信过程中不再声明仅发送Window双方会用对方的Window和Window Scale来计算实际的窗口大小并根据实际窗口大小调整发送速率如果窗口为0发送方会定期进行窗口探测。用图说话 校验和Checksum占用 2 Byte接收方校验接收的数据是否与发送的数据完全一致用于保证数据的完整性和准确性。Checksum是一个强制字段发送方必须生成并发送它接收方必须检查它。数据在传输过程可能会出错所以TCP发送方在发送数据前会先根据伪首部、报文段首部和报文段数据计算校验和值并将最终得到的值写入Checksum字段。而接收方在收到此报文段后会根据伪首部、报文段首部和报文段数据再次计算校验和值如果结果是0说明数据一致否则丢弃数据并报告发送方重传这段数据。 TCP发送方计算校验和过程 1.先将TCP报文段首部中的Checksum字段置为0因为Checksum本身也要参与计算 2.将伪首部、TCP报文段首部和TCP报文段数据连在一起并分成若干个16位的位串看是否是偶数个字节所有数据是否对齐如果不是则在右侧填充一个全为0的8位位串填充段仅用于计算校验和值不会传输给接收方将每个16位位串看成一个二进制数 3.对这些16位的二进制数进行1的补码和运算(ones complement sum)如果最高位有进位应循环进到最低位累加的结果再取反码即得到校验和 4.将校验写入TCP报文首部的Checksum字段。 TCP接收方检查校验和过程 1.接收方将伪首部、TCP报文段首部和TCP报文段数据按发送方同样的方式不包含发送方的第1步操作进行1的补码和运算累加的结果再取反码。 2.校验如果上步的结果为0表示传输正确否则说明传输有差错。 紧急指针Urgent Pointer占用 2 Byte也称紧急偏移用于标识紧急数据在TCP报文段数据部分的结束位置/正的偏移量。只有当标志位URG为1时该参数才有效。紧急数据是放在TCP报文段数据部分的最前端紧急指针用于标识紧急数据在TCP报文段数据部分的结束位置紧急数据之后的字节内容依然是普通数据。选项Options占用 0~40 Byte可选字段用于传输TCP报文的附加信息Options所有选项也都包含在校验和中。仅当 Data Offset 5 时Options才会出现size(Options) (Data Offset - 5)×32每个option的长度必须是8bit的整倍数最短1个字节且Options总长度也必须是32bit(4字节)的整倍数。如果某个option的长度不够4字节那么就用“No-Operation占用1字节”来补充位数(都是补高位)缺几个字节就补几个“No-Operation”。请注意当整个选项列表的结束位置无法与TCP报头尾部对齐时TCP会在整个选项(all options, not each option)列表的尾部填充“End of Option List”选项。综上可知size包含了补位和填充的数据长度。一个option由Kind、Length和Data三部分组成其中Length和Data是选填参数Length表示的是当前这个option的总长度它包含Kind、Length和Data三者总共占用的位数。 常用option如下表
KindLengthMeaningReference0-End of Option ListRFC9293仅用于填充整个选项列表尾部。1-No-OperationNOPRFC9293补位选项。24Maximum Segment SizeMSSRFC9293最大报文段长度具体限制的是TCP报文段中数据部分的长度。33Window ScaleRFC7323窗口放大因子42SACK PermittedRFC2018标识是否支持SACK只有在建立连接时SYN报段使用。5NSelective AcknowledgmentSACKRFC2018选择性确认用于数据重传机制。接收方可通过SACK参数告知发送方我方收到了不连续的数据块Ack200SACK200-400发送方可根据此信息检查哪部分数据丢失对方收到200字节数据接收到的是200-400段说明0-199段丢失了并重传这段数据。810TimestampsRFC7323时间戳
完整的options list请参阅Transmission Control Protocol (TCP) Parameters/tcp-parameters-1 参考文章 RFC 9293: Transmission Control Protocol (TCP) Transmission Control Protocol (TCP) Parameters TCP所有字段、标志位和参数在这里都能找到 RFC 3168: The Addition of Explicit Congestion Notification (ECN) to IP draft-ietf-tcpm-accurate-ecn-28 - More Accurate Explicit Congestion Notification (ECN) Feedback in TCP Accurate ECN draft-kuehlewind-tcpm-accurate-ecn-05 - More Accurate ECN Feedback in TCP Accurate ECN RFC 2018: TCP Selective Acknowledgment Options OptionsSACK RFC 2883: An Extension to the Selective Acknowledgement (SACK) Option for TCP OptionsSACK RFC 7323: TCP Extensions for High Performance OptinosWindow Scale、Timestamps