kcp.go 18 KB

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