kcp.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765
  1. // Package kcp - A Fast and Reliable ARQ Protocol
  2. //
  3. // Acknowledgement:
  4. // skywind3000@github for inventing the KCP protocol
  5. // xtaci@github for translating to Golang
  6. package kcp
  7. import (
  8. "encoding/binary"
  9. "github.com/v2ray/v2ray-core/common/alloc"
  10. )
  11. const (
  12. IKCP_RTO_NDL = 30 // no delay min rto
  13. IKCP_RTO_MIN = 100 // normal min rto
  14. IKCP_RTO_DEF = 200
  15. IKCP_RTO_MAX = 60000
  16. IKCP_CMD_PUSH = 81 // cmd: push data
  17. IKCP_CMD_ACK = 82 // cmd: ack
  18. IKCP_CMD_WASK = 83 // cmd: window probe (ask)
  19. IKCP_CMD_WINS = 84 // cmd: window size (tell)
  20. IKCP_ASK_SEND = 1 // need to send IKCP_CMD_WASK
  21. IKCP_ASK_TELL = 2 // need to send IKCP_CMD_WINS
  22. IKCP_WND_SND = 32
  23. IKCP_WND_RCV = 32
  24. IKCP_MTU_DEF = 1350
  25. IKCP_ACK_FAST = 3
  26. IKCP_INTERVAL = 100
  27. IKCP_OVERHEAD = 24
  28. IKCP_DEADLINK = 20
  29. IKCP_THRESH_INIT = 2
  30. IKCP_THRESH_MIN = 2
  31. IKCP_PROBE_INIT = 7000 // 7 secs to probe window size
  32. IKCP_PROBE_LIMIT = 120000 // up to 120 secs to probe window
  33. )
  34. // Output is a closure which captures conn and calls conn.Write
  35. type Output func(buf []byte)
  36. /* encode 8 bits unsigned int */
  37. func ikcp_encode8u(p []byte, c byte) []byte {
  38. p[0] = c
  39. return p[1:]
  40. }
  41. /* decode 8 bits unsigned int */
  42. func ikcp_decode8u(p []byte, c *byte) []byte {
  43. *c = p[0]
  44. return p[1:]
  45. }
  46. /* encode 16 bits unsigned int (lsb) */
  47. func ikcp_encode16u(p []byte, w uint16) []byte {
  48. binary.LittleEndian.PutUint16(p, w)
  49. return p[2:]
  50. }
  51. /* decode 16 bits unsigned int (lsb) */
  52. func ikcp_decode16u(p []byte, w *uint16) []byte {
  53. *w = binary.LittleEndian.Uint16(p)
  54. return p[2:]
  55. }
  56. /* encode 32 bits unsigned int (lsb) */
  57. func ikcp_encode32u(p []byte, l uint32) []byte {
  58. binary.LittleEndian.PutUint32(p, l)
  59. return p[4:]
  60. }
  61. /* decode 32 bits unsigned int (lsb) */
  62. func ikcp_decode32u(p []byte, l *uint32) []byte {
  63. *l = binary.LittleEndian.Uint32(p)
  64. return p[4:]
  65. }
  66. func _imin_(a, b uint32) uint32 {
  67. if a <= b {
  68. return a
  69. } else {
  70. return b
  71. }
  72. }
  73. func _imax_(a, b uint32) uint32 {
  74. if a >= b {
  75. return a
  76. } else {
  77. return b
  78. }
  79. }
  80. func _itimediff(later, earlier uint32) int32 {
  81. return (int32)(later - earlier)
  82. }
  83. // Segment defines a KCP segment
  84. type Segment struct {
  85. conv uint32
  86. cmd uint32
  87. frg uint32
  88. wnd uint32
  89. ts uint32
  90. sn uint32
  91. una uint32
  92. resendts uint32
  93. fastack uint32
  94. xmit uint32
  95. data *alloc.Buffer
  96. }
  97. // encode a segment into buffer
  98. func (seg *Segment) encode(ptr []byte) []byte {
  99. ptr = ikcp_encode32u(ptr, seg.conv)
  100. ptr = ikcp_encode8u(ptr, uint8(seg.cmd))
  101. ptr = ikcp_encode8u(ptr, uint8(seg.frg))
  102. ptr = ikcp_encode16u(ptr, uint16(seg.wnd))
  103. ptr = ikcp_encode32u(ptr, seg.ts)
  104. ptr = ikcp_encode32u(ptr, seg.sn)
  105. ptr = ikcp_encode32u(ptr, seg.una)
  106. ptr = ikcp_encode16u(ptr, uint16(seg.data.Len()))
  107. return ptr
  108. }
  109. func (this *Segment) Release() {
  110. this.data.Release()
  111. this.data = nil
  112. }
  113. // NewSegment creates a KCP segment
  114. func NewSegment() *Segment {
  115. return &Segment{
  116. data: alloc.NewSmallBuffer().Clear(),
  117. }
  118. }
  119. // KCP defines a single KCP connection
  120. type KCP struct {
  121. conv, mtu, mss, state uint32
  122. snd_una, snd_nxt, rcv_nxt uint32
  123. ts_recent, ts_lastack, ssthresh uint32
  124. rx_rttvar, rx_srtt, rx_rto uint32
  125. snd_wnd, rcv_wnd, rmt_wnd, cwnd, probe uint32
  126. current, interval, ts_flush, xmit uint32
  127. updated bool
  128. ts_probe, probe_wait uint32
  129. dead_link, incr uint32
  130. snd_queue *SendingQueue
  131. rcv_queue []*Segment
  132. snd_buf []*Segment
  133. rcv_buf *ReceivingWindow
  134. acklist []uint32
  135. buffer []byte
  136. fastresend int32
  137. congestionControl bool
  138. output Output
  139. }
  140. // NewKCP create a new kcp control object, 'conv' must equal in two endpoint
  141. // from the same connection.
  142. func NewKCP(conv uint32, mtu uint32, sendingWindowSize uint32, receivingWindowSize uint32, sendingQueueSize uint32, output Output) *KCP {
  143. kcp := new(KCP)
  144. kcp.conv = conv
  145. kcp.snd_wnd = sendingWindowSize
  146. kcp.rcv_wnd = receivingWindowSize
  147. kcp.rmt_wnd = IKCP_WND_RCV
  148. kcp.mtu = mtu
  149. kcp.mss = kcp.mtu - IKCP_OVERHEAD
  150. kcp.buffer = make([]byte, (kcp.mtu+IKCP_OVERHEAD)*3)
  151. kcp.rx_rto = IKCP_RTO_DEF
  152. kcp.interval = IKCP_INTERVAL
  153. kcp.ts_flush = IKCP_INTERVAL
  154. kcp.ssthresh = IKCP_THRESH_INIT
  155. kcp.dead_link = IKCP_DEADLINK
  156. kcp.output = output
  157. kcp.rcv_buf = NewReceivingWindow(receivingWindowSize)
  158. kcp.snd_queue = NewSendingQueue(sendingQueueSize)
  159. return kcp
  160. }
  161. // Recv is user/upper level recv: returns size, returns below zero for EAGAIN
  162. func (kcp *KCP) Recv(buffer []byte) (n int) {
  163. if len(kcp.rcv_queue) == 0 {
  164. return -1
  165. }
  166. var fast_recover bool
  167. if len(kcp.rcv_queue) >= int(kcp.rcv_wnd) {
  168. fast_recover = true
  169. }
  170. // merge fragment
  171. count := 0
  172. for _, seg := range kcp.rcv_queue {
  173. dataLen := seg.data.Len()
  174. if dataLen > len(buffer) {
  175. break
  176. }
  177. copy(buffer, seg.data.Value)
  178. seg.Release()
  179. buffer = buffer[dataLen:]
  180. n += dataLen
  181. count++
  182. }
  183. kcp.rcv_queue = kcp.rcv_queue[count:]
  184. kcp.DumpReceivingBuf()
  185. // fast recover
  186. if len(kcp.rcv_queue) < int(kcp.rcv_wnd) && fast_recover {
  187. // ready to send back IKCP_CMD_WINS in ikcp_flush
  188. // tell remote my window size
  189. kcp.probe |= IKCP_ASK_TELL
  190. }
  191. return
  192. }
  193. // DumpReceivingBuf moves available data from rcv_buf -> rcv_queue
  194. // @Private
  195. func (kcp *KCP) DumpReceivingBuf() {
  196. for {
  197. seg := kcp.rcv_buf.RemoveFirst()
  198. if seg == nil {
  199. break
  200. }
  201. kcp.rcv_queue = append(kcp.rcv_queue, seg)
  202. kcp.rcv_buf.Advance()
  203. kcp.rcv_nxt++
  204. }
  205. }
  206. // Send is user/upper level send, returns below zero for error
  207. func (kcp *KCP) Send(buffer []byte) int {
  208. nBytes := 0
  209. for len(buffer) > 0 && !kcp.snd_queue.IsFull() {
  210. var size int
  211. if len(buffer) > int(kcp.mss) {
  212. size = int(kcp.mss)
  213. } else {
  214. size = len(buffer)
  215. }
  216. seg := NewSegment()
  217. seg.data.Append(buffer[:size])
  218. kcp.snd_queue.Push(seg)
  219. buffer = buffer[size:]
  220. nBytes += size
  221. }
  222. return nBytes
  223. }
  224. // https://tools.ietf.org/html/rfc6298
  225. func (kcp *KCP) update_ack(rtt int32) {
  226. var rto uint32 = 0
  227. if kcp.rx_srtt == 0 {
  228. kcp.rx_srtt = uint32(rtt)
  229. kcp.rx_rttvar = uint32(rtt) / 2
  230. } else {
  231. delta := rtt - int32(kcp.rx_srtt)
  232. if delta < 0 {
  233. delta = -delta
  234. }
  235. kcp.rx_rttvar = (3*kcp.rx_rttvar + uint32(delta)) / 4
  236. kcp.rx_srtt = (7*kcp.rx_srtt + uint32(rtt)) / 8
  237. if kcp.rx_srtt < 1 {
  238. kcp.rx_srtt = 1
  239. }
  240. }
  241. rto = kcp.rx_srtt + _imax_(kcp.interval, 4*kcp.rx_rttvar)
  242. if rto > IKCP_RTO_MAX {
  243. rto = IKCP_RTO_MAX
  244. }
  245. kcp.rx_rto = rto
  246. }
  247. func (kcp *KCP) shrink_buf() {
  248. if len(kcp.snd_buf) > 0 {
  249. seg := kcp.snd_buf[0]
  250. kcp.snd_una = seg.sn
  251. } else {
  252. kcp.snd_una = kcp.snd_nxt
  253. }
  254. }
  255. func (kcp *KCP) parse_ack(sn uint32) {
  256. if _itimediff(sn, kcp.snd_una) < 0 || _itimediff(sn, kcp.snd_nxt) >= 0 {
  257. return
  258. }
  259. for k, seg := range kcp.snd_buf {
  260. if sn == seg.sn {
  261. kcp.snd_buf = append(kcp.snd_buf[:k], kcp.snd_buf[k+1:]...)
  262. seg.Release()
  263. break
  264. }
  265. if _itimediff(sn, seg.sn) < 0 {
  266. break
  267. }
  268. }
  269. }
  270. func (kcp *KCP) parse_fastack(sn uint32) {
  271. if _itimediff(sn, kcp.snd_una) < 0 || _itimediff(sn, kcp.snd_nxt) >= 0 {
  272. return
  273. }
  274. for _, seg := range kcp.snd_buf {
  275. if _itimediff(sn, seg.sn) < 0 {
  276. break
  277. } else if sn != seg.sn {
  278. seg.fastack++
  279. }
  280. }
  281. }
  282. func (kcp *KCP) parse_una(una uint32) {
  283. count := 0
  284. for _, seg := range kcp.snd_buf {
  285. if _itimediff(una, seg.sn) > 0 {
  286. seg.Release()
  287. count++
  288. } else {
  289. break
  290. }
  291. }
  292. kcp.snd_buf = kcp.snd_buf[count:]
  293. }
  294. // ack append
  295. func (kcp *KCP) ack_push(sn, ts uint32) {
  296. kcp.acklist = append(kcp.acklist, sn, ts)
  297. }
  298. func (kcp *KCP) ack_get(p int) (sn, ts uint32) {
  299. return kcp.acklist[p*2+0], kcp.acklist[p*2+1]
  300. }
  301. func (kcp *KCP) parse_data(newseg *Segment) {
  302. sn := newseg.sn
  303. if _itimediff(sn, kcp.rcv_nxt+kcp.rcv_wnd) >= 0 ||
  304. _itimediff(sn, kcp.rcv_nxt) < 0 {
  305. return
  306. }
  307. idx := sn - kcp.rcv_nxt
  308. if !kcp.rcv_buf.Set(idx, newseg) {
  309. newseg.Release()
  310. }
  311. kcp.DumpReceivingBuf()
  312. }
  313. // Input when you received a low level packet (eg. UDP packet), call it
  314. func (kcp *KCP) Input(data []byte) int {
  315. //una := kcp.snd_una
  316. if len(data) < IKCP_OVERHEAD {
  317. return -1
  318. }
  319. var maxack uint32
  320. var flag int
  321. for {
  322. var ts, sn, una, conv uint32
  323. var wnd, length uint16
  324. var cmd, frg uint8
  325. if len(data) < int(IKCP_OVERHEAD) {
  326. break
  327. }
  328. data = ikcp_decode32u(data, &conv)
  329. if conv != kcp.conv {
  330. return -1
  331. }
  332. data = ikcp_decode8u(data, &cmd)
  333. data = ikcp_decode8u(data, &frg)
  334. data = ikcp_decode16u(data, &wnd)
  335. data = ikcp_decode32u(data, &ts)
  336. data = ikcp_decode32u(data, &sn)
  337. data = ikcp_decode32u(data, &una)
  338. data = ikcp_decode16u(data, &length)
  339. if len(data) < int(length) {
  340. return -2
  341. }
  342. if cmd != IKCP_CMD_PUSH && cmd != IKCP_CMD_ACK &&
  343. cmd != IKCP_CMD_WASK && cmd != IKCP_CMD_WINS {
  344. return -3
  345. }
  346. if kcp.rmt_wnd < uint32(wnd) {
  347. kcp.rmt_wnd = uint32(wnd)
  348. }
  349. //kcp.rmt_wnd = uint32(wnd)
  350. kcp.parse_una(una)
  351. kcp.shrink_buf()
  352. if cmd == IKCP_CMD_ACK {
  353. if _itimediff(kcp.current, ts) >= 0 {
  354. kcp.update_ack(_itimediff(kcp.current, ts))
  355. }
  356. kcp.parse_ack(sn)
  357. kcp.shrink_buf()
  358. if flag == 0 {
  359. flag = 1
  360. maxack = sn
  361. } else if _itimediff(sn, maxack) > 0 {
  362. maxack = sn
  363. }
  364. } else if cmd == IKCP_CMD_PUSH {
  365. if _itimediff(sn, kcp.rcv_nxt+kcp.rcv_wnd) < 0 {
  366. kcp.ack_push(sn, ts)
  367. if _itimediff(sn, kcp.rcv_nxt) >= 0 {
  368. seg := NewSegment()
  369. seg.conv = conv
  370. seg.cmd = uint32(cmd)
  371. seg.frg = uint32(frg)
  372. seg.wnd = uint32(wnd)
  373. seg.ts = ts
  374. seg.sn = sn
  375. seg.una = una
  376. seg.data.Append(data[:length])
  377. kcp.parse_data(seg)
  378. }
  379. }
  380. } else if cmd == IKCP_CMD_WASK {
  381. // ready to send back IKCP_CMD_WINS in Ikcp_flush
  382. // tell remote my window size
  383. kcp.probe |= IKCP_ASK_TELL
  384. } else if cmd == IKCP_CMD_WINS {
  385. // do nothing
  386. } else {
  387. return -3
  388. }
  389. data = data[length:]
  390. }
  391. if flag != 0 {
  392. kcp.parse_fastack(maxack)
  393. }
  394. /*
  395. if _itimediff(kcp.snd_una, una) > 0 {
  396. if kcp.cwnd < kcp.rmt_wnd {
  397. mss := kcp.mss
  398. if kcp.cwnd < kcp.ssthresh {
  399. kcp.cwnd++
  400. kcp.incr += mss
  401. } else {
  402. if kcp.incr < mss {
  403. kcp.incr = mss
  404. }
  405. kcp.incr += (mss*mss)/kcp.incr + (mss / 16)
  406. if (kcp.cwnd+1)*mss <= kcp.incr {
  407. kcp.cwnd++
  408. }
  409. }
  410. if kcp.cwnd > kcp.rmt_wnd {
  411. kcp.cwnd = kcp.rmt_wnd
  412. kcp.incr = kcp.rmt_wnd * mss
  413. }
  414. }
  415. }*/
  416. return 0
  417. }
  418. // flush pending data
  419. func (kcp *KCP) flush() {
  420. current := kcp.current
  421. buffer := kcp.buffer
  422. change := 0
  423. //lost := false
  424. if !kcp.updated {
  425. return
  426. }
  427. var seg Segment
  428. seg.conv = kcp.conv
  429. seg.cmd = IKCP_CMD_ACK
  430. seg.wnd = uint32(kcp.rcv_nxt + kcp.rcv_wnd)
  431. seg.una = kcp.rcv_nxt
  432. // flush acknowledges
  433. count := len(kcp.acklist) / 2
  434. ptr := buffer
  435. for i := 0; i < count; i++ {
  436. size := len(buffer) - len(ptr)
  437. if size+IKCP_OVERHEAD > int(kcp.mtu) {
  438. kcp.output(buffer[:size])
  439. ptr = buffer
  440. }
  441. seg.sn, seg.ts = kcp.ack_get(i)
  442. ptr = seg.encode(ptr)
  443. }
  444. kcp.acklist = nil
  445. // probe window size (if remote window size equals zero)
  446. /*
  447. if kcp.rmt_wnd == 0 {
  448. if kcp.probe_wait == 0 {
  449. kcp.probe_wait = IKCP_PROBE_INIT
  450. kcp.ts_probe = kcp.current + kcp.probe_wait
  451. } else {
  452. if _itimediff(kcp.current, kcp.ts_probe) >= 0 {
  453. if kcp.probe_wait < IKCP_PROBE_INIT {
  454. kcp.probe_wait = IKCP_PROBE_INIT
  455. }
  456. kcp.probe_wait += kcp.probe_wait / 2
  457. if kcp.probe_wait > IKCP_PROBE_LIMIT {
  458. kcp.probe_wait = IKCP_PROBE_LIMIT
  459. }
  460. kcp.ts_probe = kcp.current + kcp.probe_wait
  461. kcp.probe |= IKCP_ASK_SEND
  462. }
  463. }
  464. } else {
  465. kcp.ts_probe = 0
  466. kcp.probe_wait = 0
  467. }*/
  468. // flush window probing commands
  469. /*
  470. if (kcp.probe & IKCP_ASK_SEND) != 0 {
  471. seg.cmd = IKCP_CMD_WASK
  472. size := len(buffer) - len(ptr)
  473. if size+IKCP_OVERHEAD > int(kcp.mtu) {
  474. kcp.output(buffer[:size])
  475. ptr = buffer
  476. }
  477. ptr = seg.encode(ptr)
  478. }*/
  479. // flush window probing commands
  480. /*
  481. if (kcp.probe & IKCP_ASK_TELL) != 0 {
  482. seg.cmd = IKCP_CMD_WINS
  483. size := len(buffer) - len(ptr)
  484. if size+IKCP_OVERHEAD > int(kcp.mtu) {
  485. kcp.output(buffer[:size])
  486. ptr = buffer
  487. }
  488. ptr = seg.encode(ptr)
  489. }
  490. kcp.probe = 0*/
  491. // calculate window size
  492. cwnd := _imin_(kcp.snd_nxt+kcp.snd_wnd, kcp.rmt_wnd)
  493. if kcp.congestionControl {
  494. cwnd = _imin_(kcp.cwnd, cwnd)
  495. }
  496. for !kcp.snd_queue.IsEmpty() && _itimediff(kcp.snd_nxt, cwnd) < 0 {
  497. newseg := kcp.snd_queue.Pop()
  498. newseg.conv = kcp.conv
  499. newseg.cmd = IKCP_CMD_PUSH
  500. newseg.wnd = seg.wnd
  501. newseg.ts = current
  502. newseg.sn = kcp.snd_nxt
  503. newseg.una = kcp.rcv_nxt
  504. newseg.resendts = current
  505. newseg.fastack = 0
  506. newseg.xmit = 0
  507. kcp.snd_buf = append(kcp.snd_buf, newseg)
  508. kcp.snd_nxt++
  509. }
  510. // calculate resent
  511. resent := uint32(kcp.fastresend)
  512. if kcp.fastresend <= 0 {
  513. resent = 0xffffffff
  514. }
  515. // flush data segments
  516. for _, segment := range kcp.snd_buf {
  517. needsend := false
  518. if segment.xmit == 0 {
  519. needsend = true
  520. segment.xmit++
  521. segment.resendts = current + kcp.rx_rto + kcp.interval
  522. } else if _itimediff(current, segment.resendts) >= 0 {
  523. needsend = true
  524. segment.xmit++
  525. kcp.xmit++
  526. segment.resendts = current + kcp.rx_rto + kcp.interval
  527. //lost = true
  528. } else if segment.fastack >= resent {
  529. needsend = true
  530. segment.xmit++
  531. segment.fastack = 0
  532. segment.resendts = current + kcp.rx_rto + kcp.interval
  533. change++
  534. }
  535. if needsend {
  536. segment.ts = current
  537. segment.wnd = seg.wnd
  538. segment.una = kcp.rcv_nxt
  539. size := len(buffer) - len(ptr)
  540. need := IKCP_OVERHEAD + segment.data.Len()
  541. if size+need >= int(kcp.mtu) {
  542. kcp.output(buffer[:size])
  543. ptr = buffer
  544. }
  545. ptr = segment.encode(ptr)
  546. copy(ptr, segment.data.Value)
  547. ptr = ptr[segment.data.Len():]
  548. if segment.xmit >= kcp.dead_link {
  549. kcp.state = 0xFFFFFFFF
  550. }
  551. }
  552. }
  553. // flash remain segments
  554. size := len(buffer) - len(ptr)
  555. if size > 0 {
  556. kcp.output(buffer[:size])
  557. }
  558. // update ssthresh
  559. // rate halving, https://tools.ietf.org/html/rfc6937
  560. /*
  561. if change != 0 {
  562. inflight := kcp.snd_nxt - kcp.snd_una
  563. kcp.ssthresh = inflight / 2
  564. if kcp.ssthresh < IKCP_THRESH_MIN {
  565. kcp.ssthresh = IKCP_THRESH_MIN
  566. }
  567. kcp.cwnd = kcp.ssthresh + resent
  568. kcp.incr = kcp.cwnd * kcp.mss
  569. }*/
  570. // congestion control, https://tools.ietf.org/html/rfc5681
  571. /*
  572. if lost {
  573. kcp.ssthresh = cwnd / 2
  574. if kcp.ssthresh < IKCP_THRESH_MIN {
  575. kcp.ssthresh = IKCP_THRESH_MIN
  576. }
  577. kcp.cwnd = 1
  578. kcp.incr = kcp.mss
  579. }
  580. if kcp.cwnd < 1 {
  581. kcp.cwnd = 1
  582. kcp.incr = kcp.mss
  583. }*/
  584. }
  585. // Update updates state (call it repeatedly, every 10ms-100ms), or you can ask
  586. // ikcp_check when to call it again (without ikcp_input/_send calling).
  587. // 'current' - current timestamp in millisec.
  588. func (kcp *KCP) Update(current uint32) {
  589. var slap int32
  590. kcp.current = current
  591. if !kcp.updated {
  592. kcp.updated = true
  593. kcp.ts_flush = kcp.current
  594. }
  595. slap = _itimediff(kcp.current, kcp.ts_flush)
  596. if slap >= 10000 || slap < -10000 {
  597. kcp.ts_flush = kcp.current
  598. slap = 0
  599. }
  600. if slap >= 0 {
  601. kcp.ts_flush += kcp.interval
  602. if _itimediff(kcp.current, kcp.ts_flush) >= 0 {
  603. kcp.ts_flush = kcp.current + kcp.interval
  604. }
  605. kcp.flush()
  606. }
  607. }
  608. // Check determines when should you invoke ikcp_update:
  609. // returns when you should invoke ikcp_update in millisec, if there
  610. // is no ikcp_input/_send calling. you can call ikcp_update in that
  611. // time, instead of call update repeatly.
  612. // Important to reduce unnacessary ikcp_update invoking. use it to
  613. // schedule ikcp_update (eg. implementing an epoll-like mechanism,
  614. // or optimize ikcp_update when handling massive kcp connections)
  615. func (kcp *KCP) Check(current uint32) uint32 {
  616. ts_flush := kcp.ts_flush
  617. tm_flush := int32(0x7fffffff)
  618. tm_packet := int32(0x7fffffff)
  619. minimal := uint32(0)
  620. if !kcp.updated {
  621. return current
  622. }
  623. if _itimediff(current, ts_flush) >= 10000 ||
  624. _itimediff(current, ts_flush) < -10000 {
  625. ts_flush = current
  626. }
  627. if _itimediff(current, ts_flush) >= 0 {
  628. return current
  629. }
  630. tm_flush = _itimediff(ts_flush, current)
  631. for _, seg := range kcp.snd_buf {
  632. diff := _itimediff(seg.resendts, current)
  633. if diff <= 0 {
  634. return current
  635. }
  636. if diff < tm_packet {
  637. tm_packet = diff
  638. }
  639. }
  640. minimal = uint32(tm_packet)
  641. if tm_packet >= tm_flush {
  642. minimal = uint32(tm_flush)
  643. }
  644. if minimal >= kcp.interval {
  645. minimal = kcp.interval
  646. }
  647. return current + minimal
  648. }
  649. // NoDelay options
  650. // fastest: ikcp_nodelay(kcp, 1, 20, 2, 1)
  651. // nodelay: 0:disable(default), 1:enable
  652. // interval: internal update timer interval in millisec, default is 100ms
  653. // resend: 0:disable fast resend(default), 1:enable fast resend
  654. // nc: 0:normal congestion control(default), 1:disable congestion control
  655. func (kcp *KCP) NoDelay(interval uint32, resend int, congestionControl bool) int {
  656. kcp.interval = interval
  657. if resend >= 0 {
  658. kcp.fastresend = int32(resend)
  659. }
  660. kcp.congestionControl = congestionControl
  661. return 0
  662. }
  663. // WaitSnd gets how many packet is waiting to be sent
  664. func (kcp *KCP) WaitSnd() uint32 {
  665. return uint32(len(kcp.snd_buf)) + kcp.snd_queue.Len()
  666. }
  667. func (this *KCP) ClearSendQueue() {
  668. this.snd_queue.Clear()
  669. for _, seg := range this.snd_buf {
  670. seg.Release()
  671. }
  672. this.snd_buf = nil
  673. }