位置/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