重要内容
- 运输层的作用
- 端口和套接字的意义
- 无连接的 UDP 的特点
- 面向连接的 TCP 的特点
- 在不可靠网络上时先可靠传输的原理
- TCP 的滑动窗口,流量控制,拥塞控制和连接管理
发送时延、吞吐量的计算
吞吐量(throughput)表示在单位时间内通过某个网络(或信道、接口)的数据量。
- 发送时延 = 窗口数据量除以带宽。
- 最大吞吐量 = 一个窗口的大小除以一个传输轮次的时间(发送时延+传播时延)
- 信道利用率 = 吞吐量/信道带宽
例题:
(5.1) 运输层协议概述
(5.1.1) 进程之间的通信(运输层的功能)
- 运输层为应用进程之间提供端到端的逻辑通信。
- 运输层向用户屏蔽了下面网络核心的细节(如网络拓扑、路由选择协议等);
- 为了能够满足同一主机的不同进程间的通信要求,运输层需要一个很重要的功能——分用与复用。
- 复用(
multiplexing):指发送方不同进程可以使用同一运输协议进行发送数据报。 - 分用(
demultiplexing):指接收方的运输层可以将接收到的数据报正确交付给不同的进程。
- 复用(
- 运输层还要对从网络层收到的数据报进行差错检测
- IP 数据包中的首部中的检验和字段只是对首部进行检查,并不对数据部分进行检查。
- 运输层的两个主要协议:
- 用户数据报协议
UDP—— 无连接 - 传输控制协议
TCP—— 面向连接
- 用户数据报协议
(5.1.2) 运输层的两个主要协议
两个对等运输实体在通信时传送的数据单位叫*TPDU(transport protocol data unit)运输协议数据单元。*根据协议可细分为:
- TCP报文段
- UDP用户数据包
(5.1.3) 运输层的端口
一、什么是端口?
- 端口是指软件端口,是应用层的各种协议进程与运输实体进行层间交互的一种地址。作用范围是每一台计算机自身。
二、端口的分类
- 服务器使用的端口:熟知端口号(0~1023)
- 登记端口号:数值为1024~49151,为没有熟知端口号的应用程序使用的。使用这个范围的端口号必须在 IANA 登记,以防止重复。
- 客户端使用的端口:短暂端口号(49152~65535),为进程动态分配。
(5.2) 用户数据报协议UDP
(5.2.1) UDP概述
1. UDP的主要特点
- 无连接的;发送数据不需要预先建立连接。
- 尽最大努力交付;
- 面向报文;一次交付给网络层一个应用层下发的报文。
- 没有拥塞控制;网络出现拥塞不会使源主机的发送效率降低。
- 支持一对一、一对多、多对一和多对多的交互通信。
- 首部开销小。UDP用户数据报的首部只有8个字节(TCP首部有20个字节)。
(5.2.2) UDP的首部格式
1. UDP的首部组成
UDP报文的首部含有两个字段(首部字段和数据字段),每个字段的长度都是两个字节。各字段意义如下:
- 源端口
- 目的端口
- 长度;最小值为8(即只有首部的情况)
- 检验和(检测UDP用户数据报在传输中是否有错,有错则丢弃)
(5.3) 传输控制协议 TCP
(5.3.1) TCP最主要的特点
- 面向连接;应用程序使用TCP协议通信,必须预先建立连接,通信结束后,释放连接。
- 每一条 TCP 连接只能有两个端点(endpoint),每一条 TCP 连接只能是点对点的(一对一)。
- 提供可靠交付的服务。
- 提供全双工通信;在通信两端都设有用来存放临时数据发送和接收缓存,在用户发送数据时,把数据传送给缓存后,用户就可以做其他事。
- 面向字节流;
"流"是指流入到进程或从进程流出的字节序列。但TCP并不保证发送的这个序列都在通信双方都具有对应的大小关系,但双方的必须是相同。
(5.3.2) TCP的连接
一、概述
- TCP 把连接组作为最基本的抽象。
- TCP 把连接的端点叫做套接字(
socket)socket = (IP地址: 端口号)TCP 连接 ::= {socket1, socket2} = {(IP1: port1), (IP2: port2)}
二、一词多义
- 应用编程接口 API 称为 socket API, 简称为 socket。
- socket API 中使用的一个函数名也叫作 socket。
- 调用 socket 函数的端点称为 socket。
- 调用 socket 函数时其返回值称为 socket 描述符,可简称为 socket。
- 在操作系统内核中连网协议的 Berkeley 实现,称为 socket 实现。
(5.4) 可靠传输的工作原理
(5.4.1) 停止等待协议
1. 无差错情况
2. 出现差错
3. 确认丢失和确认迟到
4. 总结
- 在发送完一个分组后,必须暂时保留已发送的分组的副本。
- 分组和确认分组都必须进行编号。
- 超时计时器的重传时间应当比数据在分组传输的平均往返时间更长一些.
- 只要发送方A发出去的数据没有收到接收方B的确认,A就认为B没有收到
5. 信道利用率
停止等待协议的优点是简单,但缺点是信道利用率太低。
Td
信道利用率 U = ———————————————
Td + RTT + Ta
为解决这中停止等待造成信道资源利用率不高的问题,可以采用流水线传输(基于ARQ、滑动窗口协议)
(5.4.2) 连续 ARQ 协议
全称Automatic Repeat reQuest,自动重传请求,ARQ 表明重传的请求是自动进行的。接收方不需要请求发送方重传某个出错的分组 。
1、发送方
发送方维持一个窗口,窗口值的意义:从本报文段首部中的确认号算起,接收方目前允许对方发送的数据量;(窗口值是不断动态变化的)(动态确认机制)
2、接收方
接收方一般都是采用累积确认的方式,对按序到达的最后一个分组发送确认,就代表所有分组已经收到了。
3、累积确认优缺点
优点是:容易实现,即使确认丢失也不必重传。
缺点是:不能向发送方反映出接收方已经正确收到的所有分组的信息。
4、Go-back-N
如果发送方发送了前
5个分组,而中间的第3个分组丢失了。这时接收方只能对前两个分组发出确认。发送方无法知道后面三个分组的下落,而只好把后面的三个分组都再重传一次。
可见当线路不好时,连续ARQ协议会带来负面影响。
(5.5) TCP 报文段的首部格式
TCP的全部功能都体现在它20字节大小的首部中的各字段中的作用。
- 源端口和目的端口字段 —— 各占 2 字节。端口是运输层与应用层的服务接口。运输层的复用和分用功能都要通过端口才能实现。
- 序号字段 —— 占 4 字节。TCP 连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值则指的是本报文段所发送的数据的第一个字节的序号。
- 例如一个100字节大小的报文段的第一个字节的序号是301,最后一个字节的序号则是400。
- 确认号字段 —— 占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。
- 假如B收到A发送过来的报文段,其序号字段值是501,数据长度是200字节,这表明B正确收到了A发送的,到序号700为止的数据。因此B期待收到A的下一个数据序号是701,于是B在发送给A的确认报文段中把确认号置为701。
- 数据偏移:TCP报文段首部的长度。
- 保留字段 —— 占 6 位,保留为今后使用,但目前应置为 0。
- 紧急
URG(urgent)—— 当URG=1时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应尽快传送(告诉服务器停止传送现在的数据,先传输应急字段)。 - 确认
ACK(acknowledge)—— 只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。 - 推送
PSH—— 接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。 - 复位
RST (ReSeT)—— 当 RST=1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他原因,比如在加载网页时,点了×),必须释放连接,然后再重新建立运输连接。 - 同步
SYN(synchronization)—— 确认ACK=0,同步SYN = 1表示这是一个连接请求或连接接受报文。 - 终止
FIN (FINis)—— 用来释放一个连接。FIN=1表明此报文段的发送端的数据已发送完毕,并要求释放运输连接。 - 窗口字段 —— 占 2 字节,用来让对方设置发送窗口的依据,单位为字节。
- 检验和 —— 占 2 字节。检验和字段检验的范围包括首部和数据这两部分。在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。
- 紧急指针字段 —— 占 16 位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。
- 选项字段
- 最大报文段长度
MSS(Maximum Segment Size):告诉对方 TCP:“我的缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节。” - 窗口扩大选项:占 3 字节,其中有一个字节表示移位值 S。新的窗口值等于TCP 首部中的窗口位数增大到(16 + S),相当于把窗口值向左移动 S 位后获得实际的窗口大小。
- 时间戳选项:占 10 字节,其中最主要的字段时间戳值字段(4 字节)和时间戳回送回答字段(4 字节)。
- 最大报文段长度
- 填充字段:这是为了使整个首部长度是 4 字节的整数倍。
(5.6) TCP可靠传输的实现
(5.6.1) 以字节为单位的滑动窗口
1. 两个窗口
- 发送窗口:可以连续把窗口内的数据发送出去,但未收到确认之前的数据不能删除,以便在超时时重传。
- 滑动窗口:发送方每收到一个接受确认,就将发送窗口的向前滑动一个字节的位置;
2. 发送窗口不动的情况
发送窗口一般都是不断向前移动的,但也有可能不动,比如:
- 没有收到新的确认,对方通知的窗口大小也不变。
- 收到了新的确认,但对方通知的窗口缩小了,使得窗口前言刚好不动。
3. 发送窗口向后缩的情况
略...
P3 – P1 = A 的发送窗口(又称为通知窗口)
P2 – P1 = 已发送但尚未收到确认的字节数
P3 – P2 = 允许发送但尚未发送的字节数(又称为可用窗口)
4. 发送缓存和接收缓存
发送缓存存放
- 发送程序传送给发送方TCP准备发送的数据。
- TCP已发出但未收到确认的数据。
接收缓存存放
- 按序到达的、但尚未被程序读取的数据。
- 未按序到达的数据。
5. 强调的三点
- A 的发送窗口并不总是和 B 的接收窗口一样大(因为有一定的时间滞后)。
- TCP 标准没有规定对不按序到达的数据应如何处理。通常是先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用进程。
- TCP 要求接收方必须有累积确认的功能,这样可以减小传输开销。
(5.6.2) 超时重传的时间选择
(5.6.3) 选择确认SACK
SACK 全称Selective ACK,它的作用是:当接收方收到了和前面的字节流不连续的两个字节块。
如果这些字节的序号都在接收窗口之内,那么接收方就先收下这些数据,但要把这些信息准确地告诉发送方,使发送方不要再重复发送这些已收到的数据。
(5.7) TCP 的流量控制
(5.7.1) 利用滑动窗口实现流量控制
1. 流量控制的概念
流量控制(flow control)就是让发送方的发送速率不要太快,既要让接收方来得及接收,也不要使网络发生拥塞。举例
2. 持续计时器
一种特殊情况:B向A发送了零窗口报文后不久,B的接受缓存又有了存储空间,于是B向A发送了rwnd=400的报文段,如果这个报文段在传时丢失了,B也一直在等A这个报文,如果没有为TCP的每一个连接的设定的持续计时器,那么这个死锁将不会被解开。
工作原理: 只要 TCP 连接的一方收到对方的零窗口通知,就启动持续计时器。
- 若持续计时器设置的时间到期,就发送一个零窗口探测报文段(仅携带 1 字节的数据),而对方就在确认这个探测报文段时给出了现在的窗口值。
- 若窗口仍然是零,则收到这个报文段的一方就重新设置持续计时器。
- 若窗口不是零,则死锁的僵局就可以打破了。
(5.7.2) 必须考虑传输效率
三种控制TCP报文段的发送时机的机制
- 第一种机制是 TCP 维持一个变量,它等于最大报文段长度 MSS。只要缓存中存放的数据达到 MSS 字节时,就组装成一个 TCP 报文段发送出去。
- 第二种机制是由发送方的应用进程指明要求发送报文段,即 TCP 支持的推送(
push)操作。 - 第三种机制是发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段(但长度不能超过
MSS)发送出去。
(5.8) TCP 的拥塞控制
略...
(5.9) TCP 的运输连接管理
附:TCP连接建立过程中需要解决的三个问题:
- 要使每一方能够确知对方的存在。
- 要允许双方协商一些参数(如最大报文段长度,最大窗口大小,服务质量等)
- 能够对运输实体资源(如缓存大小,连接表中的项目等)进行分配。
(5.9.1) TCP的连接建立
1. 连接建立的过程解析:
- A 的 TCP 向 B 发出连接请求报文段,其首部中的
同步位
SYN = 1,并选择序号seq = x,表明传送 数据时的第一个数据字节的序号是x。 - B 的 TCP 收到连接请求报文段后,如同意,则发回确认。
- B 在确认报文段中应使
SYN = 1,使ACK = 1, 其确认号ack = x+1,自己选择的序号seq = y。
- B 在确认报文段中应使
- A 收到此报文段后向 B 给出确认,其
ACK = 1, 确认号ack = y+1,SYN=0。 A 的 TCP 通知上层应用进程,连接已经建立。 - B 的 TCP 收到主机 A 的确认后,也通知其上层应用进程:TCP 连接已经建立。
总结:TCP连接建立过程是三次握手。
2. 为什么A要给B发送第二次确认?
情形:在A不使用第二次确认的情况下。假如,A发送了一次连接建立的请求,这个请求没有得到B的回复(可能是在网络上滞留了,但没有丢失),于是A又发了一次连接建立的请求,并且受到了B的确认,最后建立了连接。数据传输完毕后,A与B都释放了连接。
此时如果A第一次发送的连接建立请求,又到达B,B也给A返回确认,由于之前的连接已经释放,A此时并不会理睬B的确认,但B却认为新的传输连接已经建立了,并一直等待A发送数据,导致B的资源白白浪费。
如果A使用了第二次确认,那么这种情况就可以避免了。
(5.9.2) TCP的连接释放
1. 过程解析
- 数据传输结束后,通信的双方都可释放连接。现在假设 A 的应用进程先向其 TCP 发出连接释放报文段,并停止再发送数据,主动关闭 TCP 连接。A 把连接释放报文段首部的
FIN = 1,其序号seq = u,等待 B 的确认。(FIN = 1, seq = u) - B 发出确认,确认号
ack = u+1,而这个报文段自己的序号seq = v。TCP 服务器进程通知高层应用进程。从 A 到 B(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) - 最后,TCP 连接必须经过时间
2MSL(4分钟)后才真正释放掉。
总结:TCP连接释放过程是四次握手。
2. 时间等待计时器(Time-Wait timer)
A在收到B连接报文段后,必须对此作出确认,然后进入Time-Wait时间长度为2MSL的时间等到状态,A才能变成CLOSED结束状态。
MSL全称Maximum Segment LifeTime,时间为2分钟,为什么设定MSL为2分钟呢?有两个理由!
- ① 为了保证 A 发送的最后一个
ACK报文段能够到达 B。- A发送的最后一次
ACK确认,可能会丢失,导致B又给A发送一个FIN+ACK,但因此时的A处于关闭状态,接受不了B重发的FIN+ACK,导致B的TCP连接因此关闭不了。
- A发送的最后一次
- ② 为了防止
失效的连接请求报文段出现在本次连接中。A 在发送完最后一个ACK报文段后,再经过时间2MSL,就可以使本连接持续的时间内所产生的所有报文段,都从网络中消失。这样就可以使下一个新的连接中不会出现这种旧的连接请求报文段。