《计算机网络》笔记——第五章 运输层
第5章 运输层
概述
为什么需要运输层?
- 两台主机进行通信就是两台主机中的应用进程互相通信.
- 通信的真正端点并不是主机而是主机中的进程.
- 端到端的通信是应用进程之间的通信.
运输层的两个主要协议
- 用户数据报协议UDP(User Datagram Protocol)
- 传输控制协议TCP(Transmission Control Protocol)
UDP不需要先建立连接.
TCP则提供面向连接的服务.
端口
协议端口号(protocol port number),简称端口(port).
-
服务器端使用的端口号
- 熟知端口号(well-known port number)或系统端口号,数值为0~1023.用于最重要的一些应用程序.
- 登记端口号,数值为1024~49151.
-
客户端使用的端口号,数值为49152~65535.动态选择,又称为短暂端口号
用户数据报协议UDP
- 无连接的
- 尽最大努力交付
- 面向报文的.UDP对应用层交下来的报文,既不合并,也不拆分
- 没有堵塞控制.网络出现的堵塞不会使源主机的发送速率降低.
- 支持一对一、一对多、多对一和多对多的交互通信.
- 首部开销小.仅有8字节.
UDP的首部格式
如果接收方发现收到的报文中的目的端口号不正确,就丢弃该报文,并由网际控制报文协议ICMP发送"端口不可达"差错报文给发送方.
上一章中介绍的traceroute工具就是利用非法的UDP端口使接收方返回一个差错报文,从而达到测试的目的.
图中的伪首部是用来计算检验和的.
加上伪首部的目的是,检查IP数据报的源IP地址和目的地址.
UDP的检验和是把首部和数据部分一起检验,而IP数据报只检验它的首部.
若数据部分不是偶数个字节,要填充一个全零字节(不发送).
传输控制协议TCP
- TCP是面向连接的运输层协议.
- 每一条TCP连接只能有两个端点(endpoint)
- TCP提供可靠交付的服务.通过TCP连接传送的数据,无差错、不丢失、不重复,并且按序到达.
- TCP提供全双工通信.TCP连接的两端都设有发送缓存和接收缓存.
- 面向字节流.TCP不关心数据的实际意义,也就是说接收者收到的数据块可能与发送时的大小并不相同(但总体大小不会变).
TCP的连接
TCP连接的端点叫作套接字(socket)或插口.
定义:端口号拼接到(concatenated with)IP地址即构成了套接字.
$套接字socket=(IP:port)$
原来这就是套接字😧
每一条TCP连接唯一地被通信两端的两个端点(即两个套接字)所确定.
$TCP连接::={socket_1,socket_2}={(IP_1:port_1),(IP_2:port_2)}$
可靠传输的工作原理
停止等待协议
上述的这种可靠传输协议常称为自动重传请求ARQ(Automatic Repeat reQuest).
信道利用率
$信道利用率U=\frac{T_D}{T_D+RTT+T_A}$
停止等待协议的信道利用率是极低的.
要实现这种流水线传输,就要使用连续ARQ协议和滑动窗口协议.
连续ARQ协议
接收方一般采用累积确认,收到几个分组后,对按序到达的最后一个分组发送确认.
优点:容易实现,即使确认丢失也不必重传.
缺点:不能向发送方反映出接收方已经正确收到的所有分组的信息.
TCP报文段的首部格式
- 序号:字节流中的每一个字节都按顺序编号,此字段值为本报文段所发送的数据的第一个字节的序号.也叫作"报文段序号".
- 确认号:期望收到对方下一个报文段的第一个数据字节的序号.
- 数据偏移:TCP报文段的数据起始处距离TCP报文段的起始处有多远.实际就是TCP报文段的首部长度."数据偏移"的单位是4字节,所以TCP首部的最大长度是60字节.
- 保留:保留为今后使用,置0.
- 6个控制位.
- 紧急URG(URGent) 表明紧急指针字段有效.插队到本报文段数据的最前面.
- 确认ACK(ACKnowledgment) 表明确认号字段有效.TCP规定连接建立后所有传送的报文段都必须把ACK置1.
- 推送PSH(PuSH) 表明发送方希望尽快得到响应.接收方TCP不再等到缓存填满再向上交付.
- 复位RST(ReSeT) 表明TCP连接中出现严重差错,必须释放连接,再重新建立运输连接.
- 同步SYN(SYNchronization) 在连接建立时用来同步序号.SYN=1且ACK为0时,说明这是一个连接请求报文段.对方若同意连接,则响应的连接接受报文中SYN=1且ACK=1.
- 终止FIN(FINis) 用来释放一个连接.
- 窗口:窗口值作为接收方让发送方设置其发送窗口的依据.明确指出了现在允许对方发送的数据量.窗口值经常在动态变化着.
- 检验和:和UDP的检验和类似,也要加上12字节的伪首部一起计算.
- 紧急指针:指出本报文段中的紧急数据的字节数,即使窗口为0时也可发送紧急数据.
- 选项:长度可变,最长40字节.
- 最大报文段长度MSS(Maximum Segment Size).是每一个TCP报文段中的数据字段的最大长度.默认值为536字节长.
- 窗口扩大.用于传播时延大,带宽大的信道.
- 时间戳.
- 计算往返时间RTT
- 防止序号绕回PAWS(Protect Against Wrapped Sequence numbers).处理TCP序号超过$2^{32}$的情况.
TCP可靠传输的实现
滑动窗口
超时重传时间(RTO)的选择
超时重传时间RTO(RetransmissionTime-Out).
修正的Karn算法:
-
若报文段没有重传:
计算平滑往返时间$RTT_S$公式:
$新RTT_S=(1-\alpha)\times(旧RTT_S)+\alpha\times(新RTT样本)$
$\alpha$推荐值为1/8,即0.125.
计算RTT的偏差的加权平均值$RTT_D$公式:
$新RTT_D=(1-\beta)\times(旧RTT_D)+\beta\times\vert RTT_S-新RTT样本\vert$
$\beta$的推荐值为1/4,即0.25.
计算超时重传时间RTO公式:
$RTO=RTT_S+4\times RTT_D$
-
若报文段重传了:
报文段每重传一次,就把RTO增大一些.典型的做法是取2倍.当不再发生报文段重传时,才根据上面给出的公式计算RTO.
选择确认SACK
选择确认(Selective ACK)
一种只传送缺少的数据而不重传已经正确到达接收方的数据的方法.
建立TCP连接时需要启用SACK选项.
因为选项长度最大为40字节,所以最多指明4个字节块的边界信息.
4个字节块有8个边界,占用32字节,还需要两个字节,一个用来指明是SACK选项,另一个指明这个选项占用多少字节.
TCP的流量控制
利用滑动窗口实现流量控制
如果接收方发送零窗口报文段后,又发送了非零窗口报文段,但是这个报文段丢失了,发送方将继续等待非零窗口报文段,接收方也会等待发送方的数据报文段.导致死锁.
解决方法:
在每个连接设置一个持续计时器(persistence timer),只要一方收到零窗口通知,就启动计时器.到时后就发送一个"零窗口探测报文段",对方必须回应,直到窗口不再为0为止.
[!NOTE]
TCP规定,即使设置为零窗口,也必须接收以下几种报文段:零窗口探测报文段、确认报文段和携带紧急数据的报文段.
TCP的传输效率
发送方逐字节发送问题:
每发送一个字节,就要为首部的大小付出很大的代价.
所以经尝使用Nagle算法:
发送第一个字节,然后缓存之后的字节,等收到第一个字节的确认后,再把缓存中的所有数据组装为一个报文段发送出去,然后继续等待前一个报文段的确认,如此往复.
适用于数据到达较快而网络速率较慢的情况.
糊涂窗口综合征(silly window syndrome):
假设TCP接收方的缓存已满,但是接收方进程每次只读取一个字节,这样只能腾出一个字节的空间,发送方也只能发送一个字节,如此循环会降低网络效率.
解决方法是:让接收方等待一段时间,等接收缓存已有一半空闲的空间再发送确认报文.
其实这两个问题是相似的.
一个是发送进程发送太慢,缓存区每次只能发送很少的字节.
另一个则是接收进程接收太慢,缓冲区空闲空间不足.
一旦理解了问题的关键,解决办法也就不难了.
TCP的拥塞控制
拥塞(congestion).
TCP的拥塞控制方法
发送方维持一个叫作拥塞窗口cwnd(congestion window)的状态变量.
发送方让自己的发送窗口等于拥塞窗口.
判断网络拥塞的依据就是出现了超时.
算法有四种:
- 慢开始(slow-start).
- 拥塞避免(congestion avoidance).
- 快重传(fast retransmit).
- 快恢复(fast recovery).
慢开始算法的思路:
由小到大逐渐增大发送窗口.
一般把初始阻塞窗口cwnd设置为不超过2至4个发送方的最大报文段SMSS(Sender Maximum Segment Size)的数值.
每收到一个对新的报文段的确认后,可以把阻塞窗口增加最多一个SMSS的数值.
$阻塞窗口cwnd每次的增加量=\min(N,SMSS)$
其中N是新确认的字节数.
慢开始算法会使cwnd加倍增长.
为了防止cwnd增长过大引起网络阻塞,还需要依据慢开始门限ssthresh状态变量.
- cwnd < ssthresh时,使用慢开始
- cwnd > ssthresh时,使用拥塞避免算法.
- cwnd = ssthresh时,都可以使用
拥塞避免的思路:
每经过一个往返时间RTT就把cwnd加1.
拥塞避免算法会让cwnd线性增长.
快重传算法:
接收方必须立即发送确认,当发送方收到3个重复的确认时,就认为下一个报文段已经丢失,就立即进行重传.
快恢复算法:
调整门限值ssthresh=cwnd/2
cwnd=ssthresh.
开始执行拥塞避免算法.
对点4的解释可以参考下图.
点4中发送方接收到了3个重复的确认,因此根据快重传算法,发送方将立即重传丢失的报文段.
因为只是丢失了部分报文段,不使用慢开始而是使用快恢复算法.
如果将本节讨论的拥塞控制和流量控制一起考虑,那么
$发送方窗口的上限值=\min(rwnd,cwnd)$
其中rwnd是接收方窗口,由流量控制决定.
cwnd是拥塞窗口,由拥塞控制决定.
主动队列管理AQM
AQM(Active Queue Management).
没有AQM的路由器在队列满时会不得不丢弃后来的所有报文.
这样会同时影响很多条TCP连接,使许多TCP连接在同一时间进入慢开始状态,这称为全局同步(global syncronization).
AQM就是提前主动丢弃到达的分组,提醒发送方放慢速率.
一种流行的实现是随机早期检测RED(Random Early Detection).
但因为现在已经不再使用,这里就不记了.
TCP的运输连接管理
所谓运输连接的管理就是使运输连接的建立和释放都能正常地进行.
TCP连接的建立采用客户服务器方式.
主动发起连接建立的应用进程叫作客户(client).
被动等待连接建立的应用进程叫作服务器(server).
TCP的连接建立
三报文握手:
TCP的连接释放
四报文握手:
TCP还设有一个保活计时器(keepalive timer).
若两小时没有收到客户的数据,就每隔75秒发送一个探测报文段.若发送10个后仍未收到客户的响应,服务器就认为客户端出现故障,关闭连接.
TCP的有限状态机
本文作者:yuzujr
本文链接:https://www.cnblogs.com/yuzujr/p/18697009
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步