『computer network-4』transport layer
传输层
一、传输层协议概述
传输层(应用层)功能:为上面的应用层提供(端到端)通信服务
- 实现可靠传输:差错控制 + 顺序控制 + 拥塞控制
注意:网络层实现主机之间的逻辑通信;传输层实现应用进程之间的逻辑通信(端到端通信)
传输层主要协议:传输控制协议(TCP) + 用户数据报协议(UDP)
- TCP协议:可靠传输协议,典型协议包括HTTP、FTP
- 提供面向连接的服务(传输数据前建立连接 + 传输结束后释放连接)
- 需进行确认、流量控制、计时器、连接管理,处理开销较大
- UDP协议:不可靠传输协议,典型协议包括DNS、RIP
- 传输时无需建立连接
- 比TCP效率更高,但可能出现数据错误、丢包、顺序错误等问题
- TCP协议:可靠传输协议,典型协议包括HTTP、FTP
传输层端口:用于为多个应用进程AP提供服务
端口复用:应用层多个应用进程通过传输层发送数据(向下)
端口分用:传输层收到的数据必须交付给指明的应用进程(向上)
端口号:TCP/IP协议使用16位整数作为端口号,用于表示 源端口号 + 目的端口号
- 熟知端口号(系统端口号):0 ~ 1023,如 HTTP 服务使用80、FTP 服务使用21
- 登记端口号:1024 ~ 49151,提供给没有熟知端口号的AP使用;须在IANA登记(以防重复)
- 客户端口号(短暂端口号):49152 ~ 65535,供客户进程临时使用
二、用户数据报协议 UDP
UDP概述:不可靠传输协议,只在IP数据报服务基础上增加了端口和差错检测,包含以下特点:
- 无连接:发送数据前无需建立连接
- 尽最大努力交付:不保证可靠交付,同时不使用拥塞控制(很适合多媒体通信)
- 支持一对一、一对多、多对一、多对多的交互通信
- 首部开销小,仅有8Byte
UDP首部格式:共8Byte,包含以下5个字段
- 源端口:标注 源端口号(2Byte)
- 目的端口:标注 目的端口号(2Byte)
注意:若接收方的目的端口上没有AP接收数据,则会向源主机返回ICMP的"目的不可达"报文 - 长度:UDP数据报长度(2Byte)
- 校验和:UDP数据报的校验和(2Byte)
- 伪首部:不实际传输,仅在计算校验和时使用(12Byte)
注意:网络传输一般使用Big Endian,源端口号发送在前
计算校验和:计算整个UDP数据报的二进制反码和,计算过程类似网络层IP首部校验和
- 计算校验和前需要添加12Byte的伪首部
- 若UDP数据报长度为奇数字节,先通过零填充将其转化为偶数字节再计算
三、传输控制协议 TCP
TCP概述:可靠传输协议,主要包括以下特点:
面向连接:传输前必须建立连接,数据传输完毕后要释放连接
点对点连接:每条TCP连接仅能有两个端点
可靠交付服务:无差错、不丢失、不重复、按需到达
全双工通信:在一个连接上,通信双方可同时向对方传输数据
面向字节流:AP以数据块为单位与TCP交互,而TCP将数据块视为无结构的字节流
注意:TCP可把过长的数据块划分短一些再发送,也可等积累足够多的字节后再发送TCP对AP一次把多长的报文发送到TCP缓存中是不关心的
TCP根据对方给出的窗口值 + 当前网路拥塞程度决定一个报文段应该包含多少字节 UDP发送的报文段长度是由AP给出的
TCP的连接:TCP把连接看作最基本的抽象;TCP连接是虚连接而非真正的物理连接
- 套接字:TCP连接的端点,socket ::= (IP地址, 端口号)
- TCP连接唯一地由两个端点确定,TCP连接 ::= {(IP1: port1), (IP2: port2)}
四、TCP报文段首部
TCP报文的首部格式
- 源端口 + 目的端口:各占2Byte
- 序号字段:指明本报文段数据首字节的序号,占4Byte;TCP连接的数据流中的每个字节都按顺序编号
- 确认号字段:期望收到对方下一个报文段数据的首字节序号,占4Byte
- 数据偏移:数据部分相较起始位置的偏移(即首部长度),单位为4Byte,占4bit
- 保留字段:无意义,占6bit
- 紧急URG:值取1表示有紧急数据,应尽快传送(紧急数据放在数据的最前面),占1bit
- 确认ACK:值取1时确认号字段有效,占1bit
- 推送PSH:值取1时接收方将尽快向AP交付此报文段,不等到整个缓存填满,占1bit
- 复位FST:值取1时表明TCP连接出现严重差错,须先释放连接再重新建立连接,占1bit
- 同步SYN:值取1时表明这是一个 连接请求 or 连接接受 报文,占1bit
- 终止FIN:值取1时表明要求释放TCP连接,占1bit
- 窗口大小:用以向对方设置发送窗口的依据,单位为字节,占2Byte
- 检验和:伪首部 + 首部 + 数据部分 的校验和,占2Byte
- 紧急指针:指出报文中紧急数据字节数,占2Byte
- 选项:一种选项被称为最大报文段长度,告知对方报文段数据部分最大长度;可变长,最长占40Byte
- 填充字段:为了让整个首部长度是4Byte的整数倍
五、TCP的可靠传输
以字节为单位的滑动窗口:
发送窗口:包含 已发送但未收到确认 + 允许发送但尚未发送 的字节
window_size:由接收方发送过来,实现拥塞控制
ack_num:由接收方发送过来,控制窗口后沿;表示此序号之前的字节已被正确接收
发送窗口前移:收到接收方的ack_num后,将窗口下沿挪至ack_num处
若发送窗口已满,暂停发送
注意:发送窗口的前沿不建议回退收缩(因为收缩部分的数据可能已经被发送出去了)
接收窗口:包含 允许接受 的字节
- 接收窗口前移:收到连续下沿字节后,窗口挪至首个尚未接收的字节处
- 对于未按序收到的字节,先缓存,仅返回窗口下沿对应的ack_num;最后按序交付上层的AP
注意:由于传送窗口值有一定的滞后,故发送窗口和接收窗口不总是一样大
缓存:发送方 和 接收方 均设有缓存,如下图:
超时重传时间的选择:发送方在规定时间内未收到确认,就要重传超时的报文段,直至收到应答
加权平均往返时间\(\text{RTT}_S\):平滑的往返时间,计算方式如下:
- 首次测量到一个RTT样本时,\(\text{RTT}_S\) = RTT
- 之后每测得一个新的RTT样本,更新\(\text{RTT}_S\):\(\text{RTT}_S \gets (1 - \alpha) \times \text{RTT}_S + \alpha \times \text{RTT}\);其中 \(0 \le \alpha \lt 1\),越小更新越慢
超时重传时间RTO:RTO = \(\text{RTT}_S + 4 \times \text{RTT}_D\),其中 \(\text{RTT}_D\) 表示RTT的偏差的加权平均值,计算方式如下:
- 首次测得一个RTT样本时:\(\text{RTT}_D \gets \dfrac{\text{RTT}}{2}\)
- 之后每侧的一个新的RTT样本,更新\(\text{RTT}_D\):\(\text{RTT}_D \gets (1-\beta) \times \text{RTT}_D + \beta \times |\text{RTT}_S - \text{RTT}|\);其中 \(0 \le \beta \le 1\)
注意:RTO 应略大于 \(\text{RTT}_S\)(从公式中也可看出)
六、TCP的流量控制
流量控制的目的:让发送方的发送速率不要太快,使接收方来得及接收
- TCP建立时,接收方将自己接收窗口的大小告知对方(window_size)
- 发送方根据接收方发来的window_size调整发送窗口大小,发送窗口 \(\le\) 接收窗口rwnd
持续计时器:防止接收方发送rwnd=0报文后,接收方发送的窗口报文丢失导致死锁
- TCP为每个连接设置一个持续计时器;只要一方收到对方的零窗口通知、就启动持续计时器
- 若持续计时器设置的时间到,发送方就发送一个零窗口探测报文段(1Byte),对方返回当前窗口值
- 若窗口仍是0,重新设置持续计数器;若窗口不是0(接收缓存腾出了空间),继续发送数据
传输效率:控制TCP报文段的发送时机
- 缓存数据达到一定量就发送:若缓存中的数据累计达到MSS字节,就组装成一个TCP报文发送出去
- 应用进程控制:由发送方AP指明要求发送报文段(push)
- 定时发送:发送方计时器期限到了,就把当前缓存中已有数据装成报文段(\(\le\) MSS)发送出去
七、TCP的拥塞控制
拥塞的产生原因:网络中对某资源的需求超过了该资源所能提供的部分
- 网络资源:链路带宽、路由节点缓存、处理能力 等
注意:网络拥塞是由多种原因导致的,通过简单增加某种资源数量并不能消除拥塞
网络拥塞的表现:吞吐率下降、报文传输时延增大、丢包率增加,响应时间变长(主机未收到ack就说明拥塞了)
注意:TCP重传机制是拥塞恶性循环的起因(网络中被注入了更多报文)慢启动:每收到一个ack,cwnd就加1 \(\Rightarrow\) 每经过一个传输轮次(RTT),cwnd就加倍(逐步增大cwnd)
- 拥塞窗口cwnd:由发送方维持,根据网络的拥塞程度动态变化(无拥塞就增大、有拥塞就减小)
- 慢启动门限ssthresh:防止cwnd增长过快导致拥塞
- cwnd < ssthresh:使用慢启动算法
- cwnd > ssthresh:改用拥塞避免算法
- cwnd = ssthresh:两种算法都可以使用
拥塞避免算法:每经过一个传输轮次(RTT),就把cwnd加1(而非翻倍)
- 拥塞处理:
- 只要发送方判断网络出现拥塞(未按时收到ack),就令 ssthresh \(\gets\) cwnd / 2
- 令 cwnd \(\gets\) 1,并重新执行慢启动算法
- 拥塞处理:
快重传:尽快对超时报文做处理
- 拥塞处理:
- 接收方每收到一个失序的报文段,就只对最近按序接收的报文段回复重复确认
- 若发送方连续接收到3个重复确认,就立即重传对方尚未收到的报文段
- 拥塞处理:
快恢复:跳过慢启动算法,直接执行拥塞避免算法
- 拥塞处理:
- 发送端连续收到3个重复确认时,令 ssthresh \(\gets\) cwnd / 2
- 令 cwnd \(\gets\) ssthresh,直接执行拥塞避免算法
注意:连续收到3个重复确认不代表发生拥塞(仅可能代表拥塞征兆)
- 拥塞处理:
发送窗口的上限值 = min[rwnd, cwnd],由该式可知:
- 当 rwnd < cwnd 时:接收方的接受能力限制发送窗口最大值
- 当 rwnd > cwnd 时:网络拥塞限制发送窗口的最大值
八、TCP的连接管理
TCP传输连接:
- 连接三阶段:连接建立 + 数据传送 + 连接释放
- 客户 / 服务器方式:TCP连接的方式
- 客户:主动发起连接建立的AP
- 服务器:被动等待连接建立的AP
三次握手:TCP建立连接的方式
- 采用3次而非2次握手的原因:2次握手可能导致“已在网络中失效的请求报文”突然又传送到服务器端,建立冗余连接占用资源
- TCP SYN Flooding 攻击:攻击者发送大量SYN报文,但不对返回的SYN
ACK报文做回应,导致挂有大量TCP半连接资源
- 攻击效果:服务器内部资源满,无法相应正常用户的TCP连接请求
- SYN_Cookies:服务器返回SYN_ACK时,根据自身特有信息计算Cookies作为seq返回,并在收到应答前不为其分配资源
连接释放:该过程可由任意一方发起,设A主动关闭连接(FIN)
- MSL:报文最大存活时间,建议2mins
‘
注意:A发送完最后一个ACK后,再经过2MSL就可以让本连接产生的所有报文段都从网络中消失;新连接中不会残留旧连接的报文段