1第三章传输层2第三章:传输层目标:•理解传输层服务以后的原则:•复用/分解复用•可靠数据传输•流量控制•拥塞控制•学习因特网的传输层协议:•UDP:无连接传输•TCP:面向连接传输•TCP拥塞控制3第三章提纲•3.1传输层服务•3.2多路复用和多路分解•3.3无连接传输:UDP•3.4可靠数据传输原理•3.5面向连接传输:TCP•报文段结构•可靠数据传输•流量控制•连接管理•3.6拥塞控制原理•3.7TCP拥塞控制4传输层服务和协议•在两个不同的主机上运行的应用程序之间提供逻辑通信•传输层协议运行在端系统•发送方:将应用程序报文分成数据段传递给网络层,•接受方:将数据段重新组装成报文传递到应用层•不只一个传输层协议可以用于应用程序•因特网:TCP和UDP应用层传输层网络层链路层物理层应用层传输层网络层链路层物理层networkdatalinkphysicalnetworkdatalinkphysicalnetworkdatalinkphysicalnetworkdatalinkphysicalnetworkdatalinkphysical5传输层和网络层•网络层:两个主机之间的逻辑通信•传输层:两个进程之间的逻辑通信•可靠,增强的网络层服务6Internet传输层协议•可靠按序递交(TCP)•拥塞控制•流量控制•连接建立•不可靠的无序传递:UDP•“尽力传递”IP的直接扩展•不提供的服务:•延迟保证•带宽保证applicationtransportnetworkdatalinkphysicalapplicationtransportnetworkdatalinkphysicalnetworkdatalinkphysicalnetworkdatalinkphysicalnetworkdatalinkphysicalnetworkdatalinkphysicalnetworkdatalinkphysical7第三章提纲•3.1传输层服务•3.2多路复用和多路分解•3.3无连接传输:UDP•3.4可靠数据传输原理•3.5面向连接传输:TCP•报文段结构•可靠数据传输•流量控制•连接管理•3.6拥塞控制原理•3.7TCP拥塞控制8多路复用和多路分解应用1应用2多路复用器网络接口应用1应用2多路分解器网络接口9多路复用/多路分解applicationtransportnetworklinkphysicalP1applicationtransportnetworklinkphysicalapplicationtransportnetworklinkphysicalP2P3P4P1host1host2host3=进程=套接字将接收到的数据段传递到正确的套接字(多路分解)在接收主机多路分解:从多个套接字收集数据,用首部封装数据,然后将报文段传递到网络层(多路复用)在发送主机多路复用:10多路分解如何工作•主机收到IP数据报•每个数据报有源IP地址,目的IP地址•每个数据报搬运一个数据段•每个数据段有源和目的端口号(回忆:对于特定应用程序具有周知端口号)•主机用IP地址和端口号指明数据段属于哪个合适的套接字源端口#目的端口#32bits应用程序数据(报文)其他首部域TCP/UDP报文段格式11无连接多路分解•用端口号创建套接字:DatagramSocketServerSocket1=newDatagramSocket(9911);DatagramSocketServerSocket2=newDatagramSocket(9922);•UDP套接字由两个因素指定:(目的IP地址,目的端口号)•当主机收到UDP数据段:•检查数据段中的目的端口号•用端口号指示UDP数据段属于哪个套接字•具有不同的源IP地址且/或源端口号,但具有相同的目的IP地址和目的端口号的IP数据报指向同样的套接字12P2无连接多路分解(续)DatagramSocketserverSocket=newDatagramSocket(6428);ClientIP:BclientIP:AP1P1P3serverIP:CSP:6428DP:9157SP:9157DP:6428SP:6428DP:5775SP:5775DP:6428请求报文段中提供返回地址(包括IP地址和端口号)13面向连接的多路分解•TCP套接字由4部分指定:•源IP地址•源端口号•目的IP地址•目的端口号•接收主机使用所有四个值将数据段定位到合适的套接字•服务器主机支持很多同时的TCP套接字:•每个套接字用4部分来表示•Web服务器对每个连接的客户都有不同的套接字•非持久HTTP将对每个请求有一个不同的套接字14面向连接的多路分解(续)ClientIP:BP1clientIP:AP1P2P4serverIP:CSP:9157DP:80SP:9157DP:80P5P6P3D-IP:CS-IP:AD-IP:CS-IP:BSP:5775DP:80D-IP:CS-IP:B15面向连接的多路分解:web服务器如何工作?ClientIP:BP1clientIP:AP1P2serverIP:CSP:9157DP:80SP:9157DP:80P4P3D-IP:CS-IP:AD-IP:CS-IP:BSP:5775DP:80D-IP:CS-IP:B16第三章提纲•3.1传输层服务•3.2多路复用和多路复用•3.3无连接传输:UDP•3.4可靠数据传输原理•3.5面向连接传输:TCP•报文段结构•可靠数据传输•流量控制•连接管理•3.6拥塞控制原理•3.7TCP拥塞控制17UDP:用户数据报协议[RFC768]•“无修饰”“不加渲染的”因特网传输层协议•“尽最大努力”服务,UDP数据段可能:•丢失•会传递失序的报文段到应用程序•无连接:•在UDP接收者发送者之间没有握手•每个UDP数据段的处理独立于其他数据段为什么有UDP?•不需要建立连接(减少延迟)•简单:在发送者接收者之间不需要连接状态•很小的数据段首部•没有拥塞控制:UDP能够用想象的快的速度传递18UDP:用户数据报协议[RFC768]•UDP只在IP的数据报服务之上增加了很少一点的功能,即端口的功能和差错检测的功能。•虽然UDP用户数据报只能提供不可靠的交付,但UDP在某些方面有其特殊的优点。•UDP是无连接的,即发送数据之前不需要建立连接。•UDP使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制。•UDP没有拥塞控制,很适合多媒体通信的要求。•UDP支持一对一、一对多、多对一和多对多的交互通信。19UDP:用户数据报协议[RFC768]•UDP的首部开销小,只有8个字节。•UDP是面向报文的。发送方UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。•应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。•接收方UDP对IP层交上来的UDP用户数据报,在去除首部后就原封不动地交付上层的应用进程,一次交付一个完整的报文。•应用程序必须选择合适大小的报文。20UDP是面向报文的IP分组的数据部分IP首部IP层UDP首部UDP用户数据报的数据部分运输层应用层报文应用层5.2.2UDP的首部格式源端口目的端口长度检验和数据首部IP分组2222字节发送在前数据首部UDP用户数据报UDP基于端口的分用IP层UDP数据报到达端口2端口3端口1UDP分用用户数据报UDP有两个字段:数据字段和首部字段。首部字段有8个字节,由4个字段组成,每个字段都是两个字节。长度是首部和数据的总长度源端口目的端口长度检验和数据首部IP分组2222字节发送在前数据首部UDP用户数据报在计算检验和时,临时把“伪首部”和UDP用户数据报连接在一起。伪首部仅仅是为了计算检验和。伪首部源端口目的端口长度检验和数据首部UDP长度源IP地址目的IP地址017IP分组字节44112122222字节发送在前数据首部UDP用户数据报UDP校验和差错检测错误检测不是100%可靠!•协议有可能漏掉一些错误,但很少•大的校验信息域能提供更好的检错能力用户数据校验信息传输信道用户数据差错检测算法用户数据校验信息用户数据差错检测算法是否相等是错误处理否26UDP校验和发送方:•将数据段看成16bit的整数序列•校验和:数据段内容相加(1的补码和)•发送者将校验和值放入UDP的校验和域接收方:•计算接收到数据段的校验和•检查计算的校验和是否等于校验和域中的值:•NO–检测到错误•YES–没有检测到错误.但是可能是错误的?目标:对传输的数据进行差错检测27Internet校验和例子11100110011001101101010101010101101110111011101111011101110111100累加和0100010001000011校验和变反求和回卷求和时产生的进位必须回卷加到结果上最后的累加和必须按位变反才是校验和28第三章提纲•3.1传输层服务•3.2多路复用和多路分解•3.3无连接传输:UDP•3.4可靠数据传输原理•3.5面向连接传输:TCP•报文段结构•可靠数据传输•流量控制•连接管理•3.6拥塞控制原理•3.7TCP拥塞控制29可靠数据传输:我们将•逐步开发发送方和接收方的可靠数据传输协议(rdt)•仅考虑单向数据传输•但控制信息将双向流动!•用有限状态机(FSM)来标示发送方和接收方状态1状态2事件导致状态转换状态转换时执行的动作状态:在一个状态时,由事件唯一的确定状态的转换事件动作30Rdt1.0:完全可靠信道上的可靠数据传输•在完美可靠的信道上•没有bit错误•没有分组丢失•发送方,接收方分离的FSMs:•发送方发送数据到下层信道•接收方从下层信道接收数据等待来自上层的调用packet=make_pkt(data)udt_send(packet)rdt_send(data)extract(packet,data)deliver_data(data)等待来自下层的调用rdt_rcv(packet)senderreceiver31Rdt2.0:具有bit错误的信道•下层信道可能让传输分组中的bit受损•校验和将检测到bit错误•问题:如何从错误中恢复•确认(ACKs):接收方明确告诉发送方分组接收正确•否认(NAKs):接收方明确告诉发送方分组接收出错•发送方收到NAK后重发这个分组•在rdt2.0的新机制(在rdt1.0中没有的):•差错检测•接收方反馈:控制信息(ACK,NAK)rcvr-sender32rdt2.0:FSM规范extract(rcvpkt,data)deliver_data(data)udt_send(ACK)rdt_rcv(rcvpkt)&¬corrupt(rcvpkt)udt_send(NAK)rdt_rcv(rcvpkt)&&corrupt(rcvpkt)等待来自下层的调用receiver等待来自上层的调用snkpkt=make_pkt(data,checksum)udt_send(sndpkt)rdt_rcv(rcvpkt)&&isACK(rcvpkt)udt_send(sndpkt)rdt_rcv(rcvpkt)&&isNAK(rcvpkt)等待ACK或NAKsenderrdt_send(data)L33rdt2.0:没有错误时的操作等待上层调用snkpkt=make_pkt(data,checksum)udt_send(sndpkt)extract(rcvpkt,data)deliver_data(data)udt_send(ACK)rdt_rcv(rcvpkt)&¬corrupt(rcvpkt)rdt_rcv(rcvpkt)&&isACK(rcvpkt)udt_send(sndpkt)rdt_rcv(rcvpkt)&&isNAK(rcvpkt)udt_send(NAK)rdt_rcv(rcvpkt)&&corrupt(rcvpkt)等待ACK或NA