TCP/IP 详解卷一 - TCP CWR、ECE、URG、ACK、PSH、RST、SYN、FIN控制位
from:https://blog.csdn.net/u012243115/article/details/43487461
TCP 和 UDP 都使用相同的网络层 IP,但是与 UDP 不同的是,TCP 是面向连接的、可靠的字节流协议。因此,在传输数据之前通信双方必须建立一个 TCP 连接。TCP 通过检验和、序列号、确认应答、重发机制、连接管理以及窗口控制等机制实现可靠性传输。
TCP通过以下方式提供可靠性:
1. 应用数据被分割成 TCP 认为最合适发送的数据块,即进行TCP 分段。这点与 UDP 完全不同,应用程序产生的UDP 数据报长度将保持不变,在 IP 层将 UDP 数据报加上IP 首部后,必要时对其进行 IP 分片。
2. 当 TCP 发出一个报文段后,它会启动一个定时器,等待目的端确认收到这个报文段,如果没能及时收到该确认信息,则将重发这个报文段。即超时重传。
3. 当 TCP 接收端收到连接另一端的 TCP 报文段时,它将发送一个确认,这个确认不是立即发送的,通常会推迟几分之一秒。即确认应答(ACK)。
4. TCP 将保持它首部和数据的校验和。这是一个端到端的校验和,目的是检查数据在传输过程中的任何变化。如果收到的报文段的校验和有差错,TCP 将丢弃该报文段,同时不发送确认收到的消息,从而使发送端超时重发。
5. 由于 TCP 报文段作为 IP 数据报来传输,IP 数据报的到达可能会失序,因此 TCP 报文段的到达也可能失序,如果必要,TCP 将对收到的数据进行重排序,将收到的数据以正确的顺序交给应用层。
6. 由于 IP 数据报有可能发生重复,TCP 的接收端必须丢弃重复的数据。
7. TCP 能提供流量控制。TCP 连接的每一方都有固定大小的缓冲空间,TCP 的接受端只允许另一端发送接收端缓冲区所能接纳的数据,这将防止较快主机致使较慢主机的缓冲区溢出。即流量控制。
TCP 首部
TCP数据被封装在一个IP数据报中,如图所示:
TCP 首部,不如不计任选字段,它通常是20个字节。如下图所示:
TCP 首部比 UDP 首部复杂很多,并且没有表示包长度和数据长度的字段,可由 IP 层获取 TCP 的包长度,并由 TCP 包长度可知数据的长度。下面对 TCP 首部的个字段进行简单介绍:
源端口号:表示发送端端口号,字段长 16 位;
目标端口号:表示接收端端口号,字段长 16 位;
每个 TCP段都包含源端和目的端的端口号,用于寻找发端和收端应用进程。这两个值加上IP首部中的源端 IP地址和目的端 IP地址唯一确定一个 TCP连接。
序列号:字段长 32 位,占4个字节,序号的范围为[0,4284967296]。由于TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,首部中的序号字段则是指本报文段所发送的数据的第一个字节的序号。另外,序号是循环使用的,当序号增加到最大值时,下一个序号就又回到了0。
确认应答:字段长 32 位,当ACK标志位为1时有效,表示期望收到的下一个报文段的第一个数据字节的序号。确认号为N,则表明到序号N-1为止的所有数据字节都已经被正确地接收到了。
首部长度(数据偏移):该字段表示 TCP 所传输的数据部分应该从 TCP 包的哪个位置开始计算,可以把它看作是 TCP 首部的长度。该字段长 4 位,单位是 4 字节(即 32 位)。不包括选项字段的话,TCP 首部长度为 20 个字节,因此,数据偏移字段可设置为 5。反之,若该字段值为 5,那么说明从 TCP 包的一开始到 20 字节为止都是 TCP 首部,余下的部分为 TCP 数据;
保留:该字段主要是为了以后扩展时使用,其长度为 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 的检验和与 UDP 检验和一样,也是采用伪首部,但是 TCP 的检验和无法关闭。TCP 伪首部的信息和 UDP 一样,包括:源 IP 地址、目的 IP 地址、填充、协议号以及 TCP 包长度;
紧急指针:该字段为 16 位。只有在 URG 控制位为 1 时有效。该字段的数值表示本报文段中紧急数据的指针。从数据部分的首位到紧急指针所在的位置为止是紧急数据。因此,紧急指针是指出了紧急数据的末尾在报文段中的位置;
通过序列号与确认应答提高可靠性
在TCP中,当发送端的数据到达接收主机时,接收端主机会返回一个已收到消息的通知。这个消息叫做确认应答(ACK)。
TCP通过肯定的确认应答(ACK)实现可靠的数据传输。当发送端将数据发出之后会等待对端的确认应答。如果有确认应答,说明数据已经成功大道对端。反之,则数据丢失的可能性很大。
未收到确认应答并不意味着数据一定丢失。也有可能是数据对方已经收到,只是返回的确认应答在途中丢失。这种情况也会导致发送端因没有收到确认应答,而认为数据没有达到目的地,从而进行重发。
此外,也有可能因为一些其他原因导致确认应答延迟到达,在源主机重发数据以后才到达的情况也屡见不鲜。此时,源发送主机只要按照机制重发数据即可。但是目标主机这时会反复收到相同的数据。而为了对上层应用提供可靠的传输,必须的放弃重复的数据包。为此,就必须引入一种机制,它能够识别是否已经接收到数据,又能判断是否需要接收。
上述这些确认应答处理、重发机制以及重发控制等功能都可以通过序列号实现。序列号是按顺序给发送数据的每一个字节(8位字节)都标上号码的编号。接收端查询接收数据TCP首部中的序列号和数据长度,将自己下一步应该接收的序列号作为确认应答返送回去。就这样通过序列号和确认应答号,TCP可以实现可靠传输。
重发超时如何确定
重发超时是指在重发数据之前,等待确认应答到来的那个特定时间间隔。如果超过了这个时间仍未收到确认应答,发送端将进行数据重发。重发超时一般都是0.5秒的整数倍,由于最初的数据包还不知道往返时间,所以其重发超时一般设置为6秒左右。数据被重发之后若还是收不到确认应答,则进行再次发送。此时,等待确认应答的时间将会以2倍、4倍的指数函数延长。此外,数据也不会被无限、反复地重发。达到一定重发次数以后,如果仍没有任何确认应答返回,就会判断为网络或对端主机发生了异常,强制关闭连接。并且通知应用通信异常强行终止。
连接管理
TCP提供面向有连接的通信传输。面向有连接是指在数据通信开始之前先做好通信两端之间的准备工作。
UDP是一种面向无连接的通信协议,因此不检查对端是否可以通信,直接将UDP包发送出去。TCP与此相反,它会在数据通信之前,通过TCP首部发送一个SYN包作为建立连接的请求等待确认应答。如果对端发来确认应答,则认为可以进行数据通信。如果对端的确认应答未能到达,就不会进行数据通信。此外,在通信结束时会进行断开连接的处理。
可以使用TCP首部用于控制的字段来管理TCP连接。一个连接的建立与断开,正常过程至少需要来回发送7个包才能完成。
窗口控制
TCP 传输数据是以 1 个段为单位,每发送一个段进行一次确认应答的处理,这样使通信时包的往返时间很长导致降低通信性能。为了解决这个问题,TCP 引入了窗口控制,确认应答不再是以每个分段,而是以更大的单位进行确认,这样缩短转发时间,也就是说,发送端主机在发送了一个段之后不必要一直等待确认应答,而是继续发送数据段。窗口大小是指无需等待确认应答而可以发送数据的最大值。
采用窗口控制机制必须实现缓冲区,在图 4 中,窗口内的数据即便是没有收到确认应答也可以发送出去。此外从该窗口中能看到的数据是因其某种数据已在传输中丢失,所以发送端才能接收到确认应答,这种情况下需要进行重发。为此,发送端主机在等到确认应答返回之前,必须在缓冲区中保留这部分的数据。在滑动窗口以外的部分包括尚未发送的数据和已经确认对端已经收到的数据。当数据发出后若如期收到确认应答就可以不用进行重发,此时数据可以从缓冲区中删除。收到确认应答后,将窗口滑到确认应答中的序列号的位置,这样可以顺序地将多个段同时发送提供通信性能。这种机制也称为滑动窗口机制。
流量控制
流量控制可以让发送端根据接收端的实际接受能力控制发送的数据量。它的具体操作是,接收端主机向发送端主机通知自己可以接收数据的大小,于是发送端会发送不会超过该大小的数据,该限制大小即为窗口大小,即窗口大小由接收端主机决定。TCP 首部中,专门有一个字段来通知窗口大小,接收主机将自己可以接收的缓冲区大小放在该字段中通知发送端。当接收端的缓冲区面临数据溢出时,窗口大小的值也是随之改变,设置为一个更小的值通知发送端,从而控制数据的发送量,这样达到流量的控制。
拥塞控制
一般来说,计算机网络都处在一个共享的环境。因此,有可能因为其他主机之间的通信使得网络拥堵。在网络出现拥堵时,如果突然发送一个较大量的数据,极有可能会导致整个网络瘫痪。TCP为了防止网络拥塞,TCP 采用了一种慢启动算法,对发送数据量进行控制。为了调节发送端的数据发送量,引入了拥塞窗口,在慢启动时,将这个拥塞窗口设为 1 个数据段发送数据,之后每收到一次确认应答,拥塞窗口的值就加 1。在发送数据包时,将拥塞窗口的大小与接收端主机通知的窗口大小进行比较,然后选择较小的值来控制数据量的发送。