运输层向它上面的应用层提供通信服务. 两个主机进行通信就是两个主机中的应用进程互相通信. 从运输层的角度看, 通信的真正端点并不是主机而是主机的进程. 运输层提供应用进程间的逻辑通信. 运输层之间的通信好像是沿水平方向传输数据.但事实上这两个运输层之间并没有一条水平方向的物理连接.要传送的数据是沿着图中的虚线向(经过多个层次)传送的 .
5.1 运输层协议概述
5.1.1 进程之间的通信
- 网络层是为了主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信.
- 运输层向高层用户屏蔽了下面网络核心的细节,它使应用进程看见的就是好像在两个运输层实体之间有一条端到端的逻辑通信信道.
- 当运输层采用面向连接的TCP协议时,尽管下面的网络是不可靠的,但这种逻辑通信信道就相当于一条全双工的可信信道.
- 采用UDP协议时,这种逻辑通信信道仍然是一条不可靠信道.
5.1.2 运输层的两个主要协议.
- UDP(User Datagram Protocol)[RFC 768]
- TCP(Transmission Control Protocol)[RFC793] UDP在传送数据之间不需要先建立连接. TCP 提供面向连接的服务.
5.1.3 运输层的端口.
通过端口解决通信的目的地.虽然通信的终点是应用进程,但我们只要把要传送的报文交到目的主机的某一个合适的目的端口,剩下的工作(即最后交付给目的进程)就由TCP来完成. 在协议栈层间的抽象的协议端口是软件端口,软件端口是应用层的各种协议进程与运输试题进行层间交换的一种地址 . 端口号只具有本地意义.
5.2 UDP
5.2.1 UDP概述
- 无连接
- 尽最大努力交付.
- 面向报文.
- 没有拥塞控制.
- 支持1对1,1对n,n-1和n-n交互通信.
- 首部开销小. 只有8个字节.
5.2.2 UDP的首部格式
- 源端口
- 目的端口
- 长度
- 校验和
5.3 TCP
5.3.1 TCP最主要的特点 TCP 是TCP/IP体系中非常复杂的一个协议.
- 面向连接的运输层协议.也就是说,应用程序在使用TCP协议之前,必须先建立TCP连接.在传送数据完毕后,必须释放已经建立的TCP连接.
- 每一条TCP连接只能有两个端点(endpoint),每一条TCP连接只能是点对点.
- TCP提供可靠交付的服务.
- TCP提供全双工通信. TCP允许通信双方的应用进程在任何时候都能发送数据.TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据.在发送时,应用程序在把数据传送给TCP的缓存后,就可以做自己的事,而TCP在合适的时候吧数据发送出去.在接受时,TCP把收到的数据放在缓存,上层的应用进程在合适的时候读取缓存中的数据.
- 面向字节流. TCP中的流(stream指的是流入到进程或从进程流出的字节序列. 虽然应用程序和TCP的交互是一次一个数据块(大小不等),但TCP把应用程序叫下来的数据看成仅仅是一连串的 无结构的字节流. TCP并不知道所传送的字节流的含义.TCP不保证接收方应用程序锁收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系(例如,发送方应用程序交给发送方的TCP供10个数据块,但接收方的TCP可能只用了4个数据块就把收到的字节流交付给了上层的应用程序).但接收方应用程序收到的字节流必须和发送方应用程序发送的字节流完全一样.当然接收方的应用程序必须有能力识别收到的字节流,把它还原成有意义的应用层数据.
5.3.2 TCP的连接
TCP把连接作为最基本的抽象. 每一条TCP连接有两个端点. TCP 连接的端点叫做套接字(socket)或者插口. 根据RFC793的定义:端口号拼接到(conatenated with)IP地址即构成了套接字.
5.4 可靠传输的工作原理
理想的传输条件有以下两个特点:
- 传输信道不产生差错.
- 不管发送方以多快的速度发送数据,接收方总是来得及处理收到的数据. 在以上理想传输条件下,不需要采取任何措施就能够实现可靠传输
5.4.1 停止等待协议
- 无差错情况.
- 出现差错情况.
- 确认丢失和确认迟到
- 信道利用率
5.4.1 连续ARQ协议
滑动窗口协议比较复杂,是TCP协议的精髓所在.
5.5 TCP报文段的首部格式.
TCP虽然是面向字节流的,但TCP传送的数据单元确实报文段.一个TCP报文段分为首部和数据两个部分.
首部不顶部分个字段的意义
- 源端口和目的端口
- 序号
- 确认号
- 数据便宜
- 保留
- 紧急URG
- 确认ACK
- 推送PSH
- 复位RST
- 同步SYN
- 终止FIN
- 窗口
- 校验和
- 紧急指针
- 选项
5.6 TCP可靠传输的实现
5.6.1 以字节为单位的滑动窗口
5.6.2 超时重传时间的选择
TCP采用自适应算法,记录一个报文段发出的时间,以及受到相应的确认的时间.这两个时间之差就是报文段的往返时间RTT.TCP保留了RTT的一个加权平均往返时间RTTs.
5.6.3选择确认SACK
5.7TCP的流量控制
5.7.1 利用滑动窗口实现流量控制.
流量控制(flow control)就是让发送方的发送速率不要太快,要让接收方来得及接受. 发送方的发送窗口不能超过接收方给出的接受窗口的数值.
5.9TCP的运输连接管理
连接建立,数据传送 连接释放. TCP连接建立过程中要解决以下三个问题:
- 要使每一方能够确知对方的存在.
- 要允许双方协商一些参数(如最大窗口值,是否使用窗口扩大选项和时间戳选项及服务质量等)
- 能够对运输实体资源(如缓存大小,连接表中的项目等)进行分配. TCP连接的建立采用客户服务器方式.主动发起连接建立的应用进程叫做客户(client).而被动等待连接建立的应用进程叫做服务器(server).
5.9.1 TCP连接的建立
为什么A还要发送一次确认呢,这主要是为了防止已失效的连接请求报文段突然又传送到了B,而产生错误. A发出的第一个连接请求报文没有丢失,滞留在网络上,延误到连接释放以后的某个时间才到达B.本来这个是早已失效的报文段.但是B收到此失效的连接请求报文段后,就误认为是A有发出一次新的连接请求.于是就向A发出确认报文段,同意建立连接.假定不采用三次握手,那么只要B发出确认,新的连接就建立了. 由于现在A并没有发出建立连接的请求,因此不会理财B的确认.也不会向B发送数据.但是B却以为新的运输连接已经建立了,并一直等待A发送数据.B的许多资源就这样白白浪费的.
5.9.2TCP的连接释放
数据传输结束后,通信的双方都可释放连接.