第 6 章 传输层
6.1 传输层概述
6.1.1 进程之间的通信
传输层主要功能:为端节点上不同应用进程间提供端到端的数据传输服务。
需要对不同进程进行编号:端口号
网络环境下标识一个应用进程采用二元组 IP地址 + 端口号
IP 协议的作用范围 (提供主机之间的逻辑通信)
TCP 和 UDP 协议的作用范围 (提供进程之间的逻辑通信)
传输层对不同应用进程的编号(编址):端口号(port) ,术语称为TSAP(传输层服务访问点,Transport Service Access Point。
端口复用和分用
6.1.2 传输层的两个主要协议
UDP协议:提供无连接服务,在传输层建立一条不可靠通信信道。
TCP:提供面向连接服务,尽管下面网络层是提供尽最大努力交付服务,但 TCP协议实体通过软件在传输层提供一条全双工的可靠端到端通信信道
传输层两个对等实体在通信时传送的数据单位叫作传输层协议数据单元TPDU (Transport Protocol Data Unit)。
两端节点必须调用同一个传输层协议实体;
TCP 产生的协议数据单元是 TCP报文段(segment)
UDP 产生协议数据单元是 UDP报文或用户数据报。
TCP 不提供广播或组播服务,仅支持单播通信。
通信双方发送UDP用户数据报之前不需要先建立连接;
接收方接收到UDP报文后,只检错,不给出任何确认。
虽然 UDP 不提供可靠通信,但满足了一定实时通信服务需求,主要用于多媒体通信应用。 支持单播、广播和组播通信;
TCP协议在通信时首先要通过三次握手建立一个TCP连接?,
建立连接是在传输层完成,路由器无法感知;
6.1.3 传输层的端口
端口号是一个 16 比特位二进制数
端口号具有本地含义。
发送方应用层的各种应用进程都能将其数据通过源端口号向下交付给传输层; - 端口复用 接收方传输层根据接收到的数据单元首部中的目的端口号向上交付给应用层相应的应用进程。-端口分用
五元组标识通信双方:源IP、源port +目的IP、目的port +协议
服务器端口号
周知端口号:数值一般为 0~1023,IANA组织管理和分配。
注册端口号:数值为1024~49151,为没有熟知端口号的应用服务器程序使用;这个范围的端口号必须在 IANA 登记, 以防止重复使用
客户端口号(或动态端口号):数值为49152~65535,留给客户应用程序暂时使用,由操作系统临时分配。
SNMP采用UDP协议在管理端和agent之间传输信息。 SNMP采用UDP 161端口接收和发送请求,162端口接收trap,执行SNMP的设备缺省都必须采用这些端口。SNMP消息全部通过UDP端口161接收,只有Trap信息采用UDP端口162。
FTP的端口号一个是数据端口,一个是控制端口,控制端口一般为21,而数据端口不一定是20,这和FTP的应用模式有关,如果是主动模式,应该为20,如果为被动模式,由服务器端和客户端协商而定
有一张服务器周知端口号的表
6.2 用户数据报协议 UDP
6.2.1 UDP 概述
用户数据报协议UDP在IP协议(无连接数据传输服务)基础上,增加了端口号和差错检测(可选)功能,提供端到端进程不可靠传输。
首部只有8个字节, TCP首部至少要20个字节。
在航空航天领域某些应用既需要实时性,也需要可靠性。
解决方法:采用UDP协议,在不影响实时通信前提下,在应用层增加一些简单的可靠性措施,如对丢失UDP用户数据报进行简单重发;
不提供拥塞控制,网络发生拥塞发送端不会降低发送速率,此时网络会出现什么现象? 如果网络发生拥塞,TCP有拥塞控制机制,会适当的降低发送方发送速率;UDP协议发送速率不会降低,造成网络中存在大量UDP报文UDP/TCP通信的不公平现象。
长度:用户数据报长度,包括UDP头+数据,以字节为单位,最小为8个字节(UDP头长度).
伪首部里的UDP长度:UDP数据报长度, 与”长度”字段相同
计算检验和时,临时把“伪首部”和 UDP 用户数据报连接在一起计算:伪首部+UDP首部+数据
伪首部仅仅是为了计算校验和,计算结束后丢弃。
伪首部与IP分组头内容相同
计算检验和(checksum)的过程很关键,主要分为以下几个步骤:
1.把伪首部添加到UDP上;
2.计算初始时是需要将检验和字段添零的;
3.把所有位划分为16位(2字节)的字
4.把所有16位的字相加,如果遇到进位,则将高于16位的进位部分的值加到最低位上,举例,0xBB5E+0xFCED=0x1 B84B,则将1放到最低位,得到结果是0xB84C
5.将所有字相加得到的结果应该为一个16位的数,将该数取反则可以得到检验和checksum。
UDP进程实体接收数据报时,首先检查校验字段(可选),如果出错,丢弃但不发送ICMP差错报告;
否则,UDP实体根据目的端口号查找对应的入队列;
如果找到, 则将数据放入相应接收队列,向上层交付按照原始数据大小交付。
否则丢弃, 并向源端发送一个“端口不可达”的ICMP差错报告报文;
当接收队列已满时, 数据也要丢弃, 并向源端发送一个“端口不可达”的 ICMP差错报告报文; 多个客户向一个服务器发送用户数据 报,都在同一服务器入队列统一接收排队。
6.2.2 UDP的首部格式
6.3 传输控制协议 TCP 概述
TCP连接是一个虚连接,不是真真的物理连接;
每一条 TCP 连接只能有两个端节点(end-point),每一条 TCP 连接只能是一对一通信(单播通信)。
TCP 提供传输层可靠通信服务。
差错控制:序号+确认+超时重发;
流量控制:采用可变大小的滑动窗口机制 :连续ARQ协议
拥塞控制:慢启动、拥塞避免、快速重传、快速恢复
TCP 提供全双工通信。
面向字节流,对TCP数据段中数据部分每一个字节都编有序号。
TCP 会根据接收方给出窗口值、当前网络拥塞程度和MSS来决定一个报文段应包含多少个字节(UDP 发送的报文长度是应用进程确定)。
源端口、目的端口:各占 2 字节
端口是传输层提供给应用层的TSAP地址;
传输层复用和分用功能都要通过端口号实现。
序号:占 4 字节。
TCP 连接中传送的数据流(字节流)中每一个字节都编上一个序号。
含义:TCP数据段的数据字段第一个字节在字节流中相对序号。
如果协商A发送的初始序号为0,数据长度100字节。
字节流第1个字节序号从0+1=1开始;
四个TCP报文段序号:1,101,201,301
确认号:占 4 字节
含义:接收方希望收到发送方发送的下一个TCP段数据第一个字节序号,ACK = 1情况下有效。
如果确认号=N,表示N-1号以前字节已经成功接收到,期望接收到的下一个TCP 段数据第一个字节序号为N;实际上等于期望接收的下一个TCP段序号字段为N
数据偏移(首部长度):占 4 bit
含义:TCP报文段首部长度,以4 字节为计算单位;最大值为60字节.
首部长度范围:20~60个字节;选项字段范围:0~40字节。
紧急比特 URG (用来插队):当 URG 1 时,表明紧急指针字段有效, 报文段中有紧急数据,应尽快传送(相当于高优先级的数据),紧急数据在数据字段的位置由紧急指针(urgent pointer)字段给出。
推送比特 PSH (PUSH操作)
发送方Push=1,发送缓冲区即使有发送窗口限制,也要立即发送;
接收方TCP 收到Push=1的数据不需要在接收缓冲区中排队,可尽快地交付给应用进程。
应用层在数据发送完成前, 无法知道自身递交的数据是否已被发送 (如下班前突然关机)。
解决方法:如果发送方TCP接收到上层PUSH操作,可使TCP将出队列所有数据迅速地分段发送出去, 不受发送方当前发送窗口大小限制。 接收方TCP接收到带PSH标志的TCP数据段后, 将迅速把这些数据段快速递交给上层协议,而不用在接收缓存中排队。
当 RST 1 时,表明 TCP 连接中出现严重差错,对错误连接复位 ,重新回到初始状态。
同步比特 SYN :SYN 置为 1,就表示这是一个TCP连接请求。
终止比特 FIN (FINal) :FIN 1 时,表明发送方的数据已发送完毕,要求释放TCP连接,该 TCP报文段是一个释放连接请求。
窗口(接收窗口有效大小):占 2 字节。
含义:接收方通知发送方接收缓存的有效大小,单位为字节。
目的:发送方接收到对方“窗口信息”后,通过调整发送方发送窗口 大小,控制发送速率,实现端到端流量控制
校验和:占 2 字节。
检验和范围: TCP伪首部( 12 字节)+ TCP首部 + 数据。
TCP伪首部:源IP地址+目的IP地址+1字节保留(全0)+协议号(TCP=6 )+TCP首部长度字段,共为12个字节。
方法:简单校验和,与IP协议(UDP协议)计算校验和方法相同。
紧急数据一般放在TCP报文段数据最前面。
序号+紧急指针字段的值-1:本TCP段中的紧急数据最后一个字节序号。
举例 假设发送方正在发送数据,然后等待接收方处理结果返回;
发送方突然发现有错误,希望将此过程异常终止;如果此时发送终止命令(Control+C),这两个字符必然排在接收方队列尾,等所有数据处理完 ,才将这两个字符交上层.
解决方法 发送方将URG比特置1,告诉TCP该数据为紧急数据,发送端TCP将该含有紧急数据数据块就安排在发送队列队首,以便尽快发送出去;
接收方TCP收到URG=1的报文段后,利用紧急指针的值将该段中紧急数据提取出来,并不按缓冲排队顺序,提前交给应用进程处理,避免对错误数据处理。
MSS (Maximum Segment Size) 是 TCP 报文段中的数据字段的最大长度。 数据字段加上 TCP 首部才等于整个的 TCP 报文段。
假设传送一个字节数据,在网络层数据传输效率率1/41(不包括链路层开销).?网络层首部20字节,传输层首部20字节
一般认为MSS尽可能大,只要在IP层不分片就可以了。
建立连接时,双方都要将自己可支持的MSS写入可选字段进行协商;通信时两个方向的MSS可以不同。
如果主机没填写选项MSS字段,目前在Internet,MSS一般采用默认值为536字节, 传输层默认TCP报文段长为:536+20(固定首部)=556个字节。
注意:由于IP分组是独立路由,不同分组每次选择的路径可能不同,在某一条路径上按确定的MSS不需要分片,但改选另一条路径可能需要分片,所以最佳的MSS很难确定。
窗口扩大选项 ——占 3 字节,其中有一个字节表示移位值 S;新的窗口值等于TCP 首部中的窗口位数增大到 (16 + S比特,S最大为14),相当于把窗口值向左移动 S 位后获得实际的窗口大小。
计算往返时间RTT:发送方发送TCP段时,把发送时间写在时间戳字段;接收方发送其确认应答报文段时,将时间戳字段值复制到时间戳回送应答字段,发送方可计算RTT;
防止序号绕回:一次TCP连接中,序号(32比特)很可能重复, 如果发送速率为1Gb/s,不到35秒序号就会重复,为了使接收方能将新报文段与延迟报文段分开,可利用时间戳区分。
选择确认选项——在后面的 6.6.3 节介绍。?SACK
附录:我的听课笔记
TCP协议工作在操作系统内核,操作系统分配初始序号是随机的。
累积应答
RTT难以测量RTT:发送方发送完一个TCP报文段最后一个字节开始计时,到收到对该报文段ACK应答为止的一段时间。
解决RTT难以测量算法(利用以前的历史RTT时间估计出当前RTT时间)
TCP标准强烈不赞成发送窗口前沿向后收缩,后沿绝对不能后退
网络攻击的方法:预测序号
6.4 TCP 报文段的首部格式,TCP通信三个阶段
TCP协议通信三个阶段
TCP 通信采用客户/服务器方式
TCP 标准规定1:SYN置1的报文消耗一个序号;
TCP 标准规定2:单独的确认报文不消耗序号;
命令:netstat –a,可查看本机连接状态
6.5 传输层可靠传输工作原理
ACK=1,确认序号有效, ACKn = N;
假设发送方和接收方协商的初始序号别为:x,y。
发送方和接收方开始发送的数据序号分别为: x+1,y+1。
确定重发定时器的超时时间RTO:一般时间设置为稍大于RTT,由于网络负载随时变化,分组独立路由 ,很难精确测量到RTT(Round Trip Time).
变化频繁与否与阿尔法、贝塔取值有关,实践证明不频繁
RTT时间测试相当复杂
ACK是原还是重传
Karn 算法
计算RTT样本时,只要TCP报文段重传了,就不采用该TCP 报文段(包括重发的TCP报文段)往返时间样本。
产生新问题:网络拥塞导致RTO时间无法更新
新解决:每重传一次,就把 RTO 增大一些。当不再发生TCP报文段的重发时,才根据报文段的 往返时延更新平均往返时延 RTTs 和超时重传时间 RTO 的数值。
6.5.1 停止等待协议
6.5.2 连续 ARQ 协议 (也称为流水线传输)
方法一:后退 N协议TCP标准协议支持;
把3号(包括)后面所有TCP报文段再重传一次,这就叫做 Goback-N(后退 N协议)。 当通信线路质量不好时,后退 N协议会带来负面的影响,网络中存在重复的TCP报文段。 方法二:仅把出错的TCP报文段(3号)重发;- 选择重法协议
TCP标准协议不支持;需要对其功能扩展才能实现
有些TCP协议实现时采用选择确认(SACK-选择ACK确认选项);
6.6 TCP 可靠传输的实现
6.6.1 以字节为单位的滑动窗口
可能发生死锁 (1) ACK=1,ACKN=44,WIN=20;(2) ACK=1, ACKN=54, WIN=20两个全部丢失
发送方等待收到接收方非零窗口通知,接收方等待发送方发送数据
问题解决:引入坚持定时器(只要发送方检测到自己死锁,启用坚持定时器)
坚持定时器的初始超时时间设置为重传定时器两倍
客户进程故障,服务器TCP连接永远打开,占用系统资源
服务器上每个连接引入保活定时器
保活定时器初始超时时间一般设置为2小时
6.6.2 超时重传时间的选择
6.6.3 选择确认 SACK
连续字节块的边界(左右边界各4个字节)。
指明一个连续字节块要用 8 字节,因此在选项中最多只能指明 4 个连续字节块的边界信息(共34个字节)。,需要一个字节指明 要采用SACK选项,另一字节指明该选项实际占用的字节个数。首部”选项“的长度最多只有 40 字节
6.7 TCP的流量控制
TCP两端两个发送窗口经常处于动态变化之中,而接收窗口初始大小相对固定不变。
理想情况是发送窗口大小要小于等于接收窗口;
实际流量控制(带差错控制) 发送窗口动态调整
发送和接收缓存和序号(32比特)都是有限的,一般采用循环使用,所以最好将缓存画为环形。
发送或接收窗口只需对相关三个指针进行维护即可。
6.7.1 利用滑动窗口实现流量控制
TCP窗口计算单位是字节,而不是TCP段;
在发送完一个TCP报文段后,必须暂时保留已发送的TCP报文段,以备重发时使用;只有接收到响应确认后才可清除 该TCP报文段。
6.7.1 必须考虑传输效率
TCP报文段的发送时机
第一种机制:触发方式 发送方维持一个变量-MSS(最大报文段长度 ),只要发送窗口中存放的数据达到 MSS 字节时,就封装成一个 TCP 报文段发送出去。
第二种机制:周期方式 发送方维护一个发送定时器,周期性把当前发送窗口数据封装为不同TCP报文段(但数据长度不能超过 MSS)发送出去。
第三种机制:PUSH方式 由发送方的应用进程指明采用推送(push)操作,发送方将发送缓存中数据封装成不同 TCP 报文段发送出去。
6.8 TCP 的拥塞控制
6.8.1 拥塞控制的一般原理
网络资源:网络交换设备的链路容量(带宽)、 缓存和处理器等。
举例1:如果光纤网络带宽为10Gb/s,仅有计算机A以1Gb/s向B发送数据;网络本身 带宽足够大,不存在拥塞控制问题,但流量控制是必须, 必须控制A的发送速率。
6.8.2 几种拥塞控制方法
慢启动和拥塞避免算法的实现举例 这张图是如何画的?
6.8.3 随机早期检测 RED
RED 将路由器的接收缓存队列划分成为三个区域
算法将队列的平均队长作为决定拥塞避免机制是否应被处罚的随机函数的参数,增加了在队列长度变得太大之前平滑瞬时拥塞的可能性,减少了同时使多个流受分组丢弃影响的可能性。
6.9 TCP 的连接管理
6.9.1 TCP 的连接建立
(1)要使一方能够确知道对方应用进程存在。
(2)允许双方协商一些参数(如最大报文段长度 MSS,最大窗口大小,初始序号、是否采用SACK 以及其他服务质量参数等)。
(3)对网络资源(如缓存,各种定时间器:如重发,坚持、保活;连接状态表)进行分配和初 始化。
TCP协议为什么通过三次握手建立一个TCP连接?
为什么不是通过两次握手建立一 个TCP连接? (1) 浪费网络资源;(2)引起安全问题。
目的:防止”已延迟TCP连接请求”发送给对方。
A发送了两个连接请求报文,其中有一个有效.(暂且假设为第二个) 2) 第一个TCP连接请求在网络传输延迟时间长;
三次握手:A与B通信时,接收到延迟的第一个连接请求解决方法:序号不在接收窗口内,重复段丢弃!
三次握手是原子操作,A没有发送应答给B,原子操作失败, 连接无法建立。
6.9.2 TCP 的连接释放
TCP 连接必须经过时间 2MSL 后才真正释放掉
TCP 标准规定:FIN置1的报文消耗一个序号,不能携带数据
6.9.3 TCP 的有限状态机
附录我的笔记
TCP协议核心是序号