第 5 章 运输层
5.1 运输层协议概述
5.1.1 进程之间的通信
5.1.2 运输层的两个主要协议
5.1.3 运输层的端口
5.2 用户数据报协议 UDP
5.2.1 UDP 概述
5.2.2 UDP 的首部格式
5.3 传输控制协议 TCP 概述
5.3.1 TCP 最主要的特点
5.3.2 TCP 的连接
5.4 可靠传输的工作原理
5.4.1 停止等待协议
5.4.2 连续 ARQ 协议
5.5 TCP 报文段的首部格式
5.6 TCP 可靠传输的实现
5.6.1 以字节为单位的滑动窗口
5.6.2 超时重传时间的选择
5.6.3 选择确认 SACK
5.7 TCP的流量控制
5.7.1 利用滑动窗口实现流量控制
5.7.1 必须考虑传输效率
5.8 TCP 的拥塞控制
5.8.1 拥塞控制的一般原理
5.8.2 几种拥塞控制方法
5.8.3 随机早期检测 RED
5.9 TCP 的运输连接管理
5.9.1 TCP 的连接建立
5.9.2 TCP 的连接释放
5.9.3 TCP 的有限状态机
运输层为相互通信的应用进程提供了逻辑通信
应用进程之间的通信
两个主机进行通信实际上就是两个主机中的应用进程互相通信。
应用进程之间的通信又称为端到端的通信。
运输层的一个很重要的功能就是复用和分用。应用层不同进程的报文通过不同的端口向下交到运输层,再往下就共用网络层提供的服务。
“运输层提供应用进程间的逻辑通信”。“逻辑通信”的意思是:运输层之间的通信好像是沿水平方向传送数据。但事实上这两个运输层之间并没有一条水平方向的物理连接。
* 运输层的主要功能
运输层为应用进程之间提供端到端的逻辑通信(但网络层是为主机之间提供逻辑通信)。
运输层还要对收到的报文进行差错检测。
运输层需要有两种不同的运输协议,即面向连接的 TCP 和无连接的 UDP。
* 两种不同的运输协议
运输层向高层用户屏蔽了下面网络核心的细节(如网络拓扑、所采用的路由选择协议等),它使应用进程看见的就是好像在两个运输层实体之间有一条端到端的逻辑通信信道。
当运输层采用面向连接的 TCP 协议时,尽管下面的网络是不可靠的(只提供尽最大努力服务),但这种逻辑通信信道就相当于一条全双工的可靠信道。
当运输层采用无连接的 UDP 协议时,这种逻辑通信信道是一条不可靠信道。
两个对等运输实体在通信时传送的数据单位叫作运输协议数据单元 TPDU (Transport Protocol Data Unit)。
TCP 传送的数据单位协议是 TCP 报文段(segment)
UDP 传送的数据单位协议是 UDP 报文或用户数据报。
还要强调两点
运输层的 UDP 用户数据报与网际层的IP数据报有很大区别。IP 数据报要经过互连网中许多路由器的存储转发,但 UDP 用户数据报是在运输层的端到端抽象的逻辑信道中传送的。
TCP 报文段是在运输层抽象的端到端逻辑信道中传送,这种信道是可靠的全双工信道。但这样的信道却不知道究竟经过了哪些路由器,而这些路由器也根本不知道上面的运输层是否建立了 TCP 连接。
5.1.3 运输层的端口
运行在计算机中的进程是用进程标识符来标志的。
运行在应用层的各种应用进程却不应当让计算机操作系统指派它的进程标识符。这是因为在因特网上使用的计算机的操作系统种类很多,而不同的操作系统又使用不同格式的进程标识符。
为了使运行不同操作系统的计算机的应用进程能够互相通信,就必须用统一的方法对 TCP/IP 体系的应用进程进行标志。
TCP 的端口
端口用一个 16 位端口号进行标志。
端口号只具有本地意义,即端口号只是为了标志本计算机应用层中的各进程
用户数据报协议 UDP
UDP 只在 IP 的数据报服务之上增加了很少一点的功能,即端口的功能和差错检测的功能。
虽然 UDP 用户数据报只能提供不可靠的交付,但 UDP 在某些方面有其特殊的优点。
UDP 的主要特点
UDP 是无连接的,即发送数据之前不需要建立连接。
UDP 使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制。
UDP 是面向报文的。UDP 没有拥塞控制,很适合多媒体通信的要求。
UDP 支持一对一、一对多、多对一和多对多的交互通信。
UDP 的首部开销小,只有 8 个字节。
TCP 最主要的特点
TCP 是面向连接的运输层协议。
每一条 TCP 连接只能有两个端点(endpoint),每一条 TCP 连接只能是点对点的(一对一)。
TCP 提供可靠交付的服务。 TCP 提供全双工通信。 面向字节流。
注意 :
TCP 连接是一条虚连接而不是一条真正的物理连接。
TCP 根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节(UDP 发送的报文长度是应用进程给出的)。
TCP 可把太长的数据块划分短一些再传送。TCP 也可等待积累有足够多的字节后再构成报文段发送出去。
TCP 的连接
TCP 把连接作为最基本的抽象。
每一条 TCP 连接有两个端点。
TCP 连接的端点不是主机,不是主机的IP 地址,不是应用进程,也不是运输层的协议端口。TCP 连接的端点叫做套接字(socket)或插口。
端口号拼接到(contatenated with) IP 地址即构成了套接字
套接字 (socket)
套接字 socket = (IP地址: 端口号)
每一条 TCP 连接唯一地被通信两端的两个端点(即两个套接字)所确定。即:
TCP 连接 ::= {socket1, socket2}
= {(IP1: port1), (IP2: port2)}
可靠传输的工作原理
5.4.1 停止等待协议
b) 超时重传
在发送完一个分组后,必须暂时保留已发送的分组的副本。
分组和确认分组都必须进行编号。
超时计时器的重传时间应当比数据在分组传输的平均往返时间更长一些。
可靠通信的实现
使用上述的确认和重传机制,我们就可以在不可靠的传输网络上实现可靠的通信。
这种可靠传输协议常称为自动重传请求ARQ (Automatic Repeat reQuest)。
5.6.2 超时重传时间的选择
TCP 每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到但还没有收到确认,就要重传这一报文段。
5.7 TCP 的流量控制
利用滑动窗口机制可以很方便地在 TCP 连接上实现流量控制
流量控制往往指在给定的发送端和接收端之间的点对点通信量的控制。
流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。
5.8 TCP的拥塞控制
2. 快重传和快恢复
5-9 TCP 的运输连接管理 1. 运输连接的三个阶段
运输连接就有三个阶段,即:连接建立、数据传送和连接释放。运输连接的管理就是使运输连接的建立和释放都能正常地进行。
连接建立过程中要解决以下三个问题:
要使每一方能够确知对方的存在。
要允许双方协商一些参数(如最大报文段长度,最大窗口大小,服务质量等)。
能够对运输实体资源(如缓存大小,连接表中的项目等)进行分配。
客户服务器方式
TCP 连接的建立都是采用客户服务器方式。
** TCP小插曲
** 确认 ACK —— 只有当 ACK ? 1 时确认号字段才有效。当 ACK ? 0 时,确认号无效
** 同步 SYN —— 同步 SYN = 1 表示这是一个连接请求或连接接受报文。
** 终止 FIN (FINis) —— 用来释放一个连接。FIN ? 1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
5.9.1 TCP 的连接建立
用三次握手建立 TCP 连接
第一次握手
A 的 TCP 向 B 发出连接请求报文段,其首部中的
同步位 SYN = 1,并选择序号 seq = x,表明传送
数据时的第一个数据字节的序号是 x。{
SYN = 1, seq = x
}
第二次握手
B 的 TCP 收到连接请求报文段后,如同意,则发回确认。
B 在确认报文段中应使 SYN = 1,使 ACK = 1,
其确认号ack = x ? 1,自己选择的序号 seq = y。{
SYN = 1, ACK = 1, seq = y, ack= x ? 1
}
第三次握手
A 收到此报文段后向 B 给出确认,其 ACK = 1,确认号 ack = y ? 1。
A 的 TCP 通知上层应用进程,连接已经建立
B 的 TCP 收到主机 A 的确认后,也通知其上层
应用进程:TCP 连接已经建立。 {
ACK = 1, seq = x + 1, ack = y ? 1
}
TCP 的连接释放 【四次挥手】
数据传输结束后,通信的双方都可释放连接。
现在 A 的应用进程先向其 TCP 发出连接释放
报文段,并停止再发送数据,主动关闭 TCP
连接。
第一次挥手
A 把连接释放报文段首部的 FIN = 1,其序号
seq = u,等待 B 的确认。 {
FIN = 1, seq = u
}
第二次挥手
B 发出确认,确认号 ack = u ? 1,
而这个报文段自己的序号 seq = v。TCP 服务器进程通知高层应用进程。
从 A 到 B 这个方向的连接就释放了,TCP 连接处于半关闭状态。B 若发送数据,A 仍要接收{
ACK = 1, seq = v, ack= u ? 1
}
第三次挥手
若 B 已经没有要向 A 发送的数据,
其应用进程就通知 TCP 释放连接。 FIN = 1, ACK = 1, seq = w, ack= u ? 1
第四次挥手
A 收到连接释放报文段后,必须发出确认 {
ACK = 1, seq = u + 1, ack = w ? 1
}