TCP 和 UDP 都使用相同的网络层 IP,可是与 UDP 不一样的是,TCP 是面向链接的、可靠的字节流协议。所以,在传输数据以前通讯双方必须创建一个 TCP 链接。TCP 经过检验和、序列号、确认应答、重发机制、链接管理以及窗口控制等机制实现可靠性传输。html
TCP经过如下方式提供可靠性:算法
1. 应用数据被分割成 TCP 认为最合适发送的数据块,即进行TCP 分段。这点与 UDP 彻底不一样,应用程序产生的UDP 数据报长度将保持不变,在 IP 层将 UDP 数据报加上IP 首部后,必要时对其进行 IP 分片。缓存
2. 当 TCP 发出一个报文段后,它会启动一个定时器,等待目的端确认收到这个报文段,若是没能及时收到该确认信息,则将重发这个报文段。即超时重传。网络
3. 当 TCP 接收端收到链接另外一端的 TCP 报文段时,它将发送一个确认,这个确认不是当即发送的,一般会推迟几分之一秒。即确认应答(ACK)。函数
4. TCP 将保持它首部和数据的校验和。这是一个端到端的校验和,目的是检查数据在传输过程当中的任何变化。若是收到的报文段的校验和有差错,TCP 将丢弃该报文段,同时不发送确认收到的消息,从而使发送端超时重发。post
5. 因为 TCP 报文段做为 IP 数据报来传输,IP 数据报的到达可能会失序,所以 TCP 报文段的到达也可能失序,若是必要,TCP 将对收到的数据进行重排序,将收到的数据以正确的顺序交给应用层。 性能
6. 因为 IP 数据报有可能发生重复,TCP 的接收端必须丢弃重复的数据。flex
7. TCP 能提供流量控制。TCP 链接的每一方都有固定大小的缓冲空间,TCP 的接受端只容许另外一端发送接收端缓冲区所能接纳的数据,这将防止较快主机导致较慢主机的缓冲区溢出。即流量控制。spa
TCP数据被封装在一个IP数据报中,如图所示:.net
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。在发送数据包时,将拥塞窗口的大小与接收端主机通知的窗口大小进行比较,而后选择较小的值来控制数据量的发送。