kcp.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836
  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_encode32u(ptr, uint32(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_rttval, rx_srtt, rx_rto uint32
  125. snd_wnd, rcv_wnd, rmt_wnd, cwnd, probe uint32
  126. current, interval, ts_flush, xmit uint32
  127. updated uint32
  128. ts_probe, probe_wait uint32
  129. dead_link, incr uint32
  130. snd_queue []*Segment
  131. rcv_queue []*Segment
  132. snd_buf []*Segment
  133. rcv_buf []*Segment
  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, output Output) *KCP {
  143. kcp := new(KCP)
  144. kcp.conv = conv
  145. kcp.snd_wnd = IKCP_WND_SND
  146. kcp.rcv_wnd = IKCP_WND_RCV
  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. return kcp
  158. }
  159. // Recv is user/upper level recv: returns size, returns below zero for EAGAIN
  160. func (kcp *KCP) Recv(buffer []byte) (n int) {
  161. if len(kcp.rcv_queue) == 0 {
  162. return -1
  163. }
  164. var fast_recover bool
  165. if len(kcp.rcv_queue) >= int(kcp.rcv_wnd) {
  166. fast_recover = true
  167. }
  168. // merge fragment
  169. count := 0
  170. for _, seg := range kcp.rcv_queue {
  171. dataLen := seg.data.Len()
  172. if dataLen > len(buffer) {
  173. break
  174. }
  175. copy(buffer, seg.data.Value)
  176. seg.Release()
  177. buffer = buffer[dataLen:]
  178. n += dataLen
  179. count++
  180. }
  181. kcp.rcv_queue = kcp.rcv_queue[count:]
  182. // move available data from rcv_buf -> rcv_queue
  183. count = 0
  184. for _, seg := range kcp.rcv_buf {
  185. if seg.sn == kcp.rcv_nxt && len(kcp.rcv_queue) < int(kcp.rcv_wnd) {
  186. kcp.rcv_queue = append(kcp.rcv_queue, seg)
  187. kcp.rcv_nxt++
  188. count++
  189. } else {
  190. break
  191. }
  192. }
  193. kcp.rcv_buf = kcp.rcv_buf[count:]
  194. // fast recover
  195. if len(kcp.rcv_queue) < int(kcp.rcv_wnd) && fast_recover {
  196. // ready to send back IKCP_CMD_WINS in ikcp_flush
  197. // tell remote my window size
  198. kcp.probe |= IKCP_ASK_TELL
  199. }
  200. return
  201. }
  202. // Send is user/upper level send, returns below zero for error
  203. func (kcp *KCP) Send(buffer []byte) int {
  204. var count int
  205. if len(buffer) == 0 {
  206. return -1
  207. }
  208. if len(buffer) < int(kcp.mss) {
  209. count = 1
  210. } else {
  211. count = (len(buffer) + int(kcp.mss) - 1) / int(kcp.mss)
  212. }
  213. if count > 255 {
  214. return -2
  215. }
  216. if count == 0 {
  217. count = 1
  218. }
  219. for i := 0; i < count; i++ {
  220. var size int
  221. if len(buffer) > int(kcp.mss) {
  222. size = int(kcp.mss)
  223. } else {
  224. size = len(buffer)
  225. }
  226. seg := NewSegment()
  227. seg.data.Append(buffer[:size])
  228. seg.frg = uint32(count - i - 1)
  229. kcp.snd_queue = append(kcp.snd_queue, seg)
  230. buffer = buffer[size:]
  231. }
  232. return 0
  233. }
  234. // https://tools.ietf.org/html/rfc6298
  235. func (kcp *KCP) update_ack(rtt int32) {
  236. var rto uint32 = 0
  237. if kcp.rx_srtt == 0 {
  238. kcp.rx_srtt = uint32(rtt)
  239. kcp.rx_rttval = uint32(rtt) / 2
  240. } else {
  241. delta := rtt - int32(kcp.rx_srtt)
  242. if delta < 0 {
  243. delta = -delta
  244. }
  245. kcp.rx_rttval = (3*kcp.rx_rttval + uint32(delta)) / 4
  246. kcp.rx_srtt = (7*kcp.rx_srtt + uint32(rtt)) / 8
  247. if kcp.rx_srtt < 1 {
  248. kcp.rx_srtt = 1
  249. }
  250. }
  251. rto = kcp.rx_srtt + _imax_(kcp.interval, 4*kcp.rx_rttval)
  252. if rto > IKCP_RTO_MAX {
  253. rto = IKCP_RTO_MAX
  254. }
  255. kcp.rx_rto = rto
  256. }
  257. func (kcp *KCP) shrink_buf() {
  258. if len(kcp.snd_buf) > 0 {
  259. seg := kcp.snd_buf[0]
  260. kcp.snd_una = seg.sn
  261. } else {
  262. kcp.snd_una = kcp.snd_nxt
  263. }
  264. }
  265. func (kcp *KCP) parse_ack(sn uint32) {
  266. if _itimediff(sn, kcp.snd_una) < 0 || _itimediff(sn, kcp.snd_nxt) >= 0 {
  267. return
  268. }
  269. for k, seg := range kcp.snd_buf {
  270. if sn == seg.sn {
  271. kcp.snd_buf = append(kcp.snd_buf[:k], kcp.snd_buf[k+1:]...)
  272. seg.Release()
  273. break
  274. }
  275. if _itimediff(sn, seg.sn) < 0 {
  276. break
  277. }
  278. }
  279. }
  280. func (kcp *KCP) parse_fastack(sn uint32) {
  281. if _itimediff(sn, kcp.snd_una) < 0 || _itimediff(sn, kcp.snd_nxt) >= 0 {
  282. return
  283. }
  284. for _, seg := range kcp.snd_buf {
  285. if _itimediff(sn, seg.sn) < 0 {
  286. break
  287. } else if sn != seg.sn {
  288. seg.fastack++
  289. }
  290. }
  291. }
  292. func (kcp *KCP) parse_una(una uint32) {
  293. count := 0
  294. for _, seg := range kcp.snd_buf {
  295. if _itimediff(una, seg.sn) > 0 {
  296. seg.Release()
  297. count++
  298. } else {
  299. break
  300. }
  301. }
  302. kcp.snd_buf = kcp.snd_buf[count:]
  303. }
  304. // ack append
  305. func (kcp *KCP) ack_push(sn, ts uint32) {
  306. kcp.acklist = append(kcp.acklist, sn, ts)
  307. }
  308. func (kcp *KCP) ack_get(p int) (sn, ts uint32) {
  309. return kcp.acklist[p*2+0], kcp.acklist[p*2+1]
  310. }
  311. func (kcp *KCP) parse_data(newseg *Segment) {
  312. sn := newseg.sn
  313. if _itimediff(sn, kcp.rcv_nxt+kcp.rcv_wnd) >= 0 ||
  314. _itimediff(sn, kcp.rcv_nxt) < 0 {
  315. return
  316. }
  317. n := len(kcp.rcv_buf) - 1
  318. insert_idx := 0
  319. repeat := false
  320. for i := n; i >= 0; i-- {
  321. seg := kcp.rcv_buf[i]
  322. if seg.sn == sn {
  323. repeat = true
  324. break
  325. }
  326. if _itimediff(sn, seg.sn) > 0 {
  327. insert_idx = i + 1
  328. break
  329. }
  330. }
  331. if !repeat {
  332. if insert_idx == n+1 {
  333. kcp.rcv_buf = append(kcp.rcv_buf, newseg)
  334. } else {
  335. kcp.rcv_buf = append(kcp.rcv_buf, &Segment{})
  336. copy(kcp.rcv_buf[insert_idx+1:], kcp.rcv_buf[insert_idx:])
  337. kcp.rcv_buf[insert_idx] = newseg
  338. }
  339. }
  340. // move available data from rcv_buf -> rcv_queue
  341. count := 0
  342. for k, seg := range kcp.rcv_buf {
  343. if seg.sn == kcp.rcv_nxt && len(kcp.rcv_queue) < int(kcp.rcv_wnd) {
  344. kcp.rcv_queue = append(kcp.rcv_queue, kcp.rcv_buf[k])
  345. kcp.rcv_nxt++
  346. count++
  347. } else {
  348. break
  349. }
  350. }
  351. kcp.rcv_buf = kcp.rcv_buf[count:]
  352. }
  353. // Input when you received a low level packet (eg. UDP packet), call it
  354. func (kcp *KCP) Input(data []byte) int {
  355. //una := kcp.snd_una
  356. if len(data) < IKCP_OVERHEAD {
  357. return -1
  358. }
  359. var maxack uint32
  360. var flag int
  361. for {
  362. var ts, sn, length, una, conv uint32
  363. var wnd uint16
  364. var cmd, frg uint8
  365. if len(data) < int(IKCP_OVERHEAD) {
  366. break
  367. }
  368. data = ikcp_decode32u(data, &conv)
  369. if conv != kcp.conv {
  370. return -1
  371. }
  372. data = ikcp_decode8u(data, &cmd)
  373. data = ikcp_decode8u(data, &frg)
  374. data = ikcp_decode16u(data, &wnd)
  375. data = ikcp_decode32u(data, &ts)
  376. data = ikcp_decode32u(data, &sn)
  377. data = ikcp_decode32u(data, &una)
  378. data = ikcp_decode32u(data, &length)
  379. if len(data) < int(length) {
  380. return -2
  381. }
  382. if cmd != IKCP_CMD_PUSH && cmd != IKCP_CMD_ACK &&
  383. cmd != IKCP_CMD_WASK && cmd != IKCP_CMD_WINS {
  384. return -3
  385. }
  386. if kcp.rmt_wnd < uint32(wnd) {
  387. kcp.rmt_wnd = uint32(wnd)
  388. }
  389. //kcp.rmt_wnd = uint32(wnd)
  390. kcp.parse_una(una)
  391. kcp.shrink_buf()
  392. if cmd == IKCP_CMD_ACK {
  393. if _itimediff(kcp.current, ts) >= 0 {
  394. kcp.update_ack(_itimediff(kcp.current, ts))
  395. }
  396. kcp.parse_ack(sn)
  397. kcp.shrink_buf()
  398. if flag == 0 {
  399. flag = 1
  400. maxack = sn
  401. } else if _itimediff(sn, maxack) > 0 {
  402. maxack = sn
  403. }
  404. } else if cmd == IKCP_CMD_PUSH {
  405. if _itimediff(sn, kcp.rcv_nxt+kcp.rcv_wnd) < 0 {
  406. kcp.ack_push(sn, ts)
  407. if _itimediff(sn, kcp.rcv_nxt) >= 0 {
  408. seg := NewSegment()
  409. seg.conv = conv
  410. seg.cmd = uint32(cmd)
  411. seg.frg = uint32(frg)
  412. seg.wnd = uint32(wnd)
  413. seg.ts = ts
  414. seg.sn = sn
  415. seg.una = una
  416. seg.data.Append(data[:length])
  417. kcp.parse_data(seg)
  418. }
  419. }
  420. } else if cmd == IKCP_CMD_WASK {
  421. // ready to send back IKCP_CMD_WINS in Ikcp_flush
  422. // tell remote my window size
  423. kcp.probe |= IKCP_ASK_TELL
  424. } else if cmd == IKCP_CMD_WINS {
  425. // do nothing
  426. } else {
  427. return -3
  428. }
  429. data = data[length:]
  430. }
  431. if flag != 0 {
  432. kcp.parse_fastack(maxack)
  433. }
  434. /*
  435. if _itimediff(kcp.snd_una, una) > 0 {
  436. if kcp.cwnd < kcp.rmt_wnd {
  437. mss := kcp.mss
  438. if kcp.cwnd < kcp.ssthresh {
  439. kcp.cwnd++
  440. kcp.incr += mss
  441. } else {
  442. if kcp.incr < mss {
  443. kcp.incr = mss
  444. }
  445. kcp.incr += (mss*mss)/kcp.incr + (mss / 16)
  446. if (kcp.cwnd+1)*mss <= kcp.incr {
  447. kcp.cwnd++
  448. }
  449. }
  450. if kcp.cwnd > kcp.rmt_wnd {
  451. kcp.cwnd = kcp.rmt_wnd
  452. kcp.incr = kcp.rmt_wnd * mss
  453. }
  454. }
  455. }*/
  456. return 0
  457. }
  458. // flush pending data
  459. func (kcp *KCP) flush() {
  460. current := kcp.current
  461. buffer := kcp.buffer
  462. change := 0
  463. //lost := false
  464. if kcp.updated == 0 {
  465. return
  466. }
  467. var seg Segment
  468. seg.conv = kcp.conv
  469. seg.cmd = IKCP_CMD_ACK
  470. seg.wnd = uint32(kcp.rcv_nxt + kcp.rcv_wnd)
  471. seg.una = kcp.rcv_nxt
  472. // flush acknowledges
  473. count := len(kcp.acklist) / 2
  474. ptr := buffer
  475. for i := 0; i < count; i++ {
  476. size := len(buffer) - len(ptr)
  477. if size+IKCP_OVERHEAD > int(kcp.mtu) {
  478. kcp.output(buffer[:size])
  479. ptr = buffer
  480. }
  481. seg.sn, seg.ts = kcp.ack_get(i)
  482. ptr = seg.encode(ptr)
  483. }
  484. kcp.acklist = nil
  485. // probe window size (if remote window size equals zero)
  486. /*
  487. if kcp.rmt_wnd == 0 {
  488. if kcp.probe_wait == 0 {
  489. kcp.probe_wait = IKCP_PROBE_INIT
  490. kcp.ts_probe = kcp.current + kcp.probe_wait
  491. } else {
  492. if _itimediff(kcp.current, kcp.ts_probe) >= 0 {
  493. if kcp.probe_wait < IKCP_PROBE_INIT {
  494. kcp.probe_wait = IKCP_PROBE_INIT
  495. }
  496. kcp.probe_wait += kcp.probe_wait / 2
  497. if kcp.probe_wait > IKCP_PROBE_LIMIT {
  498. kcp.probe_wait = IKCP_PROBE_LIMIT
  499. }
  500. kcp.ts_probe = kcp.current + kcp.probe_wait
  501. kcp.probe |= IKCP_ASK_SEND
  502. }
  503. }
  504. } else {
  505. kcp.ts_probe = 0
  506. kcp.probe_wait = 0
  507. }*/
  508. // flush window probing commands
  509. /*
  510. if (kcp.probe & IKCP_ASK_SEND) != 0 {
  511. seg.cmd = IKCP_CMD_WASK
  512. size := len(buffer) - len(ptr)
  513. if size+IKCP_OVERHEAD > int(kcp.mtu) {
  514. kcp.output(buffer[:size])
  515. ptr = buffer
  516. }
  517. ptr = seg.encode(ptr)
  518. }*/
  519. // flush window probing commands
  520. /*
  521. if (kcp.probe & IKCP_ASK_TELL) != 0 {
  522. seg.cmd = IKCP_CMD_WINS
  523. size := len(buffer) - len(ptr)
  524. if size+IKCP_OVERHEAD > int(kcp.mtu) {
  525. kcp.output(buffer[:size])
  526. ptr = buffer
  527. }
  528. ptr = seg.encode(ptr)
  529. }
  530. kcp.probe = 0*/
  531. // calculate window size
  532. cwnd := _imin_(kcp.snd_nxt+kcp.snd_wnd, kcp.rmt_wnd)
  533. if kcp.congestionControl {
  534. cwnd = _imin_(kcp.cwnd, cwnd)
  535. }
  536. count = 0
  537. for k := range kcp.snd_queue {
  538. if _itimediff(kcp.snd_nxt, cwnd) >= 0 {
  539. break
  540. }
  541. newseg := kcp.snd_queue[k]
  542. newseg.conv = kcp.conv
  543. newseg.cmd = IKCP_CMD_PUSH
  544. newseg.wnd = seg.wnd
  545. newseg.ts = current
  546. newseg.sn = kcp.snd_nxt
  547. newseg.una = kcp.rcv_nxt
  548. newseg.resendts = current
  549. newseg.fastack = 0
  550. newseg.xmit = 0
  551. kcp.snd_buf = append(kcp.snd_buf, newseg)
  552. kcp.snd_nxt++
  553. count++
  554. }
  555. kcp.snd_queue = kcp.snd_queue[count:]
  556. // calculate resent
  557. resent := uint32(kcp.fastresend)
  558. if kcp.fastresend <= 0 {
  559. resent = 0xffffffff
  560. }
  561. // flush data segments
  562. for _, segment := range kcp.snd_buf {
  563. needsend := false
  564. if segment.xmit == 0 {
  565. needsend = true
  566. segment.xmit++
  567. segment.resendts = current + kcp.rx_rto + kcp.interval
  568. } else if _itimediff(current, segment.resendts) >= 0 {
  569. needsend = true
  570. segment.xmit++
  571. kcp.xmit++
  572. segment.resendts = current + kcp.rx_rto + kcp.interval
  573. //lost = true
  574. } else if segment.fastack >= resent {
  575. needsend = true
  576. segment.xmit++
  577. segment.fastack = 0
  578. segment.resendts = current + kcp.rx_rto + kcp.interval
  579. change++
  580. }
  581. if needsend {
  582. segment.ts = current
  583. segment.wnd = seg.wnd
  584. segment.una = kcp.rcv_nxt
  585. size := len(buffer) - len(ptr)
  586. need := IKCP_OVERHEAD + segment.data.Len()
  587. if size+need >= int(kcp.mtu) {
  588. kcp.output(buffer[:size])
  589. ptr = buffer
  590. }
  591. ptr = segment.encode(ptr)
  592. copy(ptr, segment.data.Value)
  593. ptr = ptr[segment.data.Len():]
  594. if segment.xmit >= kcp.dead_link {
  595. kcp.state = 0xFFFFFFFF
  596. }
  597. }
  598. }
  599. // flash remain segments
  600. size := len(buffer) - len(ptr)
  601. if size > 0 {
  602. kcp.output(buffer[:size])
  603. }
  604. // update ssthresh
  605. // rate halving, https://tools.ietf.org/html/rfc6937
  606. /*
  607. if change != 0 {
  608. inflight := kcp.snd_nxt - kcp.snd_una
  609. kcp.ssthresh = inflight / 2
  610. if kcp.ssthresh < IKCP_THRESH_MIN {
  611. kcp.ssthresh = IKCP_THRESH_MIN
  612. }
  613. kcp.cwnd = kcp.ssthresh + resent
  614. kcp.incr = kcp.cwnd * kcp.mss
  615. }*/
  616. // congestion control, https://tools.ietf.org/html/rfc5681
  617. /*
  618. if lost {
  619. kcp.ssthresh = cwnd / 2
  620. if kcp.ssthresh < IKCP_THRESH_MIN {
  621. kcp.ssthresh = IKCP_THRESH_MIN
  622. }
  623. kcp.cwnd = 1
  624. kcp.incr = kcp.mss
  625. }
  626. if kcp.cwnd < 1 {
  627. kcp.cwnd = 1
  628. kcp.incr = kcp.mss
  629. }*/
  630. }
  631. // Update updates state (call it repeatedly, every 10ms-100ms), or you can ask
  632. // ikcp_check when to call it again (without ikcp_input/_send calling).
  633. // 'current' - current timestamp in millisec.
  634. func (kcp *KCP) Update(current uint32) {
  635. var slap int32
  636. kcp.current = current
  637. if kcp.updated == 0 {
  638. kcp.updated = 1
  639. kcp.ts_flush = kcp.current
  640. }
  641. slap = _itimediff(kcp.current, kcp.ts_flush)
  642. if slap >= 10000 || slap < -10000 {
  643. kcp.ts_flush = kcp.current
  644. slap = 0
  645. }
  646. if slap >= 0 {
  647. kcp.ts_flush += kcp.interval
  648. if _itimediff(kcp.current, kcp.ts_flush) >= 0 {
  649. kcp.ts_flush = kcp.current + kcp.interval
  650. }
  651. kcp.flush()
  652. }
  653. }
  654. // Check determines when should you invoke ikcp_update:
  655. // returns when you should invoke ikcp_update in millisec, if there
  656. // is no ikcp_input/_send calling. you can call ikcp_update in that
  657. // time, instead of call update repeatly.
  658. // Important to reduce unnacessary ikcp_update invoking. use it to
  659. // schedule ikcp_update (eg. implementing an epoll-like mechanism,
  660. // or optimize ikcp_update when handling massive kcp connections)
  661. func (kcp *KCP) Check(current uint32) uint32 {
  662. ts_flush := kcp.ts_flush
  663. tm_flush := int32(0x7fffffff)
  664. tm_packet := int32(0x7fffffff)
  665. minimal := uint32(0)
  666. if kcp.updated == 0 {
  667. return current
  668. }
  669. if _itimediff(current, ts_flush) >= 10000 ||
  670. _itimediff(current, ts_flush) < -10000 {
  671. ts_flush = current
  672. }
  673. if _itimediff(current, ts_flush) >= 0 {
  674. return current
  675. }
  676. tm_flush = _itimediff(ts_flush, current)
  677. for _, seg := range kcp.snd_buf {
  678. diff := _itimediff(seg.resendts, current)
  679. if diff <= 0 {
  680. return current
  681. }
  682. if diff < tm_packet {
  683. tm_packet = diff
  684. }
  685. }
  686. minimal = uint32(tm_packet)
  687. if tm_packet >= tm_flush {
  688. minimal = uint32(tm_flush)
  689. }
  690. if minimal >= kcp.interval {
  691. minimal = kcp.interval
  692. }
  693. return current + minimal
  694. }
  695. // NoDelay options
  696. // fastest: ikcp_nodelay(kcp, 1, 20, 2, 1)
  697. // nodelay: 0:disable(default), 1:enable
  698. // interval: internal update timer interval in millisec, default is 100ms
  699. // resend: 0:disable fast resend(default), 1:enable fast resend
  700. // nc: 0:normal congestion control(default), 1:disable congestion control
  701. func (kcp *KCP) NoDelay(interval, resend int, congestionControl bool) int {
  702. if interval >= 0 {
  703. if interval > 5000 {
  704. interval = 5000
  705. } else if interval < 10 {
  706. interval = 10
  707. }
  708. kcp.interval = uint32(interval)
  709. }
  710. if resend >= 0 {
  711. kcp.fastresend = int32(resend)
  712. }
  713. kcp.congestionControl = congestionControl
  714. return 0
  715. }
  716. // WndSize sets maximum window size: sndwnd=32, rcvwnd=32 by default
  717. func (kcp *KCP) WndSize(sndwnd, rcvwnd int) int {
  718. if sndwnd > 0 {
  719. kcp.snd_wnd = uint32(sndwnd)
  720. }
  721. if rcvwnd > 0 {
  722. kcp.rcv_wnd = uint32(rcvwnd)
  723. }
  724. return 0
  725. }
  726. // WaitSnd gets how many packet is waiting to be sent
  727. func (kcp *KCP) WaitSnd() int {
  728. return len(kcp.snd_buf) + len(kcp.snd_queue)
  729. }
  730. func (this *KCP) ClearSendQueue() {
  731. for _, seg := range this.snd_queue {
  732. seg.Release()
  733. }
  734. this.snd_queue = nil
  735. for _, seg := range this.snd_buf {
  736. seg.Release()
  737. }
  738. this.snd_buf = nil
  739. }