局域网通信原理传输层和应用层主要内容TCP简介UDP简介应用层协议TCP协议TCP:TransferControlProtocol提供端到端数据流服务,其中包含确保数据可靠传送的机制。这些机制包括校验和、序列号、计时器、确认以及重传过程。TCP是一种面向连接的协议,可以为应用层提供可靠、有序的数据传送。IPv4头部格式建立连接的三路握手服务器必须准备好接受外来的连接。这通过调用socket,bind,listen函数来完成,称为被动打开(passiveopen)。客户同过调用connect进行主动打开(activeopen),这引起客户tcp发送一个SYN分节(表示同步),它告诉服务器客户将在(待建立的)连接中发送的数据的初始序列号。一般情况下SYN分节不携带数据,它只含有一个IP头部、一个TCP头部及可能有的TCP选项。服务器必须确认客户的SYN,同时自己也得发送一个SYN分节,它含有服务器将在同一连接中发送的数据的初始序列号。服务器以单个分节向客户发送SYN和对客户SYN的ACK。客户必须确认服务器的SYN。建立连接的报文交换终止连接的四个分节某个应用进程首先调用close,我们称这一端执行主动关闭(activeclose)。这一端的TCP于是发送一个FIN分节,表示数据发送完毕。接收到FIN的另一端执行被动关闭(passiveclose)。这个FIN由TCP确认。它的接收也作为文件结束符传递给接收方应用进程(放在已排队等候该应用进程接收的任何其他数据之后),因为FIN的接收意味着应用进程在相应的连接上再也接收不到额外的数据。一段时间后,接收到文件结束符的应用进程将调用close关闭它的套接口。这导致它的TCP也发送一个FIN。接收到这个FIN的原发送方TCP(即执行主动关闭的那一端)对它进行确认。终止连接的报文交换TCP状态转换图TCP正常连接建立和终止所对应的状态TIME_WAIT状态该状态持续时间是最长分节生命期MSL(maximumsegmentlifetime)的两倍,有时称为2MSL。存在该状态的两个理由:1.实现终止TCP全双工连接的可靠性;2.允许老的重复分节在网络中消逝。在该状态期间,定义这个连接的套接口(客户的IP和端口号、服务器的IP和端口号)不能再被使用。端口号的分配TCP同时打开交换四个报文段,每一端既是客户又是服务器TCP同时关闭交换四个报文段TCP的交互数据流Nagle算法(RFC896[Nagle1984])1.使用该算法的原因2.算法概念原因在广域网上,大量小分组的存在会增加网络拥塞的可能性。小分组就是数据包尺寸很小的分组,比如一个数据包只包含41字节长:20字节的IP首部、20字节的TCP首部和1字节的数据。Nagle算法该算法要求一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。相反,TCP收集这些少量的分组,并在确认到来时以一个分组的方式发出去。该算法的优越之处在于它是自适应的:确认到达得越快,数据也就发送得越快。而在希望减少微小分组数目的低速广域网上,则会发送更少的分组。TCP的成块数据流滑动窗口窗口大小慢启动滑动窗口-1滑动窗口-2滑动窗口-3发送方不必发送一个全窗口大小的数据。来自接收方的一个报文段确认数据并把窗口向右边滑动。这是因为窗口大小是相对于确认序号的。正如从报文段7到8中的变化那样,窗口大小可以减少,但窗口的右边沿却不能向左移动。接收方在发送一个ACK前不必等待窗口被填满。许多实现每收到两个报文段就会发送一个ACK。窗口大小4.2BSD默认设置发送和接收缓冲区大小为2048字节。在4.3BSD中双方被增加为4096字节。SunOS4.1.3、BSD/386和SVR4仍然使用4096字节的默认大小。其他系统,如Solaris2.2、4.4BSD和AIX3.2则使用更大的默认缓存大小,如8192或16384等。慢启动(SlowStart)提出原因:发送方一开始就向网络发送多个报文段,直至达到接收方通告的窗口大小为止。当发送方和接收方处于同一个局域网时,这种方式是可以的。但若在发送方和接收方之间存在多个路由器和速率较慢的链路时,就可能出现一些问题。一些中间的路由器必须缓存分组,并有可能耗尽存储器的空间。这会严重降低TCP连接的吞吐量。慢启动算法描述该算法通过观察到新分组进入网络的速率应该与另一端返回确认的速率相同而进行工作。满启动为发送方的TCP增加了另一个窗口:拥塞窗口(记为cwnd)。当与另一个网络的主机建立TCP连接时,拥塞窗口被初始化为1个报文段(即另一端通告的报文段大小)。每收到一个ACK,拥塞窗口就增加一个报文段(cwnd以字节为单位,但慢启动以报文段大小为单位进行增加)。发送方取拥塞窗口与通告窗口中的最小值作为发送上限。拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。发送方开始时发送一个报文段,然后等待ACK。当收到该ACK时,拥塞窗口从1增为2,即可以发送两个报文段。当收到这两个报文段的ACK时,拥塞窗口增为4。这是一种倍数增加的关系(2倍)。在某些点上可能达到了互联网的容量,于是中间路由器开始丢弃分组。这就通知发送方它的拥塞窗口开得过大。TCP的超时与重传概念快速重传与快速恢复算法重新分组超时与重传的概念TCP提供可靠的运输层。它使用的方法之一就是确认从另一端收到的数据。但数据和确认都有可能会丢失。TCP通过在发送时设置一个定时器来解决这种问题。若当定时器溢出时还没有收到确认,它就重传该数据。对任何实现而言,关键之处就在于超时和重传的策略,即怎样决定超时间隔和如何确定重传的频率。快速重传与快速恢复算法Cwnd:拥塞窗口;ssthresh:慢启动门限算法如下:1.当收到第三个重复的ACK时,将ssthresh设置为当前拥塞窗口cwnd的一半。重传丢失的报文段。设置cwnd为ssthresh加上3倍的报文段大小。2.每次收到另一个重复的ACK时,cwnd增加1个报文段大小并发送1个分组(若新的cwnd允许发送)。3.当下一个确认新数据的ACK到达时,设置cwnd为ssthresh(在第1步中设置的值)。这个ACK应该是在进行重传后的一个往返时间内对步骤1中重传的确认。另外,这个ACk也应该是对丢失的分组和收到的第1个重复的ACK之间的所有中间报文段的确认。重新分组当TCP超时并重传时,它不一定要重传同样的报文段。相反,TCP允许进行重新分组而发送一个较大的报文段,这将有助于提高性能(当然,这个较大的报文段不能够超过接收方声明的MSS)。UDP协议UDP是一个简单的不可靠的数据报协议。UDP提供无连接(connectionless)的服务,因为UDP客户与服务器不必存在长期的关系。UDP不提供可靠性:它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地。UDP首部IP分片-1应用程序必须关心IP数据报的长度。若它超过网络的MTU,那么就要对IP数据报进行分片。如果需要,源端到目的端之间的每个网络都要进行分片,并不只是发送端主机连接第一个网络才这样做。把一份IP数据报分片以后,只有到达目的地才进行重新组装。IP分片-2当IP数据报被分片后,每一片都成为一个分组,具有自己的IP首部,并在选择路由时与其他分组独立。这样,当数据报的这些片到达目的端时有可能会失序,但是在IP首部中有足够的信息让接收端能正确组装这些数据报片。缺点:即使只丢失一片数据也要重传整个数据报。ICMP不可达错误(需要分片)IP首部标志字段中有一个比特称作“不分片”位(DF位)。若将这一位置1,IP将不对数据报进行分片。相反把数据报丢弃并发送一个ICMP差错报文(“destinationunreachable,fragmentationneededbutDFbitset”)给起始端。广播和多播三种IP地址:单播地址、广播地址和多播地址。广播和多播仅应用于UDP,它们对需将报文同时传往多个接收者的应用来说十分重要。广播:一个主机向网上的所有其他主机发送帧。多播:帧仅传送给属于多播组的多个主机。帧的过滤过程首先,网卡查看由信道传送过来的帧,确定是否接收该帧。通常网卡仅接收目的地址为网卡物理地址或广播地址的帧。另外,多数接口均被设置为混合模式,该模式能接收每个帧的一个复制。设备驱动程序将进行另外的帧过滤。首先,帧类型中必须指定要使用的协议(IP、ARP等)。其次,进行多播过滤来检测该主机是否属于多播地址说明的多播组。IP层根据IP地址中的源地址和目的地址进行更多的过滤检测。若正常,则将数据报传送给下一层(如TCP或UDP)。每次UDP收到由IP传送来的数据报,就根据目的端口号,有时还有源端口号进行数据报过滤。若当前没有进程使用该目的端口号,就丢弃该数据报并产生一个ICMP不可达报文(TCP根据它的端口号作相似的过滤)。若UDP数据报存在检验和错,将被丢弃。过滤示意图广播的分类受限的广播指向网络的广播指向子网的广播指向所有子网的广播受限的广播受限的广播地址是255.255.255.255。该地址用于主机配置过程中IP数据报的目的地址,此时,主机可能还不知道它所在网络的网络掩码,甚至连它的IP地址也不知道。任何情况下,路由器都不转发目的地址为受限的广播地址的数据报,这样的数据报仅出现在本地网络中。指向网络的广播指向网络的广播地址是主机号为全1的地址。A类网络广播地址为netid.255.255.255,其中netid为A类网络的网络号。一个路由器必须转发指向网络的广播,但它也必须有一个不进行转发的选择。指向子网的广播指向子网的广播地址为主机号为全1且有特定子网号的地址。作为子网直接广播地址的IP地址需要了解子网的掩码。例如,若路由器收到发往128.1.2.255的数据报,当B类网络128.1的子网掩码为255.255.255.0时,该地址就是指向子网的广播地址;但如果该子网的掩码是255.255.254.0,该地址就不是指向子网的广播地址。指向所有子网的广播指向所有子网的广播也需要了解目的网络的子网掩码,以便与指向网络的广播地址区分开。指向所有子网的广播地址的子网号及主机号为全1。例如,若目的子网掩码为255.255.255.0,那么IP地址128.1.255.255是一个指向所有子网的广播地址。然而,若网络没有划分子网,这就是一个指向网络的广播。多播IP多播提供两类服务:1.向多个目的地址传送数据。2.客户对服务器的请求。例如,无盘工作站需要确定启动引导服务器。多播组地址分配的28bit均用作多播组号而不再表示其他。多播地址范围:从224.0.0.0到239.255.255.255能够接收发往一个特定多播组地址数据的主机集合称为主机组(hostgroup)。一个主机组可跨越多个网络。主机组中成员可随时加入或离开主机组。主机组中对主机的数量没有限制,同时不属于某一主机组的主机可以向该组发送信息。多播组地址到以太网地址的转换IANA拥有一个以太网地址块,即高位24bit为00:00:5e(十六进制表示),这意味着该地址块所拥有的地址范围从00:00:5e:00:00:00到00:00:5e:ff:ff:ff。IANA将其中的一半分配为多播地址。为了指明一个多播地址,任何一个以太网地址的首字节必须是01,这意味着与IP多播相对应的以太网地址范围从01:00:5e:00:00:00到01:00:5e:7f:ff:ff。这种地址分配将使以太网多播地址中的23bit与IP多播组号对应起来,通过将多播组号中的低位23bit映射到以太网地址中的低位23bit实现。由于多播组号中的最高5bit在映射过程中被忽略,因此每个以太网多播地址对应的多播组是不唯一的。既然地址映射是不唯一的,那么设备驱动程序或IP层就必须对数据报进行过滤。地址转换图单个物理网络的多播单个物理网络的多