第12章 TCP概述;TCP报文头部
TCP原始规范RFC0793
第12章是一个概述性章节,讲述了TCP的基础概念以及需要解决的问题,后面的章节都会对本章节进行更详细的介绍
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
IP传输的问题:乱序、丢包、分组复制;错包问题 ========================================================================= ARQ和重传 TCP作为可靠的传输层协议 1.需要解决IP传输时会遇到的问题:乱序、丢包、分组复制(重复数据); 乱序--- 丢包---重传 分组复制(重复数据)---根据序列号进行判断,若为已接收的序列号,则丢弃数据包 2.解决错包的问题----使用编码技术检测错包,当确认为错包时,不回复ack 解决的方式采用ARQ自动重复请求(即重传)
TCP报文头部
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
TCP报头说明:序列号、控制位(SYN/ACK/PSH/FIN)、窗口大小、等等 ------------------------------------------------------------------------------------------ 一个IP+一个端口 = 端点or套接字socket 每个TCP连接由一对套接字组成,即4元组:源目IP+源目port 源端口号:表示发送端端口号,字段长 16 位; 目标端口号:表示接收端端口号,字段长 16 位; 序列号:代表的是一个分组中的第一个字节在整个数据十六中的字节偏移,而不是分组号。 换一种说法,TCP连接中每个交换的字节都有相应的编号 所以分组在传送中是可变大小的,应用程序数据被打散成TCP认为的最佳大小的块来发送。 序列号:字段长 32 位,占4个字节,序号的范围为[0,4284967296]。由于TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,首部中的序号字段则是指本报文段所发送的数据的第一个字节的序号。 另外,序号是循环使用的,当序号增加到最大值时,下一个序号就又回到了0。 #注意:TCP SYN、FIN会消耗1个序列号;ACK是不消耗序列号的; 所以SYN/FIN是可靠传输的,是需要进行确认的,丢失是会重传的;而ACK是不需要进行确认,而4次挥手阶段,处于TIME_WAIT阶段的设备回复的ack是需要被确认的,这时采用了2MSL时间的等待机制 确认号:字段长 32 位,当ACK标志位为1时有效,表示期望收到的下一个报文段的第一个数据字节的序号。确认号为N,则表明到序号N-1为止的所有数据字节都已经被正确地接收到了。 头部长度(数据偏移):该字段表示 TCP 所传输的数据部分应该从 TCP 包的哪个位置开始计算,可以把它看作是 TCP 首部的长度。该字段长 4 位,单位是 4 字节(即 32 位)。 不包括选项字段的话,TCP 首部长度为 20 个字节,因此,数据偏移字段可设置为 5。反之,若该字段值为 5,那么说明从 TCP 包的一开始到 20 字节为止都是 TCP 首部,余下的部分为 TCP 数据; TCP报头有4bit位置标识tcp报头大小,取值范围5-15(每+1,意味着tcp报头增加4字节),所以tcp报头大小范围在20-60字节 若tcp option为空,则tcp报头为20字节 保留:该字段主要是为了以后扩展时使用,其长度为 4 位,一般设置为 0,但即使收到的包在该字段不为 0,此包也不会被丢弃; 控制位:字段长为 8 位,每一位从左到右分别为 CWR、ECE、URG、ACK、PSH、RST、SYN、FIN。这些控制标志也叫做控制位。当他们的对应位上值为 1 时,具体含义如下: CWR:CWR 标志与后面的 ECE 标志都用于 IP 首部的 ECN 字段,ECE 标志为 1 时,则通知对方已将拥塞窗口缩小;(发送方降低它的发送速率) ECE:若其值为 1 则会通知对方,从对方到这边的网络有阻塞。在收到数据包的 IP 首部中 ECN 为 1 时将 TCP 首部中的 ECE 设为 1.;(发送方接收到了一个更早的拥塞通告) URG:该位设为 1,表示包中有需要紧急处理的数据,对于需要紧急处理的数据,与后面的紧急指针有关; ACK:该位设为 1,确认应答的字段有效,TCP规定除了最初建立连接时的 SYN 包之外该位必须设为 1; PSH:该位设为 1,表示需要将收到的数据立刻传给上层应用协议,若设为 0,则先将数据进行缓存; RST:该位设为 1,表示 TCP 连接出现异常必须强制断开连接; SYN:用于建立连接,该位设为 1,表示希望建立连接,并在其序列号的字段进行序列号初值设定; FIN:该位设为 1,表示今后不再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换 FIN 位置为 1 的 TCP 段。每个主机又对对方的 FIN 包进行确认应答之后可以断开连接。 不过,主机收到 FIN 设置为 1 的 TCP 段之后不必马上回复一个 FIN 包,而是可以等到缓冲区中的所有数据都因为已成功发送而被自动删除之后再发 FIN 包; 窗口大小:该字段长 16 位,用于通知从相同 TCP 首部的确认应答号所指位置开始能够接收的数据大小(8 位字节)。TCP 不允许发送超过该窗口大小的数据。若窗口为 0,则表示可以发送窗口探测,以了解最新的窗口大小,但这个数据必须是 1 个字节; 即接收方的该TCP连接缓存空间大小,是接收方对发送方进行限流的方式 共16位,限制了窗口大小65535字节,即最多可以接收64KB数据;若实际空间更大,可以使用tcp option的WSopt进行窗口扩大 检验和:TCP 的检验和与 UDP 检验和一样,也是采用伪首部,但是 TCP 的检验和无法关闭。TCP 伪首部的信息和 UDP 一样,包括:源 IP 地址、目的 IP 地址、填充、协议号以及 TCP 包长度; 紧急指针:该字段为 16 位。只有在 URG 控制位为 1 时有效。该字段的数值表示本报文段中紧急数据的指针。从数据部分的首位到紧急指针所在的位置为止是紧急数据。因此,紧急指针是指出了紧急数据的末尾在报文段中的位置;