位置/scheduler.go

函数名sendPacket(s *session)

输入session,输出error

1.更新未确认的ack包

用方法GetLeastUnacked()来找最新未确认的包

2.触发流控制器以增加流控制窗口

如果需要,此调用将触发流控制器以增加流控制窗口

用方法windowUpdateFrames()来增加窗口

3.一个大循环发送数据,至自发送完毕

3.1获取是否需要重传,获取是否需要握手重传,获取frompth

3.2获取Stream是否需要重传

3.3selectPath选路径

3.4若没有路径可用getWindowUpdateFrames,则发错误消息

3.5若有握手重传,则直接执行

sentPacketHandler

3.6自动生成ACK

获取ack,通过pth.GetAckFrame()

3.6.1ack不为空,则向路径中加ack

3.6.2ack不为空且Stream流重传为真,GetStopWaitingFrame

3.6.3向path中加各种帧

如果有的话,还可以添加CLOSE_PATH frames

如果有的话,还可以添加ADDRESS frames

如果有的话,还可以添加PATHS frames

3.7执行发数据包performPacketSending

3.7.1发完,要置空windowUpdateFrames = nil

3.7.2防止发空包的处理

3.8当在未知执行路径上发送时出现重复通信

适应连接过程中出现的新路径

3.8.1当pth.rttStats.SmoothedRTT() == 0

包是否在所有可能的路径上重复?

复制它

3.8.2并尝试ping可能失败的路径

当fromPth不为空且fromPth有可能失败时,输出error