#### 第7章: #### 传输层 #### 7.1 传输层的基本功能 传输层既是面向通信的最高层,又是用户功能的最低层。在通信网络的路由器中只用到了下三层的功能,只有在主机的协议栈中才有传输层。 传输层的基本功能是利用通信子网为两台主机的应用进程之间提供 `端---端` 的性能可靠,价格合理、透明传输的通信服务。 :-: ![](https://img.kancloud.cn/22/23/2223dcfe4258eeca09e069706b798ea4_977x485.png) 传输层提供端-端通信服务 上图表示传输层为应用进程(AP1~AP4)之间提供逻辑通信。(包括AP1、AP2之间以及AP1AP2和AP3AP4之间)。所谓“逻辑通信”指应用进程的报文交给传输层后,传输层似乎是沿着水平方向直接传送到远地的传输层,但事实上应用进程之间并没有这一水平的物理连接,被传送的数据实际上是沿着图中细线方向经过传输层以下各层及通信网络来传送的。 AP1与AP3通信的同时AP2与AP4也在通信。说明传输层同时支持多个进程的连接,具有`复用`和`分用`的功能。 传输层还具有`流量控制`、`拥塞控制`、`差错控制`,既要负责报文`无差错`、`不丢失`、`不重复`,还要保证报文的`顺序性`。 ##### 传输层的协议 因特网有两个传输协议: `UDP无连接的用户数据报协议(UDP用户数据报)`,传输数据前不必建立连接,远程计算机不需要给确认信息。 `TCP面向连接的传输控制协议(TCP报文段)`,传送数据前必须先建立连接,传送完释放资源。由于提供可靠的、面向连接的传输服务,它比UDP要花费更多开销,占用更多处理资源。 当采用面向连接的TCP协议时,尽管下面的网络层是不可靠的(只提供尽最大努力的服务由网络层提供),这条逻辑通信信道仍然相当于一条全双工可靠的信道。 当采用无连接的UDP协议时,这条逻辑通信信道则是一条不可靠信道。 :-: ![](https://img.kancloud.cn/5d/e8/5de82e7b0b67a2009aba05fa55223477_944x377.png) TCP/IP体系中传输层协议与相邻层协议之间的关系 ##### 传输层的端口 传输层与网路层最大的区别是传输层提供了进程通信的能力(端-端通信)。计算机的进程是用进程标识符来标志的。不同的操作系统使用不同的格式的进程标识符,因此各种应用进程不应当采用由计算机操作系统所指派的进程标识符,必须使用统一的方法对TCP/IP的应用进程进行标识。 在TCP/IP体系中,解决上述问题的方法就是在传输层使用协议端口号(传输层的服务访问点TSAP),简称为`端口`。应用层的各种进程都是通过相应的端口与传输实体进行交互的。传输层对每个端口都赋予一个16位(二进制)的端口号。这个端口号只具有本地意义。由于TCP和UDP是彼此独立的两个软件模块,它们的端口号允许相同。 :-: ![](https://img.kancloud.cn/ae/a3/aea308cda6418c2ebc3e696c1685f4ac_400x434.png) 端口在进程通信中的作用 传输层的端口号可分为两大类: 1. 服务器使用的端口号(熟知端口号),0-1023. 例如: Echo 7;FTP 20;FTP 21;TELNET 23;SMTP 25;DNS 53;TFTP 69; HTTP 80; POP3 110; SNMP 161;SNMP 162;BGP 179; RIP 520······· 2. 客户端使用的端口号(或称为临时端口号),其数值为49152~65535。此类端口供客户进程运行时临时选择使用。当客户进程需要传输服务时,可向本地操作系统动态申请,操作系统随记返回一个本地唯一的端口号。一旦通信结束,收回此端口号供其他客户进程使用。 #### 7.2 UDP 用户数据报协议UDP只在网际协议IP的基础上增加了复用/分用的功能和差错检测功能,为网络用户提供高效率的数据传输服务。 UDP有以下特点: 1. UDP是无连接的,没有建立连接和释放连接的过程。 2. UDP只能尽最大努力交付,提供不可靠的传输服务。对出现差错的报文进行丢弃处理。 3. UDP是面向报文的,与应用层交付的是完整的报文,既不合并,也不拆分,保留原始的报文边界。因此,应用层必须选择合适的报文长度,以免在IP层进行分片工作,从而降低IP层的效率。 4. UDP没有拥塞控制的功能。即使网络拥塞也不会使源主机降低发送速率,宁愿丢失数据,也不允许传送的数据存在较大的时延,适合实时应用(IP电话、视频会议)。 5. UDP的首部简短只有8B(字节),减少了通信开销。 UDP报文由首部和数据字段两个部分组成。 :-: ![](https://img.kancloud.cn/fe/bc/febce1df6b49ea9f94b0cae093b52c35_658x335.png) UDP报文格式 首部字段由4个字段组成供8B(Byte字节): 1. 源端口16b(16比特位)。源主机的端口号 2. 目的端口16b(16比特位)。目的主机的端口号 3. 长度16b(16比特位)。指明包括首部在内的UDP报文的总长度。该字段的只是便于目的端的UDP从用户数据报提供的信息中计算出数据长度。 4. 校验和16b(16个比特位)。用于校验UDP报文在传输中是否存在差错。校验范围是整个UDP报文(包括首部和数据)。 5. 伪首部不是UDP报文的真正首部,只是在计算校验和时,临时性地与UDP报文拼接在一起,构成一个临时性的UDP报文。 #### 7.3 TCP TCP的主要特点: 1. 面向连接的。应用进程间进行通信必须建立连接,数据传输、释放连接。 2. 应用进程间通信通过TCP连接来进行的。每条TCP有2端点,只能实现`点--点`的通信。 3. TCP提供可靠交付的服务。也就是通过TCP连接传输的数据,不存在`差错`、`丢失`和`重复`现象,能按序到达目的端。 4. TCP提供全双工通信。TCP允许通信双方的用户进程同时发送数据。在连接两端都设有发送缓存和接收缓存,缓存是发送(或接收)数据的临时存放点。 5. TCP是面向字节流的。"面向字节流"的含义是:TCP把应用层下传给传输层的数据块看成是一串无结构的字节序列流。它不保证发送端和接收端的数据块大小一样,但保证接收端应用进程收到的字节流与发送端发出的字节流是完全一样的。(想象端和端之间有一条管道) ##### TCP连接 每条TCP连接有两个端点。TCP连接的这个端点称为套接字或插口。根据RFC 793的定义:`端口号拼接到IP地址即构成了套接字`。 `套接字:: = (IP地址:端口号)` 例如IP地址是130.8.16.86,端口号是80,那么得到的套接字就是(130.8.16.86:80)。 每一条TCP连接可用通信两端的两个端点(两个套接字)来标识 `TCP连接:: = {socket1,socket2} = {(IP1:port1),(IP2:port2)}` 所以,TCP连接是协议软件所提供的一种抽象,是为两个进程之间通信而建立的一条TCP连接,其端点是套接字,即(IP地址:端口号)。基于传输层有支持多个进程通信的功能,同一个IP地址可以有多条不同的TCP连接,而同一个端口号也可以出现在多个不同的TCP连接中。 ##### TCP报文格式 TCP把所使用的传输协议数据单元(TPDU)称为TCP报文段。一个TCP报文段由首部和数据两个部分组成。 :-: ![](https://img.kancloud.cn/69/62/6962a794475710f4fbfd6876c0dadec3_1700x440.png) TCP报文段的格式 首部由`基本部分20B`和`选项(4N字节,N为整数)组成。基本部分含义如下` 1. 源端口(16b)和目的端口(16b)。两个字段分别填入发送该报文段应用程序的源端口号和接收该报文段的应用程序的目的端口号。 2. 序列号(32b)。标识本报文段所发送的字节流第一个字节的序号。(除了SYN标志被置位的情况)。例如该报文段的序列号为101,所携带的数据为200B,则最后一个字节的序列号应为300。下个报文段的序列号则应从301开始。建立连接时,通信双方都使用随机器产生的初始序列号。 3. 确认号(32b)。表示期望收到对方下一个报文的第一个数据字节的序号。例如接收端已经收到序列号为101,数据为200B。下一个序列号应该是301开始,则接收端发送的确认报文中将确认号字段设置为301。 4. 数据偏移(又称TCP首部长度,4b)。它指出首部的长度,即数据部分离本报文段开始的偏移量。数据偏移字段为4b所对应的最大十进制为15。首部长度以32b为单位。因此此数据的最大偏移量是60B,选项长度不超过40(有固定长度20B)。(这里的15对应60字节长) 5. 保留(6b)。留待后用。 6. 标志(6b)。又称为控制字段,其中每一位都具有特定的控制意义。用于TCP的流量控制、连接建立和释放以及数据传送等方面。 1. 紧急URG。表示本报文端中数据的紧急程度。URG=1表示后面的紧急指针字段有效,说明本报文具有高优先级,应该尽快发送。接收端收到URG=1会利用紧急指针的值从报文段中提取紧急数据,不再按顺序将它交给应用程序。 2. 确认ACK。仅当ACK=1时,确认号字段才有意义, 3. 推送PSH。PSH=1表示接收端TCP应该将本报文段立即推送到应用层。 4. 复位RST。RST=1表示TCP连接中出现了严重错误,必须立即释放传输连接,而后再重连。 5. 同步SYN。该位再连接建立时候使用,起着序号同步的作用。 6. 终止FIN。用来释放一个连接。FIN=1表达与发送的数据已发送完毕,要求释放传输连接。 7. 窗口。用于流量控制。 8. 校验和。该字段的校验范围是整个报文段(首部和数据)。 9. 紧急指针。当URG=1是才有意义,指出紧急数据末尾在报文段的位置。 10. 选项和可变。 ##### TCP传输控制机制 1. 可靠传输 1)停止等待协议 2)连续ARQ(流水线分组传输,每个分组开启超时计时器配合停等协议) 2. 序号确认 3. 流量控制(传输方希望快速传输,但一定使得接收方能够来得及接收,利用`滑动窗口`实现流量控制) 4. 发送控制 5. 重传控制 ##### TCP拥塞控制 网络拥塞的条件表示为 `∑对资源的需求>可用资源` TCP采用拥塞控制的方法: 1. 慢启动和拥塞避免 每一个TCP连接需要设定两个窗口变量 1. 接收端窗口(接收端的流量控制) 2. 拥塞窗口(发送端的流量控制) 慢启动算法的基本思想:当创建或打开一个连接时,传输实体将”拥塞窗口“初始化为1。也就是值允许发送一个报文段,在传送第二个报文段之前等待确认应答的到来。以后每次接收到报文段的应答,将窗口值增加1(实际上是2的指数规律增长)。出现超时后将拥塞窗口降到1。 实际上是: 1)设慢启动的门限值为ssthresh为出现拥塞时发送窗口值的一半。 2)设置cwnd=1,并执行慢启动的过程,直到cwnd=ssthresh。 3)当cwnd>=ssthresh时,则每一个往返时延RTT就对cwnd加1,使得cwnd按线性增长。 2. 快重传和快恢复。 ##### 连接和释放 建立连接:三次握手 1)主机A向主机B发出连接请求 2)主机B向主机A发出确认连接请求 3)主机A向主机B发出确认 释放连接:四次挥手 1)主机A发送数据并主动关闭向主机B发送释放请求 2)主机B仍可发送数据,并通知应用层进程(半关闭状态) 3) 主机B被动关闭,不再发送数据,向主机A发送连接释放 4) 主机A向主机B发出确认释放