一、将数据截断为合理的长度
应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的数据报长度将保持不变。
UDP:Internet 的传输层有两个主要协议,互为补充。无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的事情。面向连接的是 TCP,该协议几乎做了所有的事情。
二、超时重传机制
通常我们在进行TCP传输时,由于确认应答与序列号机制,也就是说发送方发送一部分数据后,都会等待接收方发送的ACK报文,并解析ACK报文,判断数据是否传输成功。
然而有时会由于发送过程中的网络故障而丢包,或者返回ACK报文时的网络故障而丢包。这将导致客户端无法收到ACK报文。
因此TCP协议引入了超时重传机制,当TCP发出一个段后,它启动一个定时器开始计时,等待目的端确认收到这个报文段。如果不能及时收到目的端发出的确认,将重发这个报文段。
三、流量控制
TCP可以通过可变大小的滑动窗口机制提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这将防止较快主机致使较慢主机的缓冲区溢出。
滑动窗口机制
滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗口大小一般不同。发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧。
这里我举个例子简单了解,我们都知道TCP是通过ACK号确认对方是否收到了数据,在得到对方确认之前,发送过的包都会保存在发送缓冲区中,如果对方没有返回某些包对应的ACK号,那么就重新发送这些包。每发送一个包就等待一个ACK号的方式尽管简单,但等待时间就会浪费掉。
所以TCP引入了滑动窗口机制,所谓滑动窗口,就是在发送一个包之后,不等待ACK号返回,而是直接发送后续的一系列包。这样一来,等待ACK号的这段时间就被有效利用起来了。
四、校验和
TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到端的检验和有差错,TCP将丢弃这个报文并不确认收到此报文段。
检验和主要依靠确认应答和序列号
确认应答:TCP传输的过程中,每次接收方收到数据后,都会对传输方进行确认应答。也就是发送ACK报文。
序列号:TCP传输时将每个字节的数据都进行了编号,这就是序列号。 这个ACK报文当中带有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次的数据从哪里发。
五、拥塞控制
如果网络出现拥塞,数据包将会丢失,此时如果发送方继续重传,会导致网络拥塞程度更高。所以当出现拥塞时,TCP协议会控制发送方的速率。
TCP 主要通过四种主要方法来进行拥塞控制:滑动窗口机制、慢启动机制、拥塞避免机制、快速重传与恢复。
滑动窗口前面已经谈过,我们来看看剩下三种方法
慢启动机制
新建TCP连接的时候,拥塞窗口(拥塞窗口的大小取决于网络速度的拥塞程度和处理数据量)以一个数据包大小(假设为1000Byte)为基数,每接受一个ACK确认就会增加一个数据包发送量。这样有效减缓了TCP连接的启动速度,防止网络出现拥塞。如下图所示:
拥塞避免机制
拥塞避免机制就是让拥塞窗口缓慢增大,每经过一个往返时间RTT,发送方的拥塞窗口(CWnd,congestion window)就加一个,此时CWnd呈线性增大。
快速重传与恢复
这就不用解释了很好理解,如果接收方收到了一个失序的报文,它会马上发送报告给发送方,告知它未收到报文。如果发送方收到重复的三个确认,则会立即重传接收方需要的下一个报文。如图所示:
六、对失序数据进行重新排序并丢弃重复数据
TCP报文段作为IP数据报来传输,
而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
有时IP数据报也会发生重复,因此TCP的接收端会进行检查并丢弃重复数据后再交给应用层。