kcp.go 18 KB

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