1. 运输层协议概述
1.1 进程之间的通信
(1) 运输层的作用
运输层提供进程间的逻辑通信。
运输层的屏蔽作用:
-
运输层向高层用户屏蔽了下面网络核心的细节(如网络拓扑、所采用的路由选择协议等),使应用进程看见的就是好像在两个运输层实体之间有一条端到端的逻辑通信信道。
可靠信道与不可靠信道:
通过是否使用面向连接的协议进行区分。
![]()
1.2 运输层的两个主要协议
-
用户数据报协议 UDP (User Datagram Protocol)
-
传输控制协议 TCP (Transmission Control Protocol)
(1) 运输协议数据单元
-
两个对等运输实体在通信时传送的数据单位叫作运输协议数据单元 TPDU (Transport Protocol Data Unit)。
-
TCP 传送的数据单位协议是 TCP 报文段 (segment)。
-
UDP 传送的数据单位协议是 UDP 报文或用户数据报。
(2) UDP 与 TCP 的区别
UDP:
-
传送数据之前不需要先建立连接。
-
收到 UDP 报后,不需要给出任何确认。
-
不提供可靠交付,但是一种最有效的工作方式。
TCP:
-
提供可靠的、面向连接的运输服务。
-
不提供广播或多播服务。
-
开销较多。
使用 UDP 和 TCP 的典型应用和应用层协议:
![]()
1.3 运输层的端口
-
复用:应用进程都可以通过运输层再传送到 IP 层(网络层)。
-
分用:运输层从 IP 层收到发送给应用进程的数据后,必须分别交付给指明的各应用进程。
需要考虑的问题:
进程的创建和撤销都是动态的,因此发送方几乎无法识别其他机器上的进程。
我们往往需要利用目的主机提供的功能来识别终点,而不需要知道具体实现这个功能的进程是哪一个。
有时我们会改换接收报文的进程,但并不需要通知所有的发送方。
(1) 端口号
在运输层使用协议端口号 (protocol port number),或通常简称为端口 (port)。把端口设为通信的抽象终点。
(2) 软件端口与硬件端口
软件端口:
-
协议栈层间的抽象的协议端口。
-
是应用层的各种协议进程与运输实体进行层间交互的地点。
-
不同系统实现端口的方法可以不同。
硬件端口:
-
不同硬件设备进行交互的接口。
(3) TCP/IP 运输层端口的标志
-
端口用一个 16 位端口号进行标志,允许有 65,535 个不同的端口号。
-
端口号只具有本地意义,只是为了标志本计算机应用层中的各进程。
-
在互联网中,不同计算机的相同端口号没有联系。
由此得,两个计算机中的进程要互相通信,不仅必须知道对方的端口号,而且还要知道对方的 IP 地址。
(4) 两大类、三种类型的端口
常用的熟知端口:
![]()
2. 用户数据报协议UDP
2.1 UDP概述
-
UDP 只在 IP 的数据报服务之上增加了复用和分用和差错检测的功能。
(1) UDP的主要特点
-
无连接。发送数据之前不需要建立连接。
-
使用尽最大努力交付。即不保证可靠交付。
-
面向报文。UDP 一次传送和交付一个完整的报文。
-
没有拥塞控制。网络出现的拥塞不会使源主机的发送速率降低。很适合多媒体通信的要求。
-
支持一对一、一对多、多对一、多对多等交互通信。
-
首部开销小,只有 8 个字节。
UDP 通信的特点:简单方便,但不可靠。
(2) UDP 是面向报文的
-
发送方 UDP 对应用层交下来的报文,既不合并,也不拆分,按照样发送。
-
接收方 UDP 对 IP 层交上来的 UDP 用户数据报,去除首部后就原封不动地交付上层的应用进程,一次交付一个完整的报文。
应用程序必须选择合适大小的报文:
-
若报文太长,IP 层在传送时可能要进行分片,降低 IP 层的效率。
-
若报文太短,会使 IP 数据报的首部的相对长度太大,降低 IP 层的效率。
(3) UDP 通信和端口号的关系
多对一的通信,一对多的通信。
-
复用:将 UDP 用户数据报组装成不同的 IP 数据报,发送到互联网。
-
分用:根据 UDP 用户数据报首部中的目的端口号,将数据报分别传送到相应的端口,以便应用进程到端口读取数据。
2.2 UDP的首部格式
-
源端口:源端口号。在需要对方回信时选用。不需要时可用全 0。
-
目的端口:目的端口号。终点交付报文时必须使用。
-
长度:UDP 用户数据报的长度,其最小值是 8(仅有首部)。
-
检验和:检测 UDP 用户数据报在传输中是否有错。有错就丢弃。
用户数据报 UDP 有两个字段:
数据字段和首部字段。首部字段有 8 个字节,由 4 个字段组成,每个字段都是 2 个字节。
![]()
UDP基于端口的分用:
-
接收方 UDP 根据首部中的目的端口号,把报文通过相应的端口上交给应用进程。
-
如果接收方 UDP 发现收到的报文中的目的端口号不正确(即不存在对应于该端口号的应用进程),就丢弃该报文,并由 ICMP 发送“端口不可达”差错报文给发送方。
在计算检验和时,临时把 12 字节的“伪首部”和 UDP 用户数据报连接在一起。伪首部仅仅是为了计算检验和。
![]()
UDP 的检验和是把首部和数据部分一起都检验。
3. 传输控制协议TCP
-
TCP 是面向连接的运输层协议,在无连接的、不可靠的 IP 网络服务基础之上提供可靠交付的服务。为此,在 IP 的数据报服务基础之上,增加了保证可靠性的一系列措施。
3.1 TCP最主要的特点
-
TCP 是面向连接的运输层协议。
-
每一条 TCP 连接只能有两个端点 (endpoint),每一条 TCP 连接只能是点对点的(一对一)。
-
TCP 提供可靠交付的服务。
-
TCP 提供全双工通信。
-
TCP是面向字节流的。
-
TCP 中的“流”(stream) 指的是流入或流出进程的字节序列。
-
面向字节流:虽然应用程序和 TCP 的交互是一次一个数据块,但 TCP 把应用程序交下来的数据看成仅仅是一连串无结构的字节流。
-
TCP 面向流的概念:
-
TCP 不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系。
-
但接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。
-
TCP 不关心应用进程一次把多长的报文发送到 TCP 缓存。
-
TCP 根据对方给出的窗口值和当前网络拥塞程度来决定一个报文段应包含多少个字节,形成 TCP 报文段。
3.2 TCP的连接
TCP 把连接作为最基本的抽象。
-
TCP 连接的端点:套接字 (socket) 或插口。
套接字:socket = (IP地址 : 端口号)
示例:
socket = (192.169.1.20 : 2028)
每一条 TCP 连接唯一地被通信两端的两个端点(即两个套接字)所确定:
-
TCP 连接 ::= {socket1, socket2} = {(IP1: port1),(IP2: port2)}
TCP连接,IP 地址,套接字:
TCP 连接就是由协议软件所提供的一种抽象。
TCP 连接的端点是抽象的套接字,即(IP 地址:端口号)。
同一个 IP 地址可以有多个不同的 TCP 连接。
同一个端口号也可以出现在多个不同的 TCP 连接中。
Socket的多种不同的意思:
应用编程接口 API 称为 socket API, 简称为 socket。
socket API 中使用的一个函数名也叫作 socket。
调用 socket 函数的端点称为 socket。
调用 socket 函数时其返回值称为 socket 描述符,可简称为 socket。
在操作系统内核中连网协议的 Berkeley 实现,称为 socket 实现。
4. 可靠传输的工作原理
-
IP网络提供的是不可靠的传输
-
理想传输条件的特点:
-
传输信道不产生差错。
-
不管发送方以多快的速度发送数据,接收方总是来得及处理收到的数据。
-
在理想传输条件下,不需要采取任何措施就能够实现可靠传输。
但实际网络都不具备理想传输条件。必须使用一些可靠传输协议,在不可靠的传输信道实现可靠传输。
4.1 停止等待协议
-
每发送完一个分组就停止发送,等待对方的确认。在收到确认后再发送下一个分组。
-
全双工通信的双方既是发送方也是接收方。
-
假设仅考虑 A 发送数据,而 B 接收数据并发送确认。因此 A 叫做发送方,而 B 叫做接收方。
(1) 无差错情况
-
A发送完分组M1后就暂停发送,等待B的确认 (ACK)。
-
B收到M1向A发送ACK。
-
A在收到了对M1的确认后,就再发送下一个分组M2。
(2) 出现差错
存在两种情况:
-
B 接收 M1 时检测出了差错,就丢弃 M1,其他什么也不做(不通知 A 收到有差错的分组)。
-
M1 在传输过程中丢失了,这时 B 当然什么都不知道,也什么都不做。
-
在上述两种情况下,B 都不会发送任何信息。
问题:A 如何知道 B 是否正确收到了 M1 呢?
-
解决方法:超时重传
-
A 为每一个已发送的分组设置一个超时计时器。
-
A 只要在超时计时器到期之前收到了相应的确认,就撤销该超时计时器,继续发送下一个分组 M2 。
-
若 A 在超时计时器规定时间内没有收到 B 的确认,就认为分组错误或丢失,就重发该分组。
(3) 确认丢失和确认迟到
确认丢失:
-
若 B 所发送的对 M1 的确认丢失了,那么 A 在设定的超时重传时间内将不会收到确认,因此 A 在超时计时器到期后重传 M1。
-
假定 B 正确收到了 A 重传的分组 M1。这时 B 应采取两个行动:
-
丢弃这个重复的分组 M1,不向上层交付。
-
向 A 发送确认。
-
确认迟到:
-
B 对分组 M1 的确认迟到了,因此 A 在超时计时器到期后重传 M1。
-
B 会收到重复的 M1,丢弃重复的 M1,并重传确认分组。
-
A 会收到重复的确认。对重复的确认的处理:丢弃。
(4) 信道利用率
-
当往返时间 RTT 远大于分组发送时间 TD 时,信道的利用率会非常低。
优点:简单。缺点:信道利用率太低。
(5) 停止等待协议要点
-
停止等待。发送方每次只发送一个分组。在收到确认后再发送下一个分组。
-
暂存:在发送完一个分组后,发送方必须暂存已发送的分组的副本,以备重发。
-
编号。对发送的每个分组和确认都进行编号。
-
超时重传。发送方为发送的每个分组设置一个超时计时器。若超时计时器超时位收到确认,发送方会自动超时重传分组。
-
超时计时器的重传时间应当比数据在分组传输的平均往返时间更长一些,防止不必要的重传。
-
简单,但信道利用率太低。
(6) 流水线传输
-
由于信道上一直有数据不间断地传送,流水线传输可获得很高的信道利用率。
连续 ARQ 协议和滑动窗口协议采用流水线传输方式。
4.2 连续ARQ协议
-
发送窗口:发送方维持一个发送窗口,位于发送窗口内的分组都可被连续发送出去,而不需要等待对方的确认。
-
发送窗口滑动:发送方每收到一个确认,就把发送窗口向前滑动一个分组的位置。
-
累积确认:接收方对按序到达的最后一个分组发送确认,表示:到这个分组为止的所有分组都已正确收到了。
累计确认的优点:
-
容易实现,即使确认丢失也不必重传。
累计确认的缺点:
-
不能向发送方反映出接收方已经正确收到的所有分组的信息。
连续 ARQ 协议采用 Go-back-N(回退N)。
Go-back-N(回退N):表示需要再退回来重传已发送过的 N 个分组。
当通信线路质量不好时,连续 ARQ 协议会带来负面的影响。
5. TCP报文段的首部格式
-
TCP 虽然是面向字节流的,但 TCP 传送的数据单元却是报文段。
-
一个 TCP 报文段分为首部和数据两部分,而 TCP 的全部功能都体现在它首部中各字段的作用。
-
TCP 报文段首部的前 20 个字节是固定的,后面有 4n 字节是根据需要而增加的选项 (n 是整数)。因此 TCP 首部的最小长度是 20 字节。
TCP首部的长度是 4n 字节(n 是整数)。
TCP 首部的最小长度是 20 字节。
-
源端口和目的端口:各占 2 字节。端口是运输层与应用层的服务接口。运输层的复用和分用功能通过端口实现。
-
序号:占 4 字节。TCP 连接中传送的数据流中的每一个字节都有一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
现有 5000 个字节的数据。假设报文段的最大数据长度为 1000 个字节,初始序号为 1001。
![]()
-
确认号:占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。
若确认号 = N,则表明:到序号 N – 1 为止的所有数据都已正确收到。
-
数据偏移(即首部长度):占 4 位,指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。单位是 32 位字(以 4 字节为计算单位)。
-
保留:占 6 位,保留为今后使用,但目前应置为 0。
-
紧急 URG:控制位。当 URG = 1 时,表明紧急指针字段有效,告诉系统此报文段中有紧急数据,应尽快传送 (相当于高优先级的数据)。
-
确认 ACK:控制位。只有当 ACK =1 时,确认号字段才有效。当 ACK =0 时,确认号无效。
-
推送 PSH (PuSH) :控制位。接收 TCP 收到 PSH = 1 的报文段后,就尽快(即“推送”向前)交付接收应用进程,而不再等到整个缓存都填满后再交付。
-
复位 RST (ReSeT) :控制位。当 RST=1 时,表明 TCP 连接中出现严重差错(如主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接。
-
同步 SYN (SYNchronization) :控制位。
同步 SYN = 1 表示这是一个连接请求或连接接受报文。
当 SYN = 1,ACK = 0 时,表明这是一个连接请求报文段。
当 SYN = 1,ACK = 1 时,表明这是一个连接接受报文段。
-
终止 FIN (Finish) :控制位。用来释放一个连接。FIN=1 表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。
-
窗口:占 2 字节。
窗口值告诉对方:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。
窗口字段明确指出了现在允许对方发送的数据量。窗口值经常在动态变化。
-
检验和:占 2 字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。
在计算检验和时,临时把 12 字节的“伪首部”和 TCP 报文段连接在一起。伪首部仅仅是为了计算检验和。
-
紧急指针:占 2 字节。在 URG = 1时,指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据),指出了紧急数据的末尾在报文段中的位置。
-
选项:长度可变,最长可达 40 字节。
长度可变。TCP 最初只规定了一种选项,即最大报文段长度 MSS。