TFTP使用了停止等待协议。数据发送方在发送下一块数据块之前必须要接受对已发送数据的确认。
TCP使用的流量控制方法是滑动窗口协议。该协议允许发送方在停止能带确认前可以连续发送多个分组,不必每发送一个分组就停下来确认。该协议加速了数据的传输。使用TCP的滑动窗口协议时,接收方不必确认每一个收到的分组。
滑动窗口

窗口大小和确认序号是相对应的。发送方计算它的可用窗口,该窗口表明有多少数据可立即被发送。
当接收方确认数据后,这个滑动窗口不时地向右移动。窗口两个边沿的相对运动增加或减少了窗口的大小。
当数据被发送且被确认时,窗口左边向右边沿靠近为窗口合拢。
当另一端的接收进程读取已确认的数据并释放TCP的接收缓存时,窗口右沿向右移动允许发送更多的数据,这称为窗口张开。
当右边沿向左移动时,称为窗口收缩。
如果接收到一个指示窗口左边沿向左移动到ACK,则它被认为是一个重复的ACK,并被丢弃。
如果左边沿到达右边沿,则被称为一个零窗口,此时发送方不能发送任何数据。

发送方不必发送一个全窗口大小的数据(有MSS限制)
来自接收方的一个报文段确认数据并把窗口向右移动,这是因为窗口的大小是相对于确认序号的。
窗口的大小可以减小,但是窗口的右边沿不能向左移动。
接收方在发送一个ACK前不必等待窗口被填满。
窗口大小
窗口的大小通常由接收进程控制。API允许进程设置发送和接收缓存的大小,接收缓存的小大是该连接上所能通告的最大窗口大小
PUSH标志
发送方使用PUSH标志通知接收方将所收到的数据全部提交给接收进程。这里的数据包括与PUSH一起传送的数据以及接收方TCP已经收到的其他数据。当TCP接收到一个设置了PUSH标志的报文段时,它需要立即将这些数据递交给服务器进程而不能等待判断是否还有额外的数据到达。
慢启动
在一些情况下,发送方一开始就向网络发送多个报文段,直至达到接收方通告的窗口大小为止。当接收方和发送方处在同一个局域网时,这种方式是可以的。但是如果发送方和接收方之间存在多个路由器和速率较慢的链路时,一些中间路由器就必须缓存分组,并可能就会耗尽存储器的空间。
慢启动的算法,通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而工作。
慢启动为TCP增加了一个窗口:拥塞窗口(cwnd)。拥塞窗口被初始化为1个报文段(即另一端通告的报文段发小MSS)。每收到一个ACK,拥塞窗口就增加一个报文段(cwnd以字节为单位,慢启动以报文段大小为单位)发送端则取拥塞窗口和通告的滑动窗口的最小值为发送上限。
拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。当在某些点上可能达到了互联网的容量,于是中间路由器开始丢弃分组,这时就通知发送方它的拥塞窗口开的太大了。
拥塞
当数据到达一个快速局域网(大的管道)并向一个较慢的局域网(小的管道)发送时,就会产生拥塞。当多个输入流到达一个路由器,而路由器的输出流小于这些输入流时也会产生拥塞,会引起路由器丢弃分组。
紧急方式
可以通过设置TCP中URG比特位为1,并16bit的紧急指针设置为一个正的偏移量,该偏移量与TCP首部中的序号字段相加,以便得出紧急数据的最后一个字节的序号。