TCP协议的介绍和拥塞控制的基本原理,以及TCP协议的拥塞算法。
面向连接的传输协议
TCP概述
1.TCP的特点:
(1)点对点:只能有一个发送方,一个接受方。
(2)可靠的、按序的字节流。
(3)流水线机制:TCP拥塞控制和流量控制机制设置窗口尺寸。
(4)发送方和接受方拥有缓存。
(5)全双工。
(6)面向连接
- 通信双方在发送数据之前必须建立连接。
- 连接状态只在连接的两端中维护,在沿途节点中并不维护状态。
- TCP连接包括:两台主机的缓存、连接状态变量、socket等。
(7)拥有链路控制机制
2.TCP段结构
3.序列号和ACK
(1)序列号
- 序列号指的是segment中第一个字节的编号,而不是segment的编号。
- 建立TCP连接时,双方随机选择序列号。
(2)ACKs
- 希望接受到的下一个字节的序列号。
- 累计确认:该序列号之间的所有字节均已被正确接收到。
TCP可靠数据传输
1.TCP的可靠数据传输概述
(1)TCP在IP层提供的不可靠服务基层上实现可靠数据传输服务。
(2)使用流水线机制
(3)使用积累确认机制
(4)使用单一重传定时器
2.TCP发送方事件
(1)从应用层收到数据
- 创建segment
- 序列号是segment第一个字节的编号
- 开启计时器
- 设置超时时间
(2)超时
- 重传引起超时的segment
- 重启定时器
(3)收到ACK
如果确定此前未确定的segment则更新sendbase,如果窗口中还有未被确认的分组。则重新启动定时器。
3.快速重传机制
(1)通过重复ACK检测分组丢失。
(2)如果sender收到对同一数据的3个ACK,则假定该数据之后的段已经丢失,则在定时器超时之前即进行重传。
TCP流量控制
检测buffer的剩余空间,通过回传消息告知发送方控制流量大小。
TCP连接管理
对于这一部分,我认为CSDN有一篇文章写得比较清晰,“TCP连接管理”这一段则是对CSDN上文章的转载。
-
TCP连接的建立与终止
一个TCP连接是由一个四元组构成,分别是两个IP地址和两个端口号。
一个TCP的连接分为3个阶段:启动,数据传输,退出。 -
TCP连接的步骤:
(1)客户端发送一个SYN报文段, SYN报文段就是TCP头部中的SYN置1的报文段,在这个报文段中指明想要连接的端口号和客户端的初始序列号,通常把这个报文段称为段1. (2)服务器端收到这个报文,发送自己的SYN报文做为响应,在这个报文中,包括服务器端的初始序列号,同时还会给客户端发送一个ACK,ACK的值为客户端的初始序列号+1,这个报文称为段2,每次发送一个SYN,序列号就会自动加1.
(3)客户端收到服务器端发来的SYN报文,将服务器的初始序列号+1,作为ACK,返回给服务器,这个报文称为段3
发送的这三个报文,就能完成一个TCP的连接建立,称为三次握手。 -
TCP关闭步骤:
连接的任何一方,都可以发起关闭操作,同时还支持双方同时关闭连接的操作。
(1)连接的主动关闭者,发送一个FIN报文(TCP头部中的FIN置1的报文),希望接收者看到自己当前的序列号,还有一个ACK(确定对方最近一次发来的数据)
(2)连接的被动关闭者将收到的连接主动发起者发来的当前序列号+1,作为ACK的值,返回给连接主动者。
(3)被动关闭者转变为主动关闭者,发送自己的FIN报文,包括自己的报文序列号。
(4)连接的主动关闭者收到连接的被动关闭者发送来的FIN报文,发送一个ACK,对收到这个报文的响应。关闭一个TCP连接,需要四个报文,称为TCP的四次握手。 -
TCP半关闭:
由于TCP的双工通信特性,TCP支持半关闭。TCP的半关闭操作是指仅关闭数据流的一个传输方向,而另一方仍在传输数据直到它被关闭为止。 -
同时打开与关闭:
假设主机A的应用程序通过本地7777端口向主机B的8888端口发送一个主动打开请求,同时,主机B的应用程序也通过本地8888端口向主机A的7777端口发送一个主动打开请求。 一个同时打开过程需要交换四个报文段,比普通的三次握手增加了一次,由于通信双方都是客户端和服务器的角色。
同时关闭与普通的并没有太大的区别,因为通信的一方,都可以主动的提出关闭请求,并发送首个FIN,两者最大的区别在于,同时关闭是交叉,而普通的关闭是顺时的。 -
初始序列号:
(1)在发送用于建立连接的SYN之前,通信双方会选择一个初始序列号。初始序列号会随时间而改变,因此每个连接都拥有不同的初始序列号。初始序列号可被视为一个32位的计数器,计数器的值每4微秒加1,以防止出现于其他连接的序列号重叠的情况。 -
连接建立超时
在连接建立超时的时候,连接的打开方会产生指数回退行为:客户端TCP为了建立连接而频繁发送SYN报文段,首个报文段发送后3s发送第二个,第二个报文段之后6s发送第三个,第三个报文段12s后发送第四个…
————————————————
版权声明:本文为CSDN博主「纯粹.」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_39346534/article/details/105644307
拥塞控制原理
-
拥塞
(1)非正式定义:“太多发送主机发送了太多数据或者发送速度太快,以至于网络无法处理。”
(2)表现:分组丢失、分组延迟过大。
-
拥塞的成因和代价
(1)成因1:线路带宽有限。
(2)代价1:拥塞时分组延迟大。
(3)成因2:路由缓存有限。
(4)代价2:需要大量的数据重传,造成网络资源浪费。
-
拥塞控制的方法
(1)端到端的拥塞控制:
- 网络层不需要显示地提供支持
- 端系统通过观察loss,delay等网络行为判断是否发送拥塞
- TCP采取这种方法
(2)网络辅助的拥塞控制:
- 路由器向发送方显示地反馈网络拥塞消息
- 简单的拥塞提示(1bit):SNA,DECbit,TCP/IP ECN,ATM
- 提示发送方应采取何种速率
-
ATM ABR拥塞控制
(1)ABR:available bit rate
- “弹性服务”
- 如果发送路径负载较低,则尽可能的使用带宽
- 如果发送路径拥塞,则发送方降到最低保障速率
(2)RM cells:
- 发送方发送
- 在交换机位置改变RM cell位(网络辅助),再由返回方把RM cell返回给发送方
TCP拥塞控制(TCP拥塞控制算法)
慢启动
1.当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么就有可能引起网络拥塞,因为现在并不清楚网络的负荷情况。因此,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口数值。通常在刚刚开始发送报文段时,先把拥塞窗口 cwnd 设置为1。而在每收到一个对新的报文段的确认后,把拥塞窗口增加至原来的2倍。用这样的方法逐步增大发送方的拥塞窗口 cwnd ,可以使分组注入到网络的速率更加合理。
2.当TCP连接时,cwnd的值通常初始置为一个MSS(最大报文段大小)的较小值,初始发送速率大约为MSS/RTT。
3.在慢启动状态,cwnd的值以一个MSS开始,cwnd每当传输的报文被确定就增加1个MSS。
4.如图,这个过程每过一个RTT,发送速率就翻番。因此,TCP发送数量初始慢,但在慢启动阶段以指数增长。
5.慢启动结束的三种方法:
(1)如果存在一个由超时指示的丢包事件(拥塞),TCP发送方将cwnd设置为1并重新楷书慢启动过程。它将下一个状态的变量的值ssthresh(慢启动阈值)设置为cwnd/2,即当检测到拥塞时将ssthresh设为拥塞窗口的一半。
(2)当检测到拥塞时ssthresh设为cwnd的值得一半,当cwnd等于ssthresh时,进入拥塞避免模式。
(3)如果检测到3个冗余的ACK,这时TCP执行一种快速重传。
拥塞避免
1.一旦进入拥塞避免状态,则采用一种较为保守的方法,每个RTT只将cwnd的值增加一个MSS。
例如,如果MSS是1460字节并且cwnd是14600字节,则在一个RTT内发送10个报文段。每个到达ACK(假设每个报文段是一个ACK)增加1/10个MSS的拥塞窗口长度,以此在收到所有10个报文段的确认后,拥塞窗口的值增加一个MSS。
2.当出现超时时,cwnd的值被设置为1个MSS;当丢包事件出现时,ssthresh的值被更新为cwnd的一半。
3.AIMD(加法增大乘法减小):
(1)乘法减小:无论在慢启动阶段还是在拥塞控制阶段,只要网络出现超时,就是将cwnd置为1,sthresh置为cwnd的一半,然后开始执行慢启动算法
(2)加法增大:当网络频发出现超时情况时,ssthresh就下降的很快,为了减少注入到网络当中的分组数,而加法增大是执行拥塞避免算法后,是拥塞窗口缓慢的增大,以防止网络过早出现拥塞。
快重传和快速恢复状态
1.快重传:
(1)在上图中,接收方成功的接受了发送方发来的M1,M2并且分别发送了ACK,现在接收方没有收到M3,而收到了M4,显然接收方不能确认M4,因为M4是失序的报文段。如果根据可靠性传输原理接收方什么都不做,但是按照快速重传算法,在收到M4,M5等报文段的时候,不断重复的向发送方发送M2的ACK,如果接收方一连收到三个重复的ACK,那么发送方不必等待重传计时器到期,由于发送方尽早重传未被确认的报文段。
(2)对于引起TCP进入快速恢复状态的缺失报文段,对收到的ACK,cwnd的值增加一个MSS。当对丢失的报文的一个ACK到达时,TCP在降低cwnd后进入快速恢复状态。
3.快恢复:
(1)当发送方连续收到三个重复确认,执行乘法减小,ssthresh减半。
(2)由于发送方可能认为网络现在没有拥塞,因此与慢开始不同,把cwnd值设置为ssthresh减半之后的值,然后执行拥塞避免算法,线性增大cwnd。
恢复状态的缺失报文段,对收到的ACK,cwnd的值增加一个MSS。当对丢失的报文的一个ACK到达时,TCP在降低cwnd后进入快速恢复状态。
3.快恢复:
(1)当发送方连续收到三个重复确认,执行乘法减小,ssthresh减半。
(2)由于发送方可能认为网络现在没有拥塞,因此与慢开始不同,把cwnd值设置为ssthresh减半之后的值,然后执行拥塞避免算法,线性增大cwnd。