计算机网络Chap5-传输层
1. 运输层协议概述
1.1 网络层提供的两种服务
传输层向上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能中的最低层。
只有位于网络边缘部分的主机的协议栈才有运输层,而网络核心部分中的路由器在转发分组时都只用到下面三层的功能。

我们知道IP协议可以把源主机A发送出的分组,按照首部中的目的地址交付给主机B,那么为什么还需要传输层呢?
对于IP层来说,通信的两端是两台主机。
虽然IP协议能把分组送到目的主机,但分组还停留在主机的网络层,没有交付到主机中的应用进程。
但是真正进行通信的实体是主机中的应用进程,应该是一台主机中的应用进程和另一台主机中的应用进程在交换数据。
对于传输层来说,通信的两端是应用进程AP(Application procedure)。且经常是一台主机中的多个应用进程和另一台主机中的多个应用进程进行通信。
运输层的功能:复用和分用。(可以想象一个公司的收发室的功能)
- 复用:发送方不同的应用进程都可以用同一个运输层协议传送数据
- 分用:当接收方的运输层在剥去报文首部后能将数据正确交付目的应用进程
所以运输层提供应用进程间的逻辑通信。它向高层用户屏蔽了下面网络核心的细节,使应用进程看见的就好像在两个传输层实体中间有条端到端的逻辑通信信道。
但是这条逻辑通信信道对上层的表现却因传输层使用的不同的协议而有很大差异。
1.2 运输层的两个主要协议
根据应用程序的不同需求,运输层有两种不同的运输协议:
- 面向连接的TCP协议:传输控制协议TCP(Transmission Control Protocol),尽管下面的网络是不可靠的,但这种逻辑通信信道就相当于一条全双工的可靠信道
- 无连接的UDP协议:用户数据报协议UDP( User Datagram Protocol),这种逻辑通信信道仍然是一条不可靠信道
在OSI中,两个对等的运输实体在通信时传送的数据单位叫运输协议数据单元TPDU,但是在TCP/IP体系中,根据所使用的协议的不同,分别称为TCP报文段或UDP报文/用户数据报
UDP和TCP的比较:

TCP面向连接:在传送数据之前必须先建立连接,等数据传送结束后释放连接。
UDP无连接:传送数据前不需要建立连接,目的主机收到UDP报文后也不需要给出确认。
使用UDP和TCP的典型应用和应用层协议

1.3 运输层的端口
在单个计算机中的进程是用进程标识符来标志的,但是在互联网上使用的计算机的操作系统种类很多且都有不同格式的进程标识符。
为了使不同操作系统的计算机的应用进程都能够互相通信,就有了在运输层使用协议端口号(端口)来标志本计算机应用层中的各进程。
端口号仅在本地有意义,不同计算机的相同端口号都是没有联系的。(16位 )
所以,两个计算机中的进程互相通信,不仅需要知道对方的IP地址(找到目的主机),还需要知道端口号(找到目的进程)。
因为互联上的计算机通信是客户-服务器方式。
所以运输层的端口号分为以下两类:
- 服务器端使用的端口号:
- 熟知端口号(全球通用端口号):0-1023
- 登记端口号:1024 - 49151
- 客户端使用的端口号:短暂端口号, 49152 - 65535
2. 用户数据报协议UDP
2.1 UDP概述
用户数据报协议UDP只在IP的数据报服务上增加了很少的一点功能:
- 复用和分用
- 差错检测
UDP的主要特点:
- 无连接
- UDP使用尽最大努力交付
- 面向报文:对应用层交下来的报文既不合并也不拆分。一次交付一个完整的报文。也就是说应用层交给UDP多长的报文,UDP就照样发送,一次发送一个报文
- 没有拥塞控制
- UDP支持一对一、一对多、多对一和多对多的交互通信
- 首部开销小:只有8字节(TCP20字节)
2.2 UDP的首部格式
用户数据报UDP有两个字段:数据字段和首部字段。

其中,首部字段又有4个字段组成:
- 源端口:需要回信时选用,不需要可全0
- 目的端口
- 长度:整个UDP用户数据报的长度,最小位8(只有首部)
- 校验和:检验UDP用户数据报在传输中有没有错
3. 传输控制协议TCP概述
3.1 TCP最主要的特点
TCP是面向连接的运输层协议
每一条TCP连接只能有两个端点,也就是每一条TCP连接只能是点对点的
TCP提供可靠交付
TCP提供全双工通信
面向字节流:虽然应用程序和TCP交互式一次一个数据块,但TCP把应用程序交下来的数据看成仅仅式一连串无结构的字节流。

可以看出TCP和UDP在发送报文时所采用的方式完全不同。
TCP并不关心应用进程一次把多长的报文发送到TCP缓存中,而是根据对方给出的窗口值和当前网络的拥塞程度,来决定一个报文段应该包含多少个字节(而UDP发送的报文的长度则是由应用进程给出的)。如果应用进程给TCP缓存的数据块太长,TCP就可把它换分为短一点的数据块再传送;如果应用程序一次只发来一个字节,那么TCP也可以等待积累足够多的字节再构成报文段发送。
3.2 TCP的连接
上面说到每一条TCP连接有两个端点,那么连接的端点式什么呢?
TCP连接的端点是:套接字(插口)。
套接字就是端口号拼接到IP地址。socket = (IP地址:端口号) e.g. 192.169.1.20:2028
4. 可靠传输的工作原理
TCP发送的报文段是交给下面的IP层传送的,但是IP层只能提供尽最大努力服务,也就是TCP下面的网络所提供的是不可靠的传输。
因此,TCP必须采用适当的措施才能使得两个运输层之间的通信变得可靠。
4.1 停止等待协议
停止等待:每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。
无差错的情况下:

A发送分组M1,发送后就暂停等待B的确认。B收到了M1就向A发送确认,A收到了M1的确认后就再发送M2。
出现差错:
在接收方B这里会出现两种情况的差错:
- B接收M1时检测出了差错:丢弃M1,其他什么都不做
- M1在传输过程中丢失了:B什么都不知道也什么都不做
这两种情况下B都不会发送任何信息,那么为了实现可靠传输,就设计了超时重传。
超时重传:A在每发送一个分组时设置一个超时计时器,超过了这个时间没有收到确认就需要重传前面发过的分组M1
在发送方A这里会出现两种情况的差错:
B发送的对M1的确认丢失了:这时A在超时重传的时间内并没有收到确认,并不知道是自己的分组出错?丢失?还是B的确认丢失?这时就要重传M1。
此时,对于B来讲,应该丢弃这个重复的分组M1并且向A发送确认
传输过程中没有差错,但B对M1的确认超时了:A会收到重复的确认,直接丢弃
发送方A最终总是可以收到对所有发出的分组的确认。使用上述的确认和重传机制,我们就可以在不可靠传输的网络上实现可靠的通信。
像上述这种的可靠传输协议通常称为自动重传请求ARQ(Automatic Repeat reQuest),自动的意思是:重传这种行为是自动进行的,而不需要请求发送方重传某个出错的分组。
停止等待协议的优点是简单,缺点是信道利用率太低了
那么为了提高传输效率,发送方可以不使用低效率的停止等待协议,而是采用流水线传输。

当使用流水线传输时,就要用到连续ARQ协议和滑动窗口协议了。其中滑动窗口协议很复杂且是TCP协议的精髓。
4.2 连续ARQ协议

发送窗口:位于发送窗口内的分组都可以连续的发送出去,不需要对方的确认。这样信道利用率就提高了。
连续ARQ协议规定发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置;接收方一般采用累积确认的方式,也就是说在收到几个分组后对按序到达的最后一个分组发送确认来表示前面的分组都正确收到。如果中间的分组丢失了,接收方只能对前几个分组发出确认,发送方只能将后面n个再次重传,这就是回退N方法。

5. TCP报文段的首部格式
TCP报文段分为首部和数据两部分,而TCP的全部功能都体现在它首部中各字段的作用。
所以只有掌握TCP首部各字段的作用才能掌握TCP的工作原理。
TCP报文段首部的前20个字节是固定的。后面4n个字节是根据需要而添加的选项,所以TCP首部最小长度是20字节。

- 源端口和目的端口:各占2字节,和UDP分用相似,TCP的分用功能也是通过端口实现的。
- 序号:4字节,TCP连接中传送的数据流中每一个字节都是编号的。序号是指本报文段所发送的数据的第一个字节的序号。
- 确认号:4字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。
- 数据偏移:4位,是指TCP报文段中的数据的起始位置距离TCP报文段的起始位置有多远,也就是首部长度。
- 保留:6位
- 六个控制位:
- 紧急URG:URG=1时表示紧急指针字段有效
- 确认ACK:ACK=1时确认号字段有效
- 推送PSH:当TCP收到PSH=1的报文段,就尽快的交付应用进程。
- 复位RST:RST=1时表示TCP连接中出现严重差错必须释放连接再重新连接
- 同步SYN:SYN=1表示这是一个连接请求或连接接收
- 终止FIN:FIN=1表示发送端数据发送完毕,要求释放运输连接
- 窗口:2字节,指的是接收窗口,用来让对方设置其发送窗口的依据。窗口字段明确指出了现在允许对方发送的数据量,且动态变化
- 检验和:2字节,检验的范围包括首部和数据部分。和UDP一样,要在报文段前加上12字节的伪首部(仅为了计算校验和)
- 紧急指针:16位,指出紧急数据有多少字节
- 选项:长度可变
6. TCP可靠传输的实现
6.1 以字节为单位的滑动窗口
TCP的滑动窗口是以字节为单位的。
发送窗口表示: