第 8章 传输层协议
8.1 进程间通信
8.2 TCP段格式
8.3 TCP连接的建立和拆除
8.4 TCP流量控制
8.5 TCP拥塞控制
8.6 TCP差错控制
8.7 TCP状态转换图
8.8 用户数据报协议 UDP
8.1 进程间通信
由于在一台计算机中同时存在多个进程,要进行进程间的通信,首先要解决进程的标识问题 。
TCP和 UDP采用协议 端口 来标识某一主机上的通信进程。
必须给出 全局惟一 的信宿端的进程标识符。 主机可以用 IP地址进行标识,IP地址是全局惟一的,再给主机上的进程赋予一个 本地惟一的标识符 — 端口号,二者加起来,便形成了进程的全局惟一标识符。
端口,传输层服务访问点 TSAP。
– 从内部实现看,端口是一种 抽象的软件结构 (数据结构和 I/O缓冲区 )
– 从通信对方看,端口是 通信进程的标识,应用进程通过系统调用与端口建立关联后,传输层传给该端口的数据都会被相应的应用进程所接收
– 从本地应用进程看,端口是进程 访问传输服务的入口点 。
每个端口拥有一个 端口号 ( port number),
端口号是 16比特 的标识符,因此,端口号的取值范围是从 0到 65535。
端口分配 有两种基本的方式:全局端口分配和本地端口分配。
TCP和 UDP都是 提供进程通信能力 的传输层协议,各有一套 端口号,都是从 0到 65535。
同一个端口在 TCP和 UDP中可能对应于 不同 类型的应用进程,也可能对应于 相同 类型的应用进程。为了区别 TCP和 UDP的进程,除了给出主机 IP地址和端口号之外,还要 指明协议 。
因特网中要全局惟一地标识一个进程必须采用一个 三元组,(协议,主机地址,端口号)
网络通信是两个 进程之间的通信,两个通信的进程构成一个 关联 。这个关联应该包含两个三元组,由于通信双方采用的协议必须是相同的,可以用一个 五元组来描述两个进程的关联:(协议,本地主机地址,本地端口号,远地主机地址,远地端口号)
因特网通信进程间的 相互作用模式,客户 /服务器模型 。客户 /服务器模型相互 作用的过程 是:
客户向服务器发出服务请求,服务器完成客户所要求的操作,然后给出响应。
服务器一般先于客户端启动,为了让客户能够找到服务器,服务器必须使用一个 客户熟知的地址,客户可以根据此地址向服务器提出服务请求。
熟知地址的含义,协议 是双方约定的协议,主机 IP地址 是固定且公开的,端口号 是大家所熟知的。
每一个标准的服务器都拥有一个熟知的端口号,
不同主机上相同服务器的端口号是相同的。客户进程一般采用 临时端口号,而不采用熟知的端口号。临时端口是使用时向操作系统 申请,
由操作系统 分配,使用 完后再 交 由操作系统管理的端口。因此,只要同一时间同一主机上的应用进程数量不超过可分配的临时端口数量就能保证系统的正常运行。
熟知端口所占端口号不多,以全局方式进行分配。 TCP和 UDP规定,小于 1024的端口号用作熟知端口,熟知端口又称为 保留端口 。
从 1024到 65535编号的端口为临时端口,
临时端口又称为 自由端口 。临时端口占全部端口的绝大部分,以本地方式进行分配。当进程要与远地进程通信时,首先申请一个临时端口,然后根据全局分配的熟知端口号与远地服务器建立联系,
传输数据。
TCP/IP结合了两种端口分配方式,既保证了灵活性,又方便了建立通信进程间的联系。
0— 1023
Well-known
1024— 49151
Registered
49152— 65535
Dynamic
TCP要将数据分为分组,TCP所采用的分组称为 TCP段。 TCP段不定长,被封装在 IP数据报中传输。 IP数据报不能保证数据的按序到达,
还可能造成数据的丢失或毁坏,这些问题经过
TCP协议的处理后,对上层提供的是 可靠的无差错的服务 。
图 8 - 1 进程标识与流传输
| |
UDP
字节流
| | | |
T C P
| 53 06 8| | |
T C P
| 23 | | |
UDP
| |
临时端口熟知端口
T e l ne t
客户
T e l ne t
服务器
IP 地址,192,168,1.2 IP 地址,192,168,6.4
主机 A 主机 B
返回
8.2 TCP段格式
TCP将应用层的数据分块并封装成 TCP段进行发送。
TCP段 =段首部 +数据
段首部 (20到 60字节 )=定长部分 +变长部分
定长部分 长度,20字节
变长部分 =选项 +填充,长度,0到 40字节之间。
TCP段格式中各个字段的含义和作用:
源 端 口( 16 比特) 目 的 端 口( 16 比特)
序 号 ( 32 比特)
确 认 号 ( 32 比特)
H L E N
( 4 比特 )
保留
( 6 比特 )
U
R
G
A
C
K
P
S
H
R
S
T
S
Y
N
F
I
N
窗 口 大 小( 16 比特)
校 验 和( 16 位) 紧急指针( 16 比特)
选 项 与 填 充(≤ 40 字节)
数 据(必须填充成 16 比特的整数倍)
首部图 8 - 2 T CP 段格式
0 16 31
源 IP 地 址( 32 比特)
目 的 IP 地 址( 32 比特)
全 0 ( 8 比特) 协议( 8 比特) T CP 总长度 ( 16 比特)
图 8 - 3 T CP 伪首部格式
0 8 31 16
TCP伪首部的 信息来自 IP数据报的首部,协议字段指明当前协议为 TCP(6)。 TCP段的发送端和接收端在计算校验和时都会加上伪首部信息。若接收端验证校验和是正确的,则说明数据到达了正确主机上正确协议的正确端口 。
TCP选项 是变长字段,当前 TCP使用的选项:
图 8 - 4 T CP 选项格式选项结束无操作
00000000
代码
00000001
00000010 00000100 最大段大小
2 字节
00000011 00000011 规模因子最大段大小窗口规模因子时间戳 00001000 00001010
时间戳值时间戳回显应答长度选项结束 标志为单字节选项,代码为 0,用于表示选项结束。
无操作 选项为 单字节选项,代码为 1,用于选项的填充,实现 32位对齐。
最大段大小 ( MSS)选项为 多字节选项,代码为 2,长度为 4字节,最后两个字节用于标识本机能够接收的段的最大字节数。该值范围为 0到 65535,默认值为 536。
窗口规模因子 选项为多字节选项,代码为 3,
长度为 3字节。在 TCP段的首部存在 16比特的窗口大小字段,但在高吞吐和低延迟的网络中,
65535字节的窗口仍然嫌小。通过在选项中采用窗口规模因子,可以增加窗口的大小。扩展后的窗口大小为:
Wn=Wo× 2f
Wn为新的窗口大小,Wo为 TCP首部窗口大小字段的值,f为窗口规模因子。
时间戳 选项为多字节选项,代码为 8,长度为 10字节 。时间戳值字段由源端在发送数据段时填写,信宿端收到后,在确认数据段中将收到的时间戳值填入时间戳回显应答字段,信源端根据该时间戳值和当前时间戳可以计算出数据段的往返时间。
返回
8.3 TCP连接的建立和拆除
8.3.1 TCP连接的建立
为了实现数据的 可靠传输,TCP要在应用进程间建立传输 连接 。
从理论上讲,建立传输连接只需要一个请求和一个响应就可以了。但是由于通信子网的问题,
请求有可能丢失,为了解决请求的丢失问题,
常用的办法是 超时重传 。
客户发出连接请求时,启动一个 定时器,一旦定时器超时,客户将被迫再次发起连接请求,
会导致 重复连接 。
解决 重复连接的办法:三次握手方法。
三次握手方法要求 对所有报文进行编号,TCP
采用的方法是给 每个字节一个 32比特的序号 。
每次建立连接时都产生一个新的 初始序号 。
序号字段位数 定 长,序号循环使用,序号字段位数较长,当序号循环一周回来时,使用同一序号的旧报文段早已传输完。这样,保证网络中不会同时出现来自同一源主机的相同序号的两个不同报文段。
建立连接前,服务器端 首先被动打开其熟知的端口,
对端口进行 监听 。当 客户端 要和服务器建立连接时,
发起一个 主动打开端口 的请求(临时端口)。然后进入 三次握手过程,
第一次握手,由要建立连接的客户向服务器发出连接请求段,该段首部的 同步标志 SYN被置为 1,并在首部中填入本次连接的客户端的 初始段序号 SEQ(例如
SEQ=26500)。
第二次握手,服务器收到请求后,发回 连接确认
( SYN+ACK),该段首部中的同步标志 SYN被置为
1,表示认可连接,首部中的确认标志 ACK被置为 1,
表示对所接收的段的确认,与 ACK标志相配合的是准备接收的 下一序号 ( ACK 26501),该段还给出了自己的 初始序号 (例如 SEQ=29010)。对请求段的确认 完成了一个方向上连接 。
第三次握手,客户向服务器发出的 确认 段,段首部中的确认标志 ACK被置为 1,表示对所接收的段的确认,与 ACK标志相配合的准备接收的下一序号被设置为收到的段序号加
1(ACK 29011)。完成了另一个方向上的连接。
客户 服务器
SYN,S E Q = 265 00
A CK 26501,SYN,S E Q = 29010
图 8 - 5 三次握手建立连接
A CK 29011
时间 时间
8.3.2 TCP连接的拆除
连接 双方都可以发起拆除 连接操作。
简单地拆除连接可能会造成数据丢失 。例如,A,B
两主机已建立连接并传输报文,A主机在 B主机没有准备的情况下,单方面发出断开连接请求,并停止接收该连接上的数据。但断开连接请求的传输要有一段时间,而在 B主机未收到断开连接请求之前,随时可能向 A主机发送数据,会有丢失数据的可能性。
主机 A
请求断开连接图 8 - 6 简单断开连接可能丢失数据时间 时间主机 B
数据
解决,TCP采用和三次握手类似的方法。这里可以将断开连接操作视为在 两个方向上分别断开连接操作 构成。一方发出断开连接请求后并不马上拆除连接,而是等待对方的确认,对方收到断开连接请求后,发送确认报文,这时拆除的只是单方向上连接(半连接)。
对方发送完数据后,再通过发送断开连接请求来断开另一个方向上的半连接。
主机 A
FI N,S E Q = 3263 0
A CK 3 26 31
图 8 - 7 拆除 T CP 连接时间 时间主机 B
FI N,S E Q = 24122,A CK 3 26 31
A CK 2 41 23
关闭半连接关闭半连接返回
8.4 TCP流量控制
TCP除了提供 进程通信能力 外,主要特点是具有 高可靠性 。 TCP在发送端与接收端之间建立一条连接,报文需要得到 接收端的确认 。 TCP
传输的是一个无报文丢失、重复和失序的正确的数据流。
TCP采用的最基本的 可靠性技术,
–流量控制
–拥塞控制
–差错控制
问题,在面向连接的传输过程中,发送方与接收方在发送报文的速率方面 要协调一致 。
–若发送方一味地向网络注入数据,则可能造成网络拥塞或因接收方来不及处理而丢失数据。
–若发送方每发出一个报文都等待对方的确认,
势必造成效率低下。
解决,滑动窗口协议 。采用滑动窗口协议既能够 保证可靠性,又可以 充分利用网络的传输能力 。这种方案允许 连续传输多个报文 而不必等待各个报文的确认,能够连续发送的报文数受到 窗口大小的限制 。
滑动窗口协议通过发送方窗口和接收方窗口的配合来完成传输控制。
图 8 - 8 T C P 连接发送方缓存与窗口
19 20 21 22 23 24 25 26 27 28 29 30 31
已发送并已确认已发送但未确认可以连续发送发送窗口发送方缓存暂不能发送发送缓存中是一组顺序编号的字节数据,这些数据的一部分在 发送窗口 中,另一部分在发送窗口外。图中发送缓存左端和右端空白处表示可以填入数据的空闲缓存,实际上可以将缓存视为左端和右端相连的环。
一旦窗口内的部分数据得到确认,窗口便向右滑动,将已确认的数据移到窗口的外面。这些数据所对应的缓冲单元成为空闲单元。窗口右边沿的移动使新的数据又落入到窗口中,成为可以被连续发送的数据的一部分。
接收方的窗口 反映当前能够接收的数据的数量。
图 8-9给出了接收方缓存与窗口的示意图。
图 8 - 9 T C P 连接接收方缓存与窗口
19 20 21 22
已提交 占据缓存的数据 N 字节空闲接收方缓存大小 M
接收端窗口的大小 W对应接收端缓存可以继续接收的数据量,它等于接收缓存大小 M减去缓存中尚未提交的数据字节数 N,即 W=M-N。
接收方窗口的大小取决于 接收方处理数据的速度和发送方发送数据的速度,当从缓存取走数据的速度低于数据进入缓存的速度时,接收窗口逐渐缩小,反之则逐渐扩大。
接收方将当前窗口大小通告给发送方 (利用
TCP段首部的窗口大小字段),发送方根据接收窗口 调整其发送窗口,使发送方窗口始终小于或等于接收方窗口的大小。
通过使用滑动窗口协议限制发送方一次可以发送的数据量,就可以实现流量控制的目的。这里的关键是要 保证发送方窗口小于或等于接收方窗口的大小 。
当发送方窗口大小为 1时,每发送一个字节的数据都要等待对方的确认,这便是 简单停等协议 。
流量控制可以在网络协议的不同层次上实现,
TCP的流量控制是在传输层上实现的 端到端的流量控制 。
返回
8.5 TCP拥塞控制
流量控制 是由于接收端不能及时处理数据而引发的控制机制。
拥塞 是由于网络中的路由器超载而引起的严重延迟现象。 拥塞 的发生会造成数据的 丢失,数据的丢失会引起超时 重传,而超时重传的数据又会进一步 加剧拥塞,如果不加以控制,最终将会导致系统的 崩溃 。
拥塞造成的数据丢失,仅仅靠超时重传是无法解决的。
因此,TCP提供了 拥塞控制 机制。
TCP的 拥塞控制,仍然是利用发送方的窗口来控制注入网络的数据流的速度。减缓注入网络的数据流后,拥塞就会被解除。
引入拥塞控制后,发送窗口的大小取决于 两个方面的因素:
– 接收方的处理能力 —— 确认报文所通告的窗口大小(即 可用的接收缓存 的大小)来表示;
– 网络的处理能力 —— 发送方所设置的变量 — 拥塞窗口 来表示。发送窗口的大小取通告窗口和拥塞窗口中小的一个。
发送窗口大小 =min(接收方通告窗口大小,拥塞窗口大小 )
和接收窗口一样,拥塞窗口也处于不断的调整中。一旦发现拥塞,TCP将减小拥塞窗口。
为了避免和消除拥塞,TCP周而复始地采用 三种策略 来控制拥塞窗口的大小。
首先是使用 慢启动策略,在建立连接时拥塞窗口被设置为 一个 最大段大小 MSS。对于每一个段的确认都会使拥塞窗口 增加一个 MSS,
实际上这种增加方式是指数级的增加。例如,
开始时只能发送一个数据段,当收到该段的确认后拥塞窗口加大到两个 MSS,发送方接着发送两个段,收到这两个段的确认后,拥塞窗口加大到 4个 MSS,接下来发送 4个段,拥塞窗口加大到 8个 MSS…… 。
当拥塞窗口加大到 门限值 (拥塞发生时拥塞窗口的一半)时,进入 拥塞避免阶段,在这一阶段,使用的策略是,每收到一个确认,拥塞窗口加大 1个 MSS,即使确认是针对多个段的,
拥塞窗口也只加大 1个 MSS,这在一定程度上减缓了拥塞窗口的增长。但在此阶段,拥塞窗口仍在增长,最终可能导致拥塞。
拥塞使重传定时器超时,发送方进入 拥塞解决阶段 。 发送方在进行重传的同时,将门限值调整为拥塞窗口的一半,并将拥塞窗口恢复成一个 MSS,然后进入新一轮的循环。
图 8 - 10 T CP 拥塞窗口与门限的变化
2
8
16
20
拥塞窗口大小(段)
超时超时门限 = 16
20
门限 = 10
门限 =8
16
2 4 8 6 10 12 14 16 18 20 22
往返时间返回
8.6 TCP差错控制差错控制是 TCP保证可靠性的手段之一。 TCP
的差错控制 包括差错检测和纠正 。 TCP处理的差错有数据被破坏、重复、失序和丢失。
数据被破坏 可以通过 TCP的 校验和检测 出来,
接收方 丢弃出错的数据,而且 不给出确认,发送方 定时器超时 后,重发该数据。
重复 数据段一般是由超时重传造成的,接收方可以根据序号判断是否是重复数据段,对于重复数据段只需要简单地 丢弃 即可。
数据失序 是由于 TCP下面的 IP协议是无连接的数据报协议,不能保证数据报的按序到达。 TCP对于提前到达(前面的数据还未到达)的数据,暂不确认,
直到前面的数据到达后再一起确认 。
数据丢失 错误也是通过 超时重传 来进行恢复。但是确认报文段的丢失一般不会造成任何影响,因为
TCP采用的是累计确认,TCP确认针对流中的字节序号,而不是段号。一般情况下,接收方确认已正确收到的、连续的流前部。对于接下去的数据段的确认也就包含了对前面数据的确认。若下一个确认未能在重传定时器超时之前到达发送方,则会出现重复报文段。 重复数据会被接收方鉴别出来(根据序号),并被丢弃 。
超时重传最关键的因素是 重传定时器的定时时间片的大小 。由于在因特网这种大型网络中 传输延迟变化范围很大,从发出数据到收到确认所需的往返时间( Round Tript Time,RTT)
动态变化,很难确定。
为了适应传输延迟的动态变化,TCP的重传定时值也要不断调整。 TCP通过测试连接的往返时间,对重传定时值进行修正。
TCP的重传定时值根据下式进行计算:
Timeout=β× RTT (1)
β为大于 1的常数加权因子 (推荐 β=2),RTT为估算的往返时间。
RTT根据下式进行计算:
RTT=α× RTTo+(1- α)× RTTn (2)
返回
8.7 TCP状态转换图
TCP建立连接、传输数据和断开连接是一个复杂的过程。为了准确地描述这一过程,可以采用 有限状态机 。有限状态机包含有限个状态,
在某一时刻,机器必然处于某一特定状态,当在一个状态下发生特定事件时,机器会进入一个新的状态。在进行状态转换时,机器可以执行一些动作。
图 8-11是 TCP的有限状态机,图中 状态 用方框表示,状态转移 用带箭头的线表示,线旁的说明用斜线分为两部分,斜线前是引起状态转移的 事件,斜线后是状态转移时所发出的 动作 。
CL O S E D
图 8 - 11 T CP 的状态转换图
SYN - S E N T
F IN - W A IT - 1
L IS T E N
SYN - RC V D
E S T A BL IS H E D
CL O S E - W A IT
L A S T - A CK
主动打开 / S Y N
F IN + A CK / A CK
A CK / -
F IN / A CK
被动打开 / -
S Y N / S Y N + A CK
关闭 / F IN
F IN - W A IT - 2 T IM E - W A IT
CL O S IN G
A CK / -
F IN / A CK
关闭 / F IN
A CK / -
RS T / -
超时 / RS T
超时
RS T / -
发送 / S Y N
S Y N + A CK / A CK
F IN / A CK
关闭 / F IN
A CK / -
关闭或超时 / -
S Y N / S Y N + A CK
C L O S E D
图 8 - 12 客户 / 服务器交换数据时的状态转换图
SYN - S E N T
E S T A B L IS H E D
F IN - W A IT - 1
F IN - W A IT - 2
T IM E - W A IT
C L O S E D
L IS T E N
SYN - R C V D
E S T A B L IS H E D
C L O S E - W A IT
L A S T - A C K
客户端状态 服务器状态主动打开 / S Y N
SYN + A C K / A C K
关闭 / F IN
A C K / -
F IN / A C K
被动打开 / -
S Y N / S Y N + A C K
A C K / -
F IN / A C K
关闭 / F IN
A C K / - 超时
SYN
S Y N + A C K
A C K
交换数据
F IN
A C K
F IN
A C K
返回
8.8 用户数据报协议 UDP
用户数据报协议 UDP( User Datagram
Protocol)是 TCP/IP传输层的另一个协议。
TCP/IP同时提供 TCP服务和 UDP服务的目的是为了给用户更加灵活的选择。
UDP同 IP协议一样提供 无连接数据报传输,
UDP在 IP协议上增加了 进程通信能力 。 UDP
除了提供进程间的通信能力外,还提供了简单的差错控制 。但 UDP不提供流量控制,也不对 UDP数据报进行确认。
8.8.1 UDP数据报格式
UDP将应用层的数据封装成 UDP数据报进行发送。 UDP数据报由 首部 和 数据 构成。 UDP采用 定长首部,长度为 8个字节 。
UDP数据报格式如图 8-13所示。
源 端 口( 16 比特) 目 的 端 口( 16 比特)
UDP 总长度 ( 16 比特) 校验和( 16 比特)
数 据(必须填充成 16 比特的整数倍)
首部图 8 - 13 U D P 数据报格式
0 16 31
UDP建立在 IP之上,整个 UDP数据报被封装在 IP数据报中传输。虽然 16比特的
UDP总长度字段可以标识 65535字节,
但由于 IP数据报总长度 65535的限制及 IP
数据报首部占用 20字节,实际 UDP最大长度为 65515字节,UDP最大数据长度为 65507字节 。( 65506)
UDP的 校验和 字段长度为 16比特,是 可选字段,置 0时表明不对 UDP进行校验。
8.8.2 UDP伪首部
UDP数据报的校验和用于实现 有限的差错控制 。 UDP校验和的计算与 TCP相同,计算校验和时,除了 UDP数据报本身外,它还加上一个 伪首部 。伪首部不是 UDP数据报的有效成分,只是验证 UDP数据报是否传到正确的信宿端的手段。
UDP伪首部的格式如图 8-14所示。
源 IP 地 址( 32 比特)
目 的 IP 地 址( 32 比特)
全 0 ( 8 比特) 协议( 8 比特) UDP 总长度 ( 16 比特)
图 8 - 1 4 UDP 伪首部格式
0 8 31 16
面向连接 无连接高可靠 高效率一次传输交换大量报文 一次传输交换少量信息复杂 简单表 8-1 TCP和 UDP的特点比较传输控制协议 TCP 用户数据报协议 UDP
本章要点
传输层 承上启下,屏蔽通信子网的细节,向上提供通用的进程通信服务。 传输层是对网络层的加强与弥补 。
TCP和 UDP是传输层的两大协议 。
端口分配 有两种基本的方式:全局端口分配和本地端口分配。
在因特网中采用一个 三元组 (协议,主机地址,端口号)来全局惟一地标识一个进程。用一个 五元组 (协议,本地主机地址,本地端口号,远地主机地址,远地端口号)来描述两个进程的关联。
TCP和 UDP都是提供进程通信能力的传输层协议。它们各有一套 端口号,两套端口号相互独立,都是从 0
到 65535。
TCP和 UDP在计算校验和时引入 伪首部 的目的是为了能够验证数据是否传送到了正确的信宿端。
为了实现数据的可靠传输,TCP在应用进程间建立传输连接。 TCP在建立连接时采用 三次握手方法解决重复连接的问题 。在拆除连接时采用 四次握手方法解决数据丢失问题 。
建立连接前,服务器端首先 被动打开其熟知的端口,对端口进行监听。当客户端要和服务器建立连接时,发出一个主动打开端口的请求,客户端一般使用临时端口。
TCP采用的最基本的 可靠性技术 包括流量控制、拥塞控制和差错控制。
TCP采用 滑动窗口协议实现流量控制,滑动窗口协议通过发送方窗口和接收方窗口的配合来完成传输控制。
TCP的 拥塞控制 利用发送方的窗口来控制注入网络的数据流的速度。发送窗口的大小取通告窗口和拥塞窗口中小的一个。
TCP通过 差错控制 解决数据的毁坏、重复、失序和丢失等问题。
UDP在 IP协议上增加了进程通信能力。此外 UDP通过可选的校验和提供简单的差错控制。但 UDP不提供流量控制和数据报确认 。
返回