首页 > 编程知识 正文

bgp使用udp协议传输报文,tcp协议怎么保证传输可靠性

时间:2023-05-05 02:25:53 阅读:106974 作者:4341

文章目录UDP和TCP的区别TCPUDP为什么要使用UDP传输可靠性数据如何使用UDP传输可靠性数据如何使用KCP kcp配置模式kcp的协议头

UDP和TCP的区别

Tcp和udp都属于TCP/IP协议(传输层协议)。

TCP TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。 一个TCP连接必须要经过三次握手,断开连接时需要四次挥手。

TCP的可靠性主要体现在哪些方面呢?

1. 应用数据被分割成TCP认为最合适发送的数据块。

这与UDP完全不同,APP应用程序生成的数据报的长度保持不变。 从TCP传递到IP的信息的单位称为消息段或段。 最大消息段(MSS )表示TCP传递到另一端的最大块数据的长度。 建立连接时,双方都必须通知自己的MSS。 默认情况下,MSS的值为536字节。 可以添加20字节的IP报头和20字节的TCP报头。 对于以太网,最大MSS可达1460字节(1500(MTU(-20 ) IP(-20 ) TCP ) )。

2. 当TCP发出一个段之后,它启动一个定时器,等待目的端确认收到这个报文段,如果不能及时收到一个确认,将重发这个报文段。

3.TCP收到另一个数据后,他会发送确认。 这个确认不是马上发送,而是晚几分之一秒。

4. TCP保存其头部和数据校验和。 这是在端到端检测中,目的是检测在传输数据时的变化,如果检测到接收段有错误,则tcp丢弃该段并不确认接收。

5 .因为TCP分组被作为ip数据报发送,所以ip数据报的到达可能丢失顺序,因此TCP分组的到达可能丢失顺序。 如有必要,tcp将对接收到的数据进行排序。

6. ip数据报重复。 tcp的接收方必须丢弃重复的数据。

7. TCP提供流量控制。

UDPUDP(userdatagramprotocol )是一种简单的面向消息的传输层协议,UDP提供报头和有效载荷的完整性验证,但不能保证到上层协议的消息传递,UDP层在发送后也是UDP 因此,UDP可能被称为不可信数据报协议。 如果需要传输可靠性,则必须在用户APP中实现。

UDP(userdatagramprotocol,用户数据图形协议)传输非常类似于IP传输,其传输方法也是“Best Effort”,因此UDP协议也不可靠。 我知道TCP是为了解决IP层不可靠的传输层协议,但既然UDP不可靠,为什么不直接使用IP协议来添加UDP协议呢?

一个重要的原因是IP协议中没有端口(port )的概念。 IP协议进行从IP地址到IP地址的传输,这意味着两台计算机之间的对话。 但是,每台计算机需要多个通信信道,将多个通信信道分配给不同的进程使用。 端口表示这样的通信路径。 UDP协议实现了端口,从而除了IP地址外,还可以将分组发送到其他端口。 对于一些简单的通信,只需要“尽力而为”式的IP传输,而不需要使用TCP协议建立复杂连接的方法。 特别是在早期的网络环境中,建立过多的TCP连接会带来巨大的网络负载,但UDP协议可以相对快速地处理这些简单的通信。 使用TCP协议传输数据时,如果数据段丢失或在接收方传输数据,TCP会重新发送数据,这会导致传输延迟和重复数据,降低用户体验。 对于延迟敏感的APP应用,少量的数据丢失通常可以忽略。 在这种情况下,UDP传输可以提高用户的体验。 在从源向目的地发送数据时,UDP不需要事先建立连接,并且由于不使用TCP中的确认技术、滑动窗口机制,所以UDP不能保证数据传输的可靠性,并且也不可避免地接收重复数据。

UDP传输的可靠性由APP应用层负责,如果有必要,消息ACK机制、重传机制、序号机制、重排机制和窗口机制这些TCP将已经具备。

如何使用UDP传输可靠性数据此处主要介绍开源UDP的可靠性方案kcp:https://github.com/skywind 3000/kcp

KCP的主要优势在以下方面:

以10%-20%的带宽浪费成本换取了比TCP快30%-40%的传输速度。 RTO不加倍vs2:TCP超时计算为RTOx2。 这样一来,如果连续3次掉数据包的话就会变成RTOx8,所以非常害怕。 另一方面,KCP在启动高速模式后不是x2,而是x1.5 (实验证明1.5这个值相对较好。 )传输速度提高了。 选择性重传vs全部重传: TCP丢包时,重传丢失数据包开头以后的所有数据。 KCP是选择性重发,只重发真正丢失的包。 高速重发(跳过多少个包而立即重发) )在使用高速重发的情况下,可以不考虑RTO ) )发送端发送了1、2、3、4、5个包之后,发送远程的ACK: )、3

传2号包,大大改善了丢包时的传输速度。UNA vs ACK+UNA:ARQ模型响应有两种, UNA(此编号前所有包已收到,如TCP)和ACK(该编号包已收到),光用UNA将导致全部重传,光用ACK则丢失成本太高,以往协议都是二选其一,而 KCP协议中, 除去单独的 ACK包外,所有包都有UNA信息。非退让流控:KCP正常模式同TCP一样使用公平退让法则,即发送窗口大小由:发送缓存大小、接收端剩余接收缓存大小、丢包退让及慢启动这四要素决定。但传送及时性要求很高的小数据时,可选择通过配置跳过后两步,仅用前两项来控制发送频率。以牺牲部分公平性及带宽利用率之代价,换取了开着BT都能流畅传输的效果。

名词说明:
用户数据:应用层发送的数据,如一张图片2Kb的数据
MTU:最大传输单元。即每次发送的最大数据
RTO: Retransmission TimeOut,重传超时时间。
cwnd:congestion window,拥塞窗口,表示发送方可发送多少个KCP数据包。
与接收方窗口有关,与网络状况(拥塞控制)有关,与发送窗口大小有关。
rwnd:receiver window,接收方窗口大小,表示接收方还可接收多少个KCP数据包
snd_queue:待发送KCP数据包队列
snd_nxt:下一个即将发送的kcp数据包序列号
snd_una:下一个待确认的序列号

KCP的使用方式 创建 KCP对象: ikcpcb *kcp = ikcp_create(conv, user);设置传输回调函数(如UDP的send函数): kcp->output = udp_output;真正发送数据需要调用sendto循环调用 update: ikcp_update(kcp, millisec);输入一个应用层数据包(如UDP收到的数据包) :ikcp_input(kcp,received_udp_packet,received_udp_size);我们要使用recvfrom接收,然后扔到kcp里面做解析发送数据: ikcp_send(kcp1, buffer, 8); 用户层接口接收数据: hr = ikcp_recv(kcp2, buffer, 10);

kcp配置模式 工作模式: int ikcp_nodelay(ikcpcb *kcp, int nodelay, int interval, int resend, int nc) nodelay :是否启用 nodelay模式, 0不启用; 1启用。interval :协议内部工作的 interval,单位毫秒,比如 10ms或者 20msresend :快速重传模式,默认0关闭,可以设置2(2次ACK跨越将会直接重传)nc :是否关闭流控,默认是0代表不关闭, 1代表关闭。
普通模式: ikcp_nodelay(kcp, 0, 40, 0, 0);
极速模式: ikcp_nodelay(kcp, 1, 10, 2, 1) 最大窗口: int ikcp_wndsize(ikcpcb *kcp, int sndwnd, int rcvwnd);
该调用将会设置协议的最大发送窗口和最大接收窗口大小,默认为32,单位为包。最大传输单元: int ikcp_setmtu(ikcpcb *kcp, int mtu);
kcp协议并不负责探测 MTU,默认 mtu是1400字节最小RTO:不管是 TCP还是 KCP计算 RTO时都有最小 RTO的限制,即便计算出来RTO为
40ms,由于默认的 RTO是100ms,协议只有在100ms后才能检测到丢包,快速模式下为
30ms,可以手动更改该值: kcp->rx_minrto = 10; kcp的协议头

conv:连接号。 UDP是无连接的, conv用于表示来自于哪个
客户端。对连接的一种替代cmd:命令字。如, IKCP_CMD_ACK确认命令,
IKCP_CMD_WASK接收窗口大小询问命令,
IKCP_CMD_WINS接收窗口大小告知命令,frg:分片,用户数据可能会被分成多个KCP包,发送出去wnd:接收窗口大小,发送方的发送窗口不能超过接收方
给出的数值ts:时间序列sn:序列号una:下一个可接收的序列号。其实就是确认号,收到
sn=10的包, una为11len:数据长度data:用户数据

test kcp代码: https://github.com/birate-wz/wz_utils/tree/main/kcp

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。