TCP和UDP的区别
1. 有连接和无连接
二、UDP一对一, 一对多和一对全 ,TCP一对一
三、UDP面向报文,TCP面向字节流
四、可靠性
五、报文头信息
小结
滑动窗口
1. 发送方:
一个报文的状态:
已经发送,并且收到确认报文(已结束)(窗口外)
已经发送,但还未收到确认报文(等待ACK) (窗口内)
可以发送,但尚未发送(已就绪,等待发送)(窗口内)
不可以发送(受窗口限制,不允许发送) (窗口外)
如果出现丢包,那么就会重复对丢包报文前的那个报文进行确认,例如在上图中,如果发送了31,32,33,34,45,其中32丢包,31,33,34,35按序号到达,那么当33到的时候,34到的时候,35到的时候,都是发的对31的确认报文,相当于多发了3次对31的确认报文(当对同一个报文重复确认3次的时候,则会触发快重传)。因此,在上图中,31~41一定都是未收到确认的,当31确认收到了以后,那么窗口就会向右滑动,直到最左方的首个元素是“发送了但尚未收到确认报文的” 或者“尚未发送的”。 继续上面这个例子,当31,33,34,35到达,接收方发送了3个对31号报文的ACK,就会触发“快重传”,重新传送32。
2. 接收方
接收方窗口左边为已经发送过的确认报文,右边为当前不能接收的报文。
接收方窗口:
- 最左边报文一定是尚未收到的报文
- 如果31没到,32,33先到,就先把32,33缓存在接收缓冲区中,并且会发送2个对30的确认报文,当收到了31的确认报文,那么窗口就继续滑动到34的位置.
拥塞控制
在理想情况下,随着请求数的增长,网络的吞吐量也会增长,当用户的请求出超出了网络所能承载的负荷时,吞吐量将保持不变。。
而实际情况是,当用户对网络资源的请求数量超过了网路所能抗住的负荷时,吞吐量会随着请求的增多而减少,直到变为0。
而拥塞控制就是为了防止这一情况的产生,其实现的方式就是,通过调整发送窗口的大小,来控制发送速率,从而起到减少网络流量的作用。
发送方需要维护3个变量( 发送窗口(cwnd), 拥塞窗口(swnd), 窗口阈值(ssthresh)):
实际上,发送方发送窗口大小 = min(拥塞窗口大小(拥塞控制), 接收方接收窗口大小(流量控制))
拥塞控制包括了4个算法策略分别是:慢开始,拥塞避免,快重传,快恢复。
慢开始:
cwnd = 1, 每发送一轮窗口大小的数据并成功接收到确认报文,就给窗口大小乘2,
当窗口大小超过ssthresh时,使用拥塞避免算法。
拥塞避免:
每发送一轮窗口大小的数据并成功接收到确认报文,就给窗口大小加1,一旦出现超时重传,则判定网络可能出现了拥堵,将cwnd置为1,ssthresh变为原来的一半
快重传:
快重传就是:并不是等超时了才再重传,而是连续收到3个重复的ACK报文时,就开始重传!
快恢复
快恢复就是:出现了需要重传的情况,并不是把cwnd置为1,而是置成原来大小的一半,(ssthresh也置为原来的一半)。
流量控制
流量控制就是,让接收方的发送速率能够匹配上接收方的接收速率,具体实现体现在:控制发送方的发送窗口大小(如果发送的太快了,就把窗口调小点,如果发的太慢了,就把窗口调大点),发送方窗口的大小根据接收方窗口的大小来决定。
实际上,发送方发送窗口大小 = min(拥塞窗口大小(拥塞控制), 接收方接收窗口大小(流量控制))
该视频的例子讲的非常棒。
发送方在接收到接收方的确认报文段后,会根据报文中的接收方窗口大小值,来重新调整当前的发送窗口大小。(初始大小在TCP三次握手的时候确定)
发送方窗口可以被设成零。 当发送方窗口大小为0时,会定时发送零窗口探测报文,询问接收方的窗口大小,如果还是0,那么就重置这个定时器,如果不是0就重新调整窗口大小。
TCP规定,接收方接收窗口即使为0,也应接收零窗口探测报文,确认报文段,以及携带紧急数据的报文段。
TCP报文头
TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接
序号 (Seq) 和确认号 (ACK) :
- 序号是本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。例如:一个报文段的序号为300(Seq=300),此报文段数据部分共有100字节,则下一个报文段的序号为400。所以序号确保了TCP传输的有序性。
- 确认号,即ACK,指下一个期待收到的字节序号, 表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0。
数据偏移/首部长度:4bits。
- 由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何任选字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值。
保留:
- 为将来定义新的用途保留,现在一般置0
控制位:URG ACK PSH RST SYN FIN,共6个,每一个标志位表示一个控制功能。
URG:紧急指针标志,为1时表示紧急指针有效,为0则忽略紧急指针。
ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。
PSH:push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。
RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。
SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。
FIN:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。