1. 运输层概述
进程间的通信
从通信和信息处理的角度看,运输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,也是用户功能中的最低层。
通信的真正端点不是主机而是主机中的进程。网络层为主机之间提供逻辑通信,运输层提供应用进程间端到端的逻辑通信。
运输层的两个主要协议
两个对等运输实体在通信时传送的数据单元叫做运输协议数据单元。
用户数据报协议 UDP:一个数据包就能完成数据通信,不建立会话,支持多播。
- 传送的协议数据单元是 TCP 报文段
传输控制协议 TCP:提供可靠的、面向连接的服务,分段传输、编号、流量控制、建立会话,增加了很多开销,比如:确认、流量控制、计时器及连接管理。
- 传送的协议数据单元是 UDP 报文或用户数据报
TCP/IP 体系中的运输层协议
运输层的端口
在协议栈层间的抽象的协议端口是软件端口,和硬件端口是完全不同的。硬件端口是不同硬件设备进行交互的端口,而软件端口是应用间的各种协议进程与运输实体进行层间交互的一种地址。
服务器端使用的端口
分为两类:
一类是熟知端口号或者说系统端口号,常用的熟知端口号有:
| 应用程序 | FTP | TELNET | SMTP | DNS | TFTP | HTTP | SNMP | SNMP(trap) | HTTPS |
| - | - | - | - | - | - | - | - | - | - |
| 熟知端口号 | 21 | 23 | 25 | 53 | 69 | 80 | 161 | 162 | 443 |
另一类叫做登记端口号,数值在 1024~65535
客户端使用的端口号
数值是 49152~65535,又称为短暂端口号。
查看自己计算机侦听的端口:netstat -an
测试远程计算机打开的端口:telnet IP 地址
2. 用户数据报协议 UDP
2.1 UDP 概述
- UDP 是无连接的;
- UDP 使用尽最大努力交付;
- UDP 是面向报文的;
- UDP 没有拥塞控制;
- UDP 支持一对一、一对多、多对一和多对多的交互通信;
- UDP 的首部开销小,只有 8 个字节,比 TCP 的 20 个字节的首部要短。
UDP 的首部格式
用户数据报 UDP 有两个字段:数据字段和首部字段。首部字段很简单,只有 8 个字节,由四个字段组成,每个字段的长度都是两个字节。各字段有:
- 源端口:在需要对方回信时选用。不需要时可用全 0;
- 目的端口:这在终点交付报文时必须使用;
- 长度:用户数据报的长度,最小值是 8;
- 检验和:检测 UDP 用户数据报在传输中是否有错。有错就丢弃。
3. 传输控制协议 TCP 概述
TCP 最主要的特点
- TCP 是面向连接的运输层协议;
- 每一条 TCP 连接只能有两个端点,每一条 TCP 连接只能是点对点的;
- TCP 提供可靠交付的服务;
- TCP 提供全双工通信;
- 面向字节流。TCP 中的“流”指的是流入到进程或从进程流出的字节序列。
TCP 的连接
TCP 把连接作为最基本的抽象
每一条 TCP 连接有两个端点。TCP 连接的端点不是主机、IP 地址、应用程序,而是套接字。
套接字 socket=(IP 地址:端口号)
TCP 连接::={socket, socket}={(IP1: port1), (IP2: port2)}
4. 可靠传输的工作原理
停止等待协议
确认丢失和确认迟到
使用上述的确认和重传机制,我们就可以在不可靠的传输网络上实现可靠的通信。这种可靠传输协议常称为自动重传请求 ARQ。
ARQ 表明重传的请求是自动进行的。接收方不需要请求发送方重传某个出错的分组。
信道利用率
停止等待协议的优点是简单,但是缺点是信道利用率太低。
信道利用率 U=TD/TD+RTT+TA。
流水线传输
发送方可连续发送多个分组,不必每发完一个分组就停顿下来等待对方的确认。
由于信道上一直有数据不间断地传送,这种传输方式可获得很高的信道利用率。
连续 ARQ 协议
5. TCP 报文段的首部格式
TCP 报文首部的前 20 个字节是固定的。
- 源端口和目的端口:各占 2 字节
- 序号:占 4 字节,共 2 的 32 次方个序号,范围是[0, 2 的 32 次方]。在一个 TCP 连接中传送的字节流中的每一个字节都按顺序编号。首部的序号字段值则指的是本报文段所发送的数据的第一个字节的序号。
- 确认号:占 4 个字节,是期望收到对方下一个报文段的第一个数据字节的序号。
- 数据偏移:占 4 位,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远,实际就是 TCP 报文段的首部长度。数据偏移的单位是 32 位字(即 4 字节的字为单位),4 位二进制最大能表示的十进制是 15,因此数据偏移最大值是 60。
- 保留:占 6 位,保留今后使用。
- 紧急 URG:当 URG=1 时,表明紧急指针字段有效。告诉系统此报文段是否有紧急数据,应尽快传送。
- 确认 ACK:当 ACK=1 时确认号有效。TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置 1。
- 推送:通信时,有时希望在一端进行一个操作后就立即收到对方的响应,这种情况就可以使用推送(push)操作。接收方收到 PSH=1 的报文段,就尽快地交付接收应用进程,不再等整个缓存都填满了再向上交付。
- 复位 RST:当 RST=1 时,表明 TCP 连接中出现了严重错误,必须释放连接,然后再重新建立运输连接。
- 同步 SYN:在连接建立时用来同步序号。当 SYN=1 而 ACK=0 时,表明这是一个连接请求报文段。
- 窗口:占 2 字节。窗口指的是发送本报文段的一方的接收窗口。告诉对方从报文段首部的确认号算起,接收方允许对方发送的数据量。窗口值作为接收方让发送方设置其发送窗口的依据。
- 检验和:占 2 字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部,把伪首部第 4 个字段的 17 改成 6(因为 TCP 的协议号是 6),把第 5 字段的 UDP 长度改成 TCP 长度。
- 紧急指针:占 2 字节。紧急指针只有在 URG=1 时才有意义,指出本报文段中紧急数据的字节数。
- 选项:长度可变,最长可达 40 字节。TCP 最初规定了一个选项:最大报文段长度MSS,是每一个 TCP 报文段中的数据字段的最大长度。
6. TCP 可靠传输的实现
发送缓存用来暂时存放
- 发送应用程序传送到发送方 TCP 准备发送的数据;
- TCP 已发送但尚未收到确认的数据。
接收缓存用来暂时存放
- 按序到达的、但尚未被接收应用程序读取的数据;
- 未按序到达的数据。
以字节为单位的滑动窗口
重传时间的选择
TCP 采用了一种自适应算法,记录一个报文段发出的时间,以及收到相应确认的时间。这两个时间差就是报文段的往返时间 RTT。TCP 保留了 RTT 的一个加权平均往返时间 RTTs(平滑的往返时间)。
新的 RTTs=(1 - a)*(旧的 RTTs)+a+(+(新的 RTT 样本)
超时计时器设置的超时重传时间 RTO应略大于上面得出的加权平均往返时间 RTTs。RFC6298 建议使用下式计算 RTO:
RTO=RTTs+4*RTTD
Karn 提出了一个算法:在计算加权平均 RTTs 时,只要报文段重传了,就不采用其往返时间样本。这样得出的加权平均 RTTs 和 RTO 就较准确。
7. TCP 的流量控制
所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。
发送方的发送窗口不能超过接收方给出的接收窗口的数值。TCP 的窗口单位是字节,不是报文段。
利用可变窗口进行流量控制
8. TCP 的拥塞控制
在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这种情况就叫做拥塞。即对资源的需求 > 可用资源
网络拥塞往往是由多种因素引起的。例如,当某个结点缓存的容量太小时,到达该结点的分组因无存储空间暂存而不得不丢弃。
拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。并且拥塞是一个全局性的过程。流量控制往往是指点对点通信量的控制,是一个端到端的问题。
下图中横坐标是提供的负载,表示单位时间内输入网络的分组数目。纵坐标是吞吐量,表示单位时间内从网络输出的分组数目。
拥塞控制所起的作用
发送方维持一个 拥塞窗口 cwnd:
- 只要网络没有出现拥塞,拥塞窗口就在增大一些,以便更多的分组发送出去;
- 只要网络出现拥塞,拥塞窗口就减小一些,以减少注入网络中的分组数。
慢开始算法的原理
慢开始和拥塞避免算法的实现
慢开始门限的初始值设置为 16 个报文段,即 ssthresh=16
但是“拥塞避免”并非指完全能够避免了拥塞,只是在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。
快重传
当接收方发现没有按顺序接收时,就判断出现了丢包现象,有可能出现了拥塞,立即通知发送方重新发送,连续发送三个重复的确认。
从连续收到三个重复的确认转入拥塞避免
一旦出现了拥塞,发送方调整门限值,ssthresh=cwnd/2,拥塞窗口直接从新的慢开始门限开始加法增加,即设置拥塞窗口 cwnd=ssthresh,这就是快恢复。
发送方的发送窗口的上限值应当取为接收方窗口 rwnd 和拥塞窗口 cwnd 这两个变量中较小的一个,即应按以下公式确认:发送窗口的上限值 =Min[rwnd, cwnd]
最简单的情况下,路由器的队列通常是按照“先进先出”的规则处理到来的分组。
为了避免发生网络中的全局同步现象,1998 年提出了主动队列管理 AQM。所谓“主动”就是不要等到路由器的队列长度已经达到最大值时才不得不丢弃后面到达的分组。可以有不同的时限方法,可以使用随机早期检测 RED。
9. TCP 的传输连接管理
运输连接有三个阶段,即连接建立、数据传送、连接释放。运输连接的管理就是使运输连接的建立和释放都能正常地进行。
TCP 连接的建立采用客户服务器方式。主动发起连接建立的应用进程叫做客户,而被动等待连接建立的应用进程叫做服务器。
TCP 的连接建立:三次握手
例如:
三次握手建立 TCP 连接的各状态
TCP 连接释放:四次挥手
释放连接的各状态(TCP 连接必须经过时间 2MSL 后才真正释放掉)