赞
踩
用户数据报协议(User Datagram Protocol,简称UDP)是一种允许在基于IP的网络中无连接地发送数据报的协议。通过使用用户数据报协议,应用程序可以非常快速地发送信息,因为既不必建立与收件人的连接,也不必等待答案。但是,不能保证数据包将到达完成,并在同一顺序它们被发送。此外,该协议不提供自己的保护,以防止第三方操纵或访问。但是,可以通过可选的可用校验和检测故障数据包(强制性地与IPv6结合使用)。
报文结构:
校验和:检测UDP用户数据报在传输中是否有错。有错就丢弃。
UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。并且它是将应用程序发来的数据在收到的那一刻,立刻按照原样发送到网络上的一种机制。
即使是出现网络拥堵的情况下,UDP也无法进行流量控制等避免网络拥塞的行为。此外,传输途中如果出现了丢包,UDP也不负责重发。甚至当出现包的到达顺序乱掉时也没有纠正的功能。如果需要这些细节控制,那么不得不交给由采用UDP的应用程序去处理。换句话说,UDP将部分控制转移到应用程序去处理,自己却只提供作为传输层协议的最基本功能。UDP有点类似于用户说什么听什么的机制,但是需要用户充分考虑好上层协议类型并制作相应的应用程序。
TCP充分实现了数据传输时各种控制功能,可以进行丢包的重发控制,还可以对次序乱掉的分包进行顺序控制。而这些在UDP中都没有。此外,TCP作为一种面向有连接的协议,只有在确认通信对端存在时才会发送数据,从而可以控制通信流量的浪费。
TCP通过检验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输。此处不一一叙述。
TCP与UDP如何加以区分使用?
TCP用于在传输层有必要实现可靠性传输的情况。由于它是面向有连接并具备顺序控制、重发控制等机制的。所以它可以为应用提供可靠传输。
另一方面,UDP主要用于那些对高速传输和实时性有较高要求的通信或广播通信。举一个IP电话进行通话的例子。如果使用TCP,数据在传送途中如果丢失会被重发,但是这样无法流畅地传输通话人的声音,会导致无法进行正常交流。而采用UDP,它不会进行重发处理。从而也就不会有声音大幅度延迟到达的问题。即使有部分数据丢失,也只是影响某一小部分的通话。此外,在多播与广播通信中也使用UDP而不是UDP。RIP、DHCP等基于广播的协议也要依赖于UDP。
由于在传输层UDP已经是不可靠的连接,那就要在应用层自己实现一些保障可靠传输的机制
简单来讲,要使用UDP来构建可靠的面向连接的数据传输,就要实现类似于TCP协议的
目前已经有一些实现UDP可靠传输的机制,比如
UDT(UDP-based Data Transfer Protocol)
基于UDP的数据传输协议(UDP-based Data Transfer Protocol,简称UDT)是一种互联网数据传输协议。UDT的主要目的是支持高速广域网上的海量数据传输,而互联网上的标准数据传输协议TCP在高带宽长距离网络上性能很差。 顾名思义,UDT建于UDP之上,并引入新的拥塞控制和数据可靠性控制机制。UDT是面向连接的双向的应用层协议。它同时支持可靠的数据流传输和部分可靠的数据报传输。 由于UDT完全在UDP上实现,它也可以应用在除了高速数据传输之外的其它应用领域,例如点到点技术(P2P),防火墙穿透,多媒体数据传输等等。
TCP报文结构:TCP报文是TCP层传输的数据单元,也叫报文段。
1、端口号:用来标识同一台计算机的不同的应用进程。
TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。
2、序号和确认号:是TCP可靠传输的关键部分。序号是本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。e.g.一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400。所以序号确保了TCP传输的有序性。确认号,即ACK,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0。
3、数据偏移/首部长度:4bits。由于首部可能含有可选项内容,因此TCP报头的长度是不确定的,报头不包含任何任选字段则长度为20字节,4位首部长度字段所能表示的最大值为1111,转化为10进制为15,15*32/8 = 60,故报头最大长度为60字节。首部长度也叫数据偏移,是因为首部长度实际上指示了数据区在报文段中的起始偏移值。
4、保留:为将来定义新的用途保留,现在一般置0。
5、控制位:URG ACK PSH RST SYN FIN,共6个,每一个标志位表示一个控制功能。
6、窗口:滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小时一个16bit字段,因而窗口大小最大为65535。
7、校验和:奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。
8、紧急指针:只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。
9、选项和填充:最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。
10、数据部分: TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。
了解TCP协议端口的连接状态,对排除和定位网络或系统故障会有很大帮助,因此了解一下是有必要的:
首先需要认识几个TCP的状态名称与含义,在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST
一般地,当出现FIN包或RST包时,我们便认为客户端与服务器端断开了连接;而当出现SYN和SYN+ACK包时,我们认为客户端与服务器建立了一个连接。
为了保证服务端能收接受到客户端的信息并能做出正确的应答而进行前两次(第一次和第二次)握手,为了保证客户端能够接收到服务端的信息并能做出正确的应答而进行后两次(第二次和第三次)握手。
TCP建立连接为什么是三次握手?这个问题的本质是, 信道不可靠, 但是通信双发需要就某个问题达成一致. 而要解决这个问题, 无论你在消息中包含什么信息, 三次通信是理论上的最小值. 所以三次握手不是TCP本身的要求, 而是为了满足"在不可靠信道上可靠地传输信息"这一需求所导致的. 请注意这里的本质需求,信道不可靠, 数据传输要可靠. 三次达到了, 那后面你想接着握手也好, 发数据也好, 跟进行可靠信息传输的需求就没关系了. 因此,如果信道是可靠的, 即无论什么时候发出消息, 对方一定能收到, 或者你不关心是否要保证对方收到你的消息, 那就能像UDP那样直接发送消息就可以了.
为什么不能用两次握手进行连接?3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。
对于4次挥手,其实你仔细看是2次,因为TCP是全双工的,所以,发送方和接收方都需要Fin和Ack。只不过,有一方是被动的,所以看上去就成了所谓的4次挥手。由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。
如果两边同时断连接,那就会就进入到CLOSING状态,然后到达TIME_WAIT状态。上图是双方同时断连接的示意图。
当客户端进入TIME-WAIT状态的时候(也就是第四次挥手的时候),必须经过时间计数器设置的时间2MSL(最长报文段寿命)后,才能进入关闭状态,这时为什么呢?
这最主要是因为两个理由:
注意:在服务器发送了FIN-ACK之后,会立即启动超时重传计时器。客户端在发送最后一个ACK之后会立即启动时间等待计时器。
为什么是2MSL
我们知道服务端收到ACK,关闭连接。但是客户端无法知道ACK是否已经到达服务端,于是开始等待?等待什么呢?假如ACK没有到达服务端,服务端会为FIN这个消息超时重传 timeout retransmit ,那如果客户端等待时间足够,又收到FIN消息,说明ACK没有到达服务端,于是再发送ACK,直到在足够的时间内没有收到FIN,说明ACK成功到达。这个等待时间至少是:服务端的timeout + FIN的传输时间,为了保证可靠,采用更加保守的等待时间2MSL。
MSL,Maximum Segment Life,这是TCP 对TCP Segment 生存时间的限制。
客户端发出ACK,等待ACK到达对方的超时时间 MSL,等待FIN的超时重传,也是MSL,所以如果2MSL时间内没有收到FIN,说明对方安全收到FIN。
首先,对于TCP通信来说,每个TCP Socket的内核中都有一个发送缓冲区和一个接收缓冲区,TCP的全双工的工作模式及TCP的滑动窗口就是依赖于这两个独立的Buffer和该Buffer的填充状态。
接收缓冲区把数据缓存到内核,若应用进程一直没有调用Socket的read方法进行读取,那么该数据会一直被缓存在接收缓冲区内。不管进程是否读取Socket,对端发来的数据都会经过内核接收并缓存到Socket的内核接收缓冲区。read索要做的工作,就是把内核接收缓冲区中的数据复制到应用层用户的Buffer里。进程调用Socket的send发送数据的时候,一般情况下是讲数据从应用层用户的Buffer里复制到Socket的内核发送缓冲区,然后send就会在上层返回。换句话说,send返回时,数据不一定会被发送到对端。
TCP 连接的每一端都必须设有两个窗口——一个发送窗口和一个接收窗口。TCP 的可靠传输机制用字节的序号进行控制。TCP 所有的确认都是基于序号而不是基于报文段。发送过的数据未收到确认之前必须保留,以便超时重传时使用。发送窗口不动(没收到确认)和前移(收到新的确认)。
发送缓存用来暂时存放:发送应用程序传送给发送方 TCP 准备发送的数据;TCP 已发送出但尚未收到确认的数据。
接收缓存用来暂时存放:按序到达的、但尚未被接收应用程序读取的数据; 不按序到达的数据。
TCP/IP可靠传输的基础是滑动窗口协议和连续ARQ协议,配合着流量控制和拥塞控制,使得整个传输过程保证:
左图:图a情况是传输中没有出现差错情况下的,A发送完M1后收到确认再发送下一组。图b是传输过程中出现差错,这里就采用了超时重传。实现超时重传就要在每发送完一个分组时设置一个超时计时器,如果在计时器到期之前收到对方的确认,就撤销已设置的超时计时器。
右图:图a如所示,B接收到,但是回应确认消息的时候丢失,这时候A的超时计时器到期了,就又发送了M1,这时候B会丢弃重复的M1,再次重传确认消息。图b是B在收到A发送的M1后,B回应确认消息返回给A时迟到了,这时候A又发送一次M1,同样的,B会丢弃M1,再次重传确认。A收到迟到后的确认消息会什么也不做。
使用上述的确认和重传机制,TCP就能在不可靠的传输网络上实现可靠的通信!!!像上述的这种可靠传输协议常称为自动重传请求ARQ。 意思是重传的请求是自动进行的。停止等待协议一个显著的特点是效率太低,信道利用率太低。
连续ARQ协议规定,发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。下图表示发送方收到对第1个分组的确认,于是把发送窗口向前移动一个分组的位置。如果原来已经发送了前5个分组,那么现在就可以发送窗口内的第6个分组了。
接收方一般都是采用累积确认的方式,也就是说,接收方不必对收到的分组逐个发送确认,而是在收到几个分组后,对按序到达的最后一个分组发送确认,这就表示:到这个分组分组为止的所有分组都已正确收到了。
累计确认优点:容易实现,即使确认丢失也不必重传。缺点:不能向发送方反映出接收方已经正确收到所有的分组的信息。
例如,如果发送方发送了前5个分组,而中间的第3个分组丢失了。这时接收方只能对前两个分组发出确认。发送方无法知道后面三个分组的下落,而只好把后面的三个分组都再重传一次。这就叫做Go-back-N(回退N),表示需要再退回来重传已经发送过的N个分组。可见,当通信线路质量不好时,连续ARQ协议会带来负面影响。
流量控制的目的:让发送方的发送速率不要太快,要让接收方来得及接收。利用滑动窗口机制就可以实现对发送方的流量控制。
流量控制往往是指点对点通信量的控制,是个端到端的问题。流量控制所要做的就是控制发送端发送速率,以便使接收端来得及接受。利用滑动窗口机制就可以实现流量的控制。原理就是运用TCP报文中的窗口大小字段来控制,发送的发送窗口不可以大于接收方的接收窗口大小。如果接收方没有足够的缓存来接收数据,发送方就会收到一个零窗口的通知。此时发送方停止发送。并且定时发送一个窗口探测报文来探测接收方的接收能力。
考虑一种特殊的情况,就是接收方若没有缓存足够使用,就会发送零窗口大小的报文,此时发送放将发送窗口设置为0,停止发送数据。之后接收方有足够的缓存,发送了非零窗口大小的报文,但是这个报文在中途丢失的,那么发送方的发送窗口就一直为零导致死锁。
解决这个问题,TCP为每一个连接设置一个持续计时器(persistence timer)。只要TCP的一方收到对方的零窗口通知,就启动该计时器,周期性的发送一个零窗口探测报文段。对方就在确认这个报文的时候给出现在的窗口大小(注意:TCP规定,即使设置为零窗口,也必须接收以下几种报文段:零窗口探测报文段、确认报文段和携带紧急数据的报文段)。
流量控制是端到端的交互,如果只是局域网内的两台设备交互,我想通过滑动窗口大概能控制得不差,但是实际网络的情况非常复杂,发送方和接收方之间还有路由器和交换机,网络传输线路又复杂,这个时候就需要拥塞控制。
拥塞控制:TCP模块为了防止过多的数据注入网络,使网络中的路由器或链路不致于过载。以此提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性而采取的控制手段。拥塞控制包含四部分内容:慢启动、拥塞避免、快速重传、快速恢复。
拥塞窗口的概念:发送报文段速率的确定,既要根据接收端的能力,又要从全局考虑不要使网路发生拥塞,这由接收窗口和拥塞窗口两个状态量来决定。接收窗口又称通知窗口,是接收端根据目前接收缓存大小所许诺的最新窗口值,是来自接收端的流量控制。拥塞窗口cwnd是发送端根据自己估计的网络拥塞程度而设置的窗口值,是来自发送端的流量控制。
慢启动:网络传输刚开始时,并不知道网络的实际情况,所以采取一种试探的方式控制数据的发送速率。慢启动阶段,数据的发送速率以指数方式增长,即就是拥塞窗口的增长,每次都是收到确认报文段数量的2倍。可以看出慢启动并不慢,拥塞窗口增长的速度很快。所以,为其设置了一个慢启动门限,当达到门限时,就进入到拥塞避免阶段。
拥塞避免:当拥塞窗口的大小采用慢启动方式增长到慢启动门限时,就进入拥塞避免阶段,拥塞避免阶段不再以指数形式增长拥塞窗口,而是每经过一个往返时间RTT就将发送方的拥塞窗口+1, 使其增长速度减缓。按照线性方式增长。如果发生网络拥塞,比如丢包时,就将慢启动门限设为原来的一半,然后将拥塞窗口设置为1,开始执行慢启动算法。(较低的起点,指数级增长)。
快速重传:假设发送方发送的报文段分别为:M1,M2,M3,M4,M5,M6 , 当接收方收到M1和M2后,M3报文段丢失,接着收到的M4,M5,M6都不做处理,而是没接收到一个报文段就对M2重复确认,发送方接收到重复的三次确认报文段,就对其后的报文段进行重新发送,而不需要等待超时时间到达。当快速重传后,立即进入到快速恢复阶段。
快速恢复:将慢启动门限设置为原来的一半,然后将拥塞窗口设置为现在的慢启动门限值,不再执行慢启动算法,而是直接进入拥塞避免阶段。使发送窗口成线性方式增大。
什么时候应该使用TCP: 当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。在日常生活中,常见使用TCP协议的应用如下: 浏览器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件传输 ………… 什么时候应该使用UDP:当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。 比如,日常生活中,常见使用UDP协议的应用如下: QQ语音 QQ视频 TFTP ……
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。