1、第五章 Internet运输层,5.1运输层协议概述 5.2 UDP 5.3 TCP 5.4 TCP的可靠性 5.5 TCP流量控制 5.6 TCP拥塞控制 5.7 TCP运输连接管理 补充:运输层编程接口,5.1运输层协议概述,计算机网络最本质的活动是分布在不同地理位置的主机之间的进程通信,以支撑网络上的各种服务功能。 网络层及以下的各层实现了网络中主机之间的通信,但是主机间通信不能满足要求 运输层(Transport Layer) 通信部分的最高层 主机的协议栈有运输层 路由器工作在下三层,没有运输层 运输层设置的目的 分布式进程通信,向应用层提供通信服务核心目的 多种通信方式(面向连接、
2、无连接) 底层协议的复用 差错检测(端到端) 流量控制 拥塞控制 QoS,运输层:屏蔽底层细节 (底层通信子网),运输层:提供进程间的逻辑通信,运输层协议(实体)通过通信子网(IP及以下层实体)提供的主机间通信,为上层进程提供逻辑通信(虚通信),一、进程通信 进程和进程通信:操作系统中的一个最基本的概念 单机系统中的进程通信 程序是一个在时间上按照严格次序的前后相继的操作序列,是静态的 进程是动态的,它是一个程序对某个数据集的执行过程 进程状态反映出进程执行过程的变化 要保证系统正常地工作,操作系统必须对进程的创建、撤消与状态转换进行控制 从进程的观点看,操作系统的核心则是控制和协调这些进程的
3、运行,解决进程之间的通信,操作系统内部进程通信机制(IPC) BSD UNIX : 管道(pipe) 命名管道(named pipe) 软中断信号(signal) AT&T UNIX: 消息(message) 共享存储区(shared memory) 信号量(semaphore) UNIX系统的消息、共享存储区和信号量统称为进程通信(IPC, Inter-Process Communication )机制,网络上不同主机间的进程通信 “计算机网络是分布在不同地理位置的多台独立的计算机系统的集合” 主机高度自治操作系统。 不能进行统一的(高层)控制与管理。 一台主机不知道其他主机的相关信息 活动
4、状态 各个进程状态 进程什么时间参与网络活动希望与网络中哪台主机的什么进程通信IPC不适应于网络环境中的进程通信,通过网络环境中的分布式进程通信来实现网络资源共享及网络服务。,网络上进程标识(命名与寻址方法) 在一台主机中,不同的进程用进程号或进程标识(process ID)惟一地标识出来。 网络环境中进程通信 协议相同 协议上的进程寻址:端口号 三元组(半相关,half-association ) 协议,主机地址,进程标识 网络环境中一个进程的全网惟一的标识 本地主机地址,协议,本地进程标识三元组 五元组(相关,association) 协议,本地主机地址,本地进程标识,远程主机地址,远程进
5、程标识 两个三元组构成,其中协议是相同的IP 网络环境中一个完整的进程通信标识 IP支持多种运输层协议:TCP和UDP,Proto= TCP, SA=51.23.221.6 ,SP=8080, DA=121.5.21.2 ,DP=15432,Proto= TCP, SA=121.5.21.2 ,SP=15432, DA= 51.23.221.6 ,DP=8080,网络环境中进程间相互作用的模式 Client/Server模型 Client/Server:相互通信的两个进程 Client(C,客户): 向服务器发出服务请求 由客户进程随机启动 Server(S,服务器):接受进程通信的请求 处于
6、等待状态 响应客户的请求,提供客户机所需要的网络服务,请求,响应,进程通信设施,Client,P2P(Peer to Peer,对等)模型 通信的双方没有固定的请求与服务的关系 在具体的通信过程中的不同时段,角色可以改变 发出请求时为Client角色 为Server角色时一般要等待请求,进程间通信采用 C/S模型原因 网络资源(硬件、软件和数据等)分布的不均匀性 不均匀性是客观的,也体现设计者的思想 “资源共享”就是要解决硬件配置、计算能力、存储能力和数据分布等方面的不均匀性 能力强大、资源丰富的充当Server 能力弱或需要某种资源的成为Client 网络环境中进程通信的异步性 不确定因素(
7、进程什么时间发出通信请求,希望和哪台主机的哪个进程通信,对方是否能接受请求的) 网络进程间没有高层的调度与协调 进程间通信必须要建立机制 为准备通信的进程之间建立起连接 在进程通信过程中维护连接,提供同步,Client/Server模型实现方法 客户机/服务器模型的工作实质是“请求驱动”; 客户进程发出请求完全随机 在同一个时刻,可能有多个客户进程向一个服务器发出服务请求; 在服务器的设计中要解决: 处理并发请求处理能力 标识并发服务器的进程 服务器安全,服务器进程分类 重复服务器 通过设置一个请求队列来存储客户机的服务请求 服务器采用先来先服务的原则来顺序处理客户机的服务请求 并发服务器多进
8、程 核心进程是一个守护程序(daemon)/主服务器(master) 主服务器在系统启动的时候随之启动 主服务器在没有客户的服务请求到达时,处于等待状态 客户服务请求到达,根据客户的进程标识,激活相应的子进程(从服务器,slave),主服务器随即回到等待状态 主服务器拥有周知的进程标识(三元组),客户进程根据该标识,向服务器提出服务请求 客户可采用任意进程ID,进程通信设施,进程通信设施,客户与并发服务器建立运输连接的过程,并发服务器与重复服务器的比较 并发服务器 可以处理多个客户的服务请求 从服务器不依赖主服务器而独立处理客户服务请求 不同的从服务器可以分别处理不同的客户的服务请求 系统的实
9、时性好 适应于面向连接的服务类型 重复服务器 处理客户的服务请求的数量受到请求队列长度的限制 可以有效地控制请求处理的时间 适应于无连接的服务类型,程序角度的Client/Server模型 客户/服务器是网络软件设计中进程间相互作用关系的模型。 主动启动通信的程序叫做客户端程序(Client) 用来提供某种服务的,有特殊权限的专用程序叫服务器程序(Server),等待接受来自(远程或本地)客户的请求,提供一种(或几种)服务,需要硬件配置较高的计算机和操作系统的支持,运行Server进程 (总处于Server角色),运行Client进程 (总处于Client角色),角色角度的Client/Ser
10、ver模型 Client和Server是进程所扮演的角色(进程状态) 为对方服务时通常进入等待状态Server角色 向对方请求服务时通常主动发起通信Client角色P2P通信中的角色转换,二、TCP/IP运输层的两个主要协议 UDP(用户数据报协议,User Datagram Protocol) RFC768 特点 无连接 单个报文可靠的进程通信 TCP(传输控制协议, Transmission Control Protocol) RFC793 特点 面向连接 完全可靠的进程通信 流接口 全双工,运输层的位置,三、运输层端口 概念 标识运输层上的进程区别(同一主机上)不同的应用进程 不同的应用
11、程序进程 同一应用程序不同的进程 实现对网络层的复用 取值 065535,整数TCP、UDP端口编号各自独立,端口类别 熟知端口(系统端口) 端口号: 0 1023 用于服务器(已规定相应的服务) 登记端口 端口号:1024 49151 用于服务器(使用前登记) 作为客户端的主机随机使用 临时端口 端口号:49152 65535 当主机上同时有服务器进程时,主机上的客户端进程使用 作为客户端的主机随机使用,Internet,Internet,端口结构,AP3,AP4,AP1,AP2,四、 Internet的运输层,TCP,UDP 1、服务质量 网络拥塞控制防止网络和路由器过载 在WAN中“网络
12、层”的功能 为什么在Internet中由运输层完成,而非“互联网层”完成? 提供面向连接和无连接的服务 解决互联网中的数据报丢失和延迟问题,提供可靠服务,5.2 UDP,UDP(User Datagram Protocol),用户数据报协议 一、概述 特点 无连接。尽最大努力交付 面向报文。报文内容整体交付 不可靠。单个报文校验 只能保证报文的正确性 不保证报文按顺序运输 不保证报文不丢失或重复 支持多种进程通信模式。一对一、一对多,多对一,多对多 开销小。8字节头部 简单。处理速度快,进程发送的报文较短 没有流量控制和拥塞控制,二、UDP报文 报文 报文头部 源端口、目的端口(各16比特)
13、报文长度(字节数) 校验和:校验范围包括伪报头 数据/载荷伪报头 源IP地址 目的IP地址 类别= 0x11 报文长度(字节数) 参加报文校验和计算,32比特(4字节),三、UDP常用的熟知端口号 (服务器端口),四、UDP用户数据报运输过程中的封装与拆封例:192.168.0.200 202.96.64.68192.168.0.200 202.96.64.68,192.168.0.200 202.96.64.68:进程数据,192.168.0.200 202.96.64.68:UDP头,192.168.0.200 202.96.64.68:IP头,192.168.0.200 202.96.6
14、4.68:MAC头,192.168.0.200 202.96.64.68,IP,源主机IP地址,目的主机IP地址,0x11,TCP报文长度 +20,UDP向IP提交报文和伪报头,来自UDP,UDP报文整体装入到IP数据报载荷中 伪报头部分域装入到IP数据报头部对应域中,5.3 TCP,TCP: Transmission Control Protocol,运输控制协议 一、TCP的主要特点 面向连接 完备的连接管理 用“三次握手”双向连接 用“二次握手”单向关闭连接 连接时双向协商起始字节序号 关闭连接时指示相应的(字节)序号 进程端口到进程端口 一对一进程通信 全双工通信 分别缓存发送和接收的
15、数据 发送数据时可捎带应答,完全可靠的数据交付 每个报文有应答与超时重发 数据字节编号协商 单向连接关闭后不发送数据,延迟接收应收(字节)序号的数据 量化到字节的流量控制 智能的网络拥塞控制 面向应用进程的字节流的端口接口 发送时从用户进程按顺序接收任意字节的数据 接收时恢复成字节流,按发送顺序提交给用户进程 可缓存非常多的接收数据(232 字节) 特别的应用考虑 接收端向接收进程推送数据 特殊数据不按顺序提交,二、TCP常用的熟知端口号,三、TCP报文(Segment,段/片)格式 报文 报文头部 源端口、目的端口 报文长度 校验和 数据/载荷TCP伪报头 源IP地址 目的IP地址 类别=
16、0x06 报文总长度,32比特(4字节),TCP报文头部 每个TCP报文都有,源端口(16bits) 标识源主机(源IP地址)的一个应用进程 目的端口(16bits) 标识目地主机(目的IP地址)的一个应用进程 序号(32bits) 报文中的数据在该TCP连接全部发送数据中的字节序号 确认号(32bits) ACK=1时,该序号(N)及以前的所有数据都已正确收到 头长(4bits) 报文头部的长度,单位4字节(行数),控制位(6bits) URG :=1,紧急指针有效标志 ACK:=1,确认标志 PSH:=1,推进标志,目的端口立即将本报文及此前的数据提交应用进程 RST:=1,清除连接标志
17、SYN:=1,建立连接请求 FIN:=1,连接关闭请求 窗口通告(16bits) 从确认号开始,发送该报文端口可接收的数据字节数 报文校验和(16bits) 包括伪报头 紧急指针(16bits)URG=1时,指向本报文中紧急数据所在的字节序号,不按顺序提交数据,四、TCP报文运输过程中的封装与拆封 发送:上层数据 TCP报文 IP数据报 MAC帧 接收:上层数据 TCP报文 IP数据报 MAC帧,0x06,TCP报文总长 +20,源主机IP地址,目的主机IP地址,0x0800,TCP报文 IP数据报 MAC帧,192.168.0.200 218.60.35.190:MAC头,192.168.0
18、.200 218.60.35.190:IP头,192.168.0.200 218.60.35.190:TCP头,192.168.0.200 218.60.35.190:TCP数据,5.4 TCP的可靠性,一、可靠性原理 底层“不可靠” 从应用角度讲,可靠传输所依赖的底层设施在实际传输数据时有相应的出错概率,不可能“不出错” TCP/IP的最底层协议IP所提供的是尽最大努力将IP数据报提交给“下一站” 可靠底层应具备的“理想”特性 传输信道不出错 接收方总能来得及接收发送方以任何速率发送到数据 如果底层具备上述条件,则高层不用采用任何措施,就能得到完全的可靠数据传输服务。 而事实上这两个条件都无
19、法满足,因此采用“不可靠”的底层传输数据时,高层要采取必要的措施来实现可靠传输。,二、高层措施 停等“协议” 发送方A通过不可靠的底层向接收方B发送帧(分组),B 对正确帧(分组)回发确认 A发送一个帧后,暂时保存,启动定时器,等待B的确认 “正”确认 (ACK) 到达,则发送新的数据帧 “负”确认 (NAK) 到达,则发送旧的数据帧 若在预计的时间内未收到确认,则发送旧的数据帧,提交数据给上层 ACK,B,A,帧出错,丢弃 NAK,Ts(发送时延),Tb(传播时延),Tb(传播时延),提交数据给上层 ACK,提交数据给上层 ACK,信道利用率=Ts/(Ts+2Tb),提交数据给上层 发ACK
20、,B,A,没收到帧,Ts(发送时延),Tb(传播时延),Tb(传播时延),收到NAK 发旧帧,提交数据给上层 发ACK,Tout(超时时延)Tout6Tb,丢弃数据 发ACK,超时 发旧帧,帧出错 发NAK,超时 发旧帧,ARQ“协议” 停等“协议”信道利用率 传播时延Tb发送时延Ts,信道利用率很低 例如:发送速率=10Mbps, Tb=10Ts, 则:信道利用率= Ts/(Ts+2Tb)=1/215%,即实际有效速率不到0.5Mbps 解决方法在等待确认期间继续发送后续数据帧(分组) 给帧编号 确认(ACK/NAK)中有确认的帧序号 发送后的帧F(n)在ACK(n)到达前都要保留在发送缓存
21、中 接收方要有足够的缓存 ARQ(Automatic Repeat reQuest,自动重发请求),连续ARQ (Go-back N) 发送方可连续发送多个数据帧;根据接收方的应答序号N,重发出错的序号为N及以后发过的所有帧 发送方的操作 帧缓冲区缓存所有已发送但未被确认的数据帧 对每个发送的帧,启动和维护相应的“超时定时器” 发送方控制的序号表队列:多个已发送等待应答的序号 发新帧后,帧序号入队列到“序号表”队尾 收到正应答,应答序号 从“序号表”队首出队列,接收方的操作 帧接收缓存 接收帧序号控制 收到待接收的一个帧,序号退出“序号表”,后续帧序号进入“序号表” 校验和序号正确的帧,数据被
22、交付上层,错误丢弃帧 帧出错 帧丢失 应答丢失,三、TCP 可靠通信的具体实现 滑动的字节序号窗口全双工的TCP 连接的每一端都有两个窗口一个发送窗口和一个接收窗口 TCP 所有的确认针对报文中字节序号 连接建立时协商报文中的数据字节序号 接收方采用累积确认,减小传输开销 可对按序到达的最后一个报文发送确认,表示:到这个报文为止的所有报文都已正确收到了 不能反映出接收方已经正确收到的所有报文的信息,发送缓存与接收缓存 每个报文中的“窗口通告”接收缓存的大小动态变化 发送缓存。暂时存放发送应用程序传送给发送方 TCP 准备发送的数据TCP 已发送出但尚未收到确认的数据 接收缓存。暂时存放按序到达
23、的、但尚未被接收应用程序读取的数据不按序到达的数据,超时重传机制 根据多次的往返时间 RTT(=2Tb), 用特定的算法估算较为合理的超时重传时间。,序号与长度:数据的开始字节序号及字节数 确认号:希望接收数据的起始字节序号 超时重发 SRTTi+1= RTTi+1+(1-)SRTTi1 (非重发, = 7/8;重发, = 0) RTO= SRTTi+1 , 2 SRTT:平均往返延时 RTT:往返延时 RTO:超时时间 流控 采用滑动窗口,“窗口通告”为字节数 拥塞控制 用SRTT度量拥塞 多种拥塞控制策略(慢启动、加速递减、拥塞避免),五、TCP的连接管理,TCP的连接管理三次握手,3-W
24、ay Handshake 1、建立TCP连接 第1次握手TCP报文:本地进程创建连接(SYN,起始字节序号X) 第2次握手TCP报文:远程进程确认同时亦请求连接(ACK,从字节序号X+1开始接收,SYN,起始字节序号Y) 第3次握手TCP报文:本地进程确认( ACK,从字节序号Y+1开始接收),SYN(=1),序号=1000,ACK(=1),确认号=1001 SYN(=1),序号=2500,ACK(=1),确认号=2501,192.168.0.200 202.118.120.8:SYN,202.118.120.8 192.168.0.200 :ACK+SYN,192.168.0.200 202
25、.118.120.8 :ACK,2、关闭TCP连接,本地进程关闭连接(FIN,停发字节序号X以后的数据) 远程进程确认(ACK,字节序号X+1起不接收,延时接收字节序号X及以前应接收的数据并应答) 远程进程关闭连接(FIN,停发字节序号Y) 本地确认(ACK,字节序号Y+1起不接收,延时接收字节序号Y及以前应接收的数据并应答),FIN(=1),序号=6200, 不发此序号后的字节,ACK(=1),确认号=6201,不接受此序号及以后的字节,ACK(=1),确认号=7101,不接受此序号后的字节,FIN(=1),序号=7100 ,不发送此序号及以后的字节,192.168.0.200 202.11
26、8.120.8 :FIN+ACK,202.118.120.8 192.168.0.200 :ACK,3、连接管理是完备的,科学家已证明:三次握手是在包丢失、重复和延迟的情况下确保非模糊协定的充要条件。可靠的连接建立(Reliable Connection Startup ) 完美的连接终止(Graceful Connection Shutdown ),TCP、UDP与IP的层次依赖关系,TCP,UDP,SNMP,DNS,TFTP,BootP,SMTP,FTP,HTTP,TELNET,5.6 运输层编程接口,一、SOCKET(插口)概念 UNIX I/O“打开-读/写-关闭(open-read/
27、write-close)” 通信之前向操作系统申请生成一个Socket 系统返回该Socket 描述符(ID) UNIX:SOCKET与其他I/O 集成在一起二、 SOCKET工作方式 阻塞方式 调用后,等待返回结果,三、SOCKET函数/命令,Socket :创建SOCKET,返回整型描述符 descriptor = socket (protofamily ,type ,protocol ) Close:终止一个SOCKET close (socket )(closesocket) Bind:给SOCKET指定地址和端口号 bind (socket ,localaddr ,addrlen )
28、 Listen:被动模式等待Client的通信(侦听端口) listen (socket ,queuesize ),Accept:接受连接请求 newsock = accept (socket ,caddress ,caddresslen ) Connect:与指定的Server(在侦听)建立连接 connect (socket ,saddress ,saddresslen ) Send 、Sendto 与Sendmsg:向SOCKET运输数据 Recv 、Recvfrom 与Recvmsg:从SOCKET接收数据 read 和write:I/O操作,四、WinSock(类/控件),属性(成员
29、变量) 方法(成员函数) 事件(向系统发送) (异步工作方式 / 异步通信机制),1、WinSock的异步事件(VB),Winsock1_Close() Winsock1_Connect() Winsock1_ConnectionRequest(ByVal requestID As Long) Winsock1_DataArrival(ByVal bytesTotal As Long) Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As Strin
30、g, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean) Winsock1_SendComplete() Winsock1_SendProgress(ByVal bytesSent As Long, ByVal bytesRemaining As Long),2、WinSock的方法(VB),Winsock1.Accept Winsock1.Bind Winsock1.Close Winsock1.Connect Winsock1.GetData Winsock1.Listen Winsock1.PeekData Winsock1.SendData,3、WinSock的属性(VB),Winsock1.BytesReceived Winsock1.LocalHostName Winsock1.LocalIP Winsock1.LocalPort Winsock1.Protocol Winsock1.RemoteHost Winsock1.RemotePort Winsock1.RemoteHostIP Winsock1.State,