一、UDP的主要特点
1、UDP是无连接的,减少了开销和发送数据之前的时延
2、UDP使用尽最大努力交付,但是不保证可靠交付
3、UDP是面向报文的。从应用层到运输层再到IP层都只是添加一个相应的首部即可
4、UDP没有拥塞机制,源主机以恒定的速率发送数据,允许在网络发生拥塞时丢失一些数据,但是不允许数据有太大的延迟
5、UDP支持一对一、一对多、多对一和多对多的交互通信。
6、UDP的首部开销小,只有八个字节。
二、UDP的首部格式
主机中的多个应用进程把用户数据通过各自的端口传输到了运输层后,就共用同一个网络层协议,把收到的UDP用户数据报组装成不同的IP数据报发送到互联网,这就是UDP的复用功能。
主机的网络层收到多个IP数据报后,提取出数据部分(UDP用户数据报),然后根据其首部中的目的端口号,分别传送到相应的端口,以便上层的应用进程到端口读取数据,这就是UDP的分用功能。
UDP有两个字段:数据字段和首部字段。首部字段很简单,只有八个字节,由四个字段组成,每个字段的长度都为2字节。
(1)源端口
在需要对方回信时选用,不需要时可以全部设置为0
(2)目的端口
在终点交付报文时必须使用
(3)长度
UDP用户数据报的长度,最小值为8(仅由首部)
(4)检验和
通过在数据报之前添加12个字节的伪首部,伪首部既不向下传送也不向上递交,UDP的检验和是把首部和数据部分一起检验,检测UDP用户数据报在传输中是否有错
三、TCP协议的特点
1、TCP是面向连接的运输层协议
应用程序在使用TCP协议之前,必须先建立TCP连接,在传输数据完成之后必须释放已经建立的TCP连接。TCP连接的端点叫做嵌套字(socket)
嵌套字socket = (IP地址:端口号)
每一条TCP连接唯一地址被通信两端的两个端点所确定
TCP连接::={socket1,socket2} = {(IP1:port1),(IP2,port2)}
同一个ip地址可以有多个不同的TCP连接,而同一个端口号也可以出现在多个不同的TCP连接中。
2、每一条TCP连接是点对点的
3、TCP提供可靠交付的服务
通过TCP连接传送的数据,无差错、不丢失、不重复并且按序到达。
(1)停止等待协议
(i)无差错情况
(ii)出现差错
A只要超过一段时间仍然没有收到确认就认为刚才发送的分组丢失了,因而重传前面发送的分组,叫做超时重传。
因此,A在发送完一个分组后,必须暂时保留已经发送的分组的副本(在发送超时时使用),而且分组和确认分组必须进行编号,超时计时器设置的重传时间应当比数据在分组传输的平均往返时间更长一些。
(iii)确认丢失和确认迟到
(2)连续ARQ协议
连续ARQ协议规定,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。
接收方采取累计确认的方式,也就是说接收方不必对收到的分组逐个发送确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认。
4、TCP提供全双工通信
TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存。
5、面向字节流
TCP中的"流"指的是流入到进程或者从进程流出的字节序列。
四、TCP报文段的首部格式
TCP报文的首部的前20个字节是固定的,后面有4n个字节是根据需要而增加的选项。因此TCP首部的最小长度是20字节。
(1)源端口和目的端口
各占用两个字节
(2)序号
占用四个字节,在TCP连接中传送的字节流中的每一个字节都按照序号编号。首部中的序号值为本报文段所发送的数据的第一个字节的序号。
(3)确认号
占四字节,是期望收到对方的下一个报文段的第一个数据字节的序号。例如,B收到了A发送过来的一个报文段,其序号字段值为501,而数据长度是200字节(序号501~700),这表明B正确收到了A发送的到序号700为止的数据。因此,B期望收到A的下一个数据序号为701,于是B在发送给A的确认报文段中把确认号置为701。
总之,若确认号为N,则表明到序号N-1位置的所有数据都已正确收到。
(4)数据偏移
占4位,实际上指出了TCP报文段的首部长度,由于首部中还有长度不确定的选项字段,因此数据偏移字段是必要的。
(5)保留
占6位,保留为今后使用
(6)6个控制位
紧急URG:当URG=1时,表明紧急指针有效。他告诉系统此报文段中有紧急数据,应该尽快传送,而不需要按照原来的排队顺序传送。
确认ACK:仅当ACK=1时确认号字段才有效。
推送PUSH:当两个应用进程进行交互式的通信时,有时一端的应用程序希望在键入一个命令后立即就能够收到对方的响应,而不需要等待整个缓存都填满了再向上交付。
复位RST:当RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接。
同步SYN:SNY置1表示这是一个连接请求或者连接接受报文
终止FIN:当FIN=1时,表明此报文段的发送方的数据已经发送完毕,并要求释放运输连接。
(7)窗口
窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(因为接收方的数据缓存空间是有限的)
总之,窗口字段明明确指出了现在允许对方发送的数据量。窗口值经常在动态地变化着。
(8)检验和
占两字节,检验和字段检验的范围包括首部和数据这两部分。
(9)紧急指针
占2字节,紧急指针只有在URG=1时才有意义,它指出本报文段中的紧急数据的字节数。
(10)选项
长度可变,最长可达40字节
TCP最初只规定了最大报文长度MSS,是每一个TCP报文段中的数据字段的最大长度。除此之外,还有窗口扩大选项,时间戳选项,选择确认(STACK)选项。
五、TCP可靠传输的实现
1、以字节为单位的滑动窗口
(1)发送窗口表示:在没有收到B的确认的情况下,A可以连续把窗口内的数据都发送出去。凡是已经发送的数据,在未收到确认之前都必须暂时保留,以便在超时重传时使用。
发送窗口的位置由窗口前沿和后沿的位置共同确定。发送窗口后沿的变化情况有两种可能,即不动(没有收到新的确认)和前移(收到了新的确认)
(2)要描述一个发送窗口的状态需要三个指针:P1,P2,P3。指针都指向字节的序号。
P1之前的数据是已发送并已收到确认的部分
P3之后的数据是不允许发送的数据
P3-P1=A的发送窗口=20
P2-P1=已发送但尚未收到确认的字节数
P3-P2=允许发送但是当前尚未发送的字节数(又称为可用窗口)
(3)除此之外,还需要注意三点
虽然A的发送窗口是根据B的接收窗口设置的,但是在同一时刻,A的发送窗口并不总是和B的接收窗口一样大。
TCP通常是把不按序到达的数据先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程。
TCP要求接收方必须有累积确认的功能,这样可以减小传输开销。
2、超时重传时间的选择
TCP采取了一种自适应算法,它记录一个报文段发出的时间,以及收到相应的确认的时间。这两个时间差就是报文段的往返时间RTT。TCP保留了RTT的一个加权平均往返时间RTTs
新的RTTs=(1-a)* (旧的RTTs)+ a * (新的RTT样本)
超市计时器设置的超时重传时间RTO应该略大于上面得出的RTTs。
RTO=RTTs + 4 * RTTd
3、选择确认SACK
若收到的报文段无差错,只是未按照序号,中间还缺少一些序号的数据,选择确认SACK可以只传送缺少的数据而不重传已经正确到达接收方的数据。
如果要使用选择确认SACK,那么在建立TCP连接时,就要在TCP首部的选项中加上"允许SACK"的选项,而必须双方都事先商量好。
六、TCP的流量控制
1、利用滑动窗口实现流量控制
所谓的流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收
设A向B发送数据,在建立连接时,B告诉A我的接受窗口rwnd=400,之后接收方的主机B进行了三次流量控制。第一次减少到rwnd=300,第二次减少到rwnd=100,最后减少到rwnd=0,之后即不允许发送方再次发送数据了,这种使发送方暂停发送的状态将持续到主机B重新发出一个新的窗口值为止。
但是同时存在一个潜在的问题,就是如果主机B重新发出的新的窗口值在传输的过程中丢失了,A一直等待收到B发送的非零窗口的通知,而B也一直等待A发送的数据,如果没有其他的措施,这种互相等待的死锁局面将一直延续下去。
为了解决这个问题,TCP为每一个连接设有一个持续计时器。只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续的计时器设置的时间到期,就发送一个零窗口探测报文段,而对方就在确认这个探测报文段时给出了现在的窗口值。如果窗口仍然为零,那么收到这个报文段的一方就重新设置持续寄存器。如果窗口不是零,那么死锁的僵局就可以被打破了。
2、TCP的传输效率
(1)TCP报文段的发送时机问题
可以采用不同的机制来控制TCP报文段的发送时机。
第一种机制就是TCP维持一个变量,它等于最大报文长度MSS。只要缓存中存放的数据达到MSS字节时,就组装成一个TCP报文发送出去,
第二种机制是由发送方的应用程序指明要求发送报文段,即TCP支持的推送操作。
第三种机制是发送方的一个计时器期限到了,这时就把当前的缓存数据装入报文段(但长度不能超过MSS)发送出去,目前广泛采用Nagle算法来控制TCP发送报文段的时机。
(2)糊涂窗口综合征(silly window syndrome)
还有一种情况就是TCP的接收方的缓存已满,而交互式的应用进程一次只从接收缓存中读取1个字节(这样就使接受空间只腾出一个字节),然后向发送方发送确认,并将窗口设置为1个字节。接着,发送方又发来一个字节的数据。接收方发回确认,仍然将窗口设置为一个字节,这种情况被称为糊涂窗口综合征(silly window syndrome)
要解决这个问题,可以让接收方等待一段时间,使得或者接受缓存有足够的空间容纳一个最长的报文段,或者等到接收缓存已有一半空闲的空间。只要这两个情况之一,接收方就发出确认报文,并向发送方通知当前的窗口大小。
七、TCP的拥塞机制
1、拥塞控制的一般原理
在某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这种情况就叫做拥塞(congestion)
拥塞控制与流量控制的关系非常密切,它们之间也存在着一些差别。所谓拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或者链路不至于过载。拥塞控制是一个全局性的过程,而流量控制往往是点对点通信量的控制,是个端对端的问题(接收端控制发送端),流量控制所要做的就是抑制发送端发送数据的速率,以便接收端来得及接收。
流量控制可以用来比喻水桶太小,来不及接收注入水桶的水,这时只好请求管水龙头的人把水龙头拧的小一点,以减缓放水的速率。
拥塞控制表示虽然水桶足够大,但是管道中有很狭窄的地方,使得管道不通畅,水流被阻塞,反馈到管水龙头的人那里请求把水龙头拧小一点减缓放水的速率目的是为了减缓水管的阻塞状态。
当网络的吞吐量明显小于理想的吞吐量,网格就进入了轻度拥塞的状态。更值得注意的是,当提供的负载达到某一数值时,网络的吞吐量反而随着提供的负载的增大而下降到零,网络已经无法正常工作,这就是所谓的死锁。
从控制理论的角度来看拥塞控制的问题,可以分为开环控制和闭环控制两种方法。开环控制就是在设计网络时事先将发生拥塞的有关因素考虑到,力求网络在工作时不发生拥塞。但是一旦整个系统运行起来,就不再中途进行改正了、
闭环控制基于反馈环路的概念,监测网络系统以便检测到拥塞在何时何处发生,把拥塞发生的信息传送到可采取行动的地方,调整网络系统的运行以解决出现的问题。
2、TCP的拥塞控制方法
TCP进行拥塞控制的算法有四种:慢开始(slow-start)、拥塞避免(congestion avoidance)、快重传(fast retransmit)和快恢复(fast recovery)。
1、慢开始算法和拥塞控制
发送方维持一个叫做拥塞窗口cwnd的状态变量。发送方控制拥塞窗口的原则是只要网络没有出现拥塞,拥塞窗口就可以更增大一些,以便把更多的分组发送出去,这样就可以提高网络的利用率。
这里发送方在超时重传计时器启动时,就判断网络出现了阻塞。
慢开始的算法是由小到大逐渐增大注入到网络中的数据字节,也就是说,由小到大逐渐增大拥塞窗口数值。
慢开始规定:在每收到一个新的报文段的确认后,可以把拥塞窗口增加最多一个SMSS的数值,也就是说:
拥塞窗口cwnd每次的增加量=min(N,SMSS),N是原先未被确认的、但现在被刚收到的确认报文段所确认的字节数。
为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量。
当cwnd<ssthresh时,使用上述的慢开始算法;
当cwnd>ssthresh时,停止使用慢开始算法而改用拥塞避免算法;
当cwnd=ssthresh时,都可以;
拥塞避免算法的目的是让拥塞窗口cwnd加法增大(Additive Increase),即按照线性规律缓慢增长。
2、快重传和快恢复
快重传算法规定,发送方只要一连收到3个重复确认,就可以知道现在并未出现网络拥塞,而只是接收方少收到一个报文段M3,因而立即进行重传M3。
当发送方知道了现在只是丢失了个别的报文段,于是不启动慢开始,而是执行快恢复算法。
如果把本节所讨论的拥塞控制和接收方对发送方的流量控制一起考虑,那么发送窗口的上限值=Min[rwnd,cwnd],也就是说,rwnd和cwnd中数值较小的一个,控制了发送方发送数据的速率。
3、主动队列管理AQM(Active Queue Managemnet)
网络层的策略对TCP拥塞控制影响最大的就是路由器的分组丢弃策略。在最简单的情况下,路由器的队列通常都按照先进先出FIFO的规则处理到来的分组。由于队列长度总是有限的,因此当队列已满时,以后再到达的所有分组都将被丢弃,这就叫做尾部丢弃策略。
而在网络中通常有很多的TCP连接,这些连接中的报文段通常是复用在网络层的IP数据报中传输的。在这种情况下若发生了路由器的尾部丢弃,就可能会同时影响到很多条TCP连接,结果使很许多TCP连接在同一时间突然都进入到慢开始状态,称为全局同步,主动队列管理AQM可以在队列长度达到某个值得警惕的数值时就主动丢弃到达的分组,经典的方法有随机早期检测RED。
八、TCP的运输连接管理
1、TCP的连接建立
TCP建立连接的过程叫做握手,握手需要在客户端和服务器之间交换三个报文段。
(1)最初两端的TCP进程都处于CLOSED状态。
(2)一开始B的TCP服务器进程先创建传输控制块TCB,准备接收客户进程的连接请求。然后服务器进程处于LISTEN状态,等待客户的连接请求。
(3)A的TCP客户进程也是首先创建传输控制块TCB。然后在打算建立TCP连接时向B发出连接请求报文段,这时首部中的同步位SYN=1,同时选择一个初始序号seq=x,这时TCP客户进程进入SYN-SENT状态。
(4)B收到连接请求报文段后,若同意建立连接,则向A发送确认。在确认报文段中应该吧SYN位和ACK位都置1,确认号为ack=x+1,同时也为自己选择一个初始序号seq=y。这时TCP服务器进程进入SYN-RCVD(同步收到)状态。如果B先发送一个确认报文段(ACK=1,ack=x+1),然后再发送一个同步报文段(SYN=1,seq=y),这样就变成了四报文握手
(5)TCP客户进程收到B的确认后,还要向B给出确认。确认报文段的ACK置1,确认号ack=y+1,而自己的序号seq=x+1,这时,TCP连接已经建立,A进入ESTABLISHED状态
(6)当B收到A的确认以后,也进入ESTABLISHED状态。
采用三报文或者四报文握手最后一次的确认是为了防止已失效的连接请求报文段(网络节点时间长滞留了)突然又传送到了B因而产生错误。
2、TCP的连接释放
TCP还设有保活计时器(keepalive timer),当客户端已经主动与服务器建立了TCP连接,但是后来客户端的主机突然出现了故障,这个时候服务器就不能收到客户发来的数据,可以通过服务器每收到一次数据就重新设置保活计时器的方式 避免服务器白白等待、