数码资讯
udp设置缓冲区大小(tcp默认缓冲区大小)
udp设置缓冲区大小
这要从它们的工作特点来谈起了:
udp是面向报文的,发送方的udp对应用层交下来的报文,不合并,不拆分,只是在其上面加上首部后就交给了下面的网络层,也就是说无论应用层交给udp多长的报文,它统统发送,一次发送一个。而对接收方,接到后直接去除首部,交给上面的应用层就完成任务了。因此,它需要应用层控制报文的大小
tcp是面向字节流的,它把上面应用层交下来的数据看成无结构的字节流来发送,可以想象成流水形式的,发送方tcp会将数据放入“蓄水池”(缓存区),等到可以发送的时候就发送,不能发送就等着,tcp会根据当前网络的拥塞状态来确定每个报文段的大小。
tcp默认缓冲区大小
1、数据链路层对数据帧的长度都有一个限制,也就是链路层所能承受的最大数据长度,这个值
称为最大传输单元,即MTU。以以太网为例,这个值通常是1500字节。
2、对于IP数据包来讲,也有一个长度,在IP包头中,以16位来描述IP包的长度,也就是说,
一个IP包,最长可能是65535字节。
3、结合以上两个概念,第一个重要的结论就出来了,如果IP包的大小,起过了MTU值,那么就需要
分片,也就是把一个IP包分为多个,这个概念非常容易理解,一个载重5T的卡车,要拉10T的货,它
当然就得分几次来拉了。
4、IP分片是很多资料常讲的内容,但是我倒是觉得分不分片其实不重要,重要的是另一个东西。一个
数据包穿过一个大的网络,它其间会穿过多个网络,每个网络的MTU值是不同的。我们可以设想,如果
接受/发送端都是以太网,它们的MTU都是1500,我们假设发送的时候,数据包会以1500来封装,然而,
不幸的是,传输中有一段X.25网,它的MTU是576,这会发生什么呢?我想,这个才是我们所关心的。
当然,结论是显而易见的,这个数据包会被再次分片,咱开始用火车拉,到了半路,不通火车,只通汽车,
那一车货会被分为很多车……仅此而已,更重要的是,这种情况下,如果IP包被设置了“不允许分片标志”,那
会发生些什么呢?对,数据包将被丢弃,然事收到一份ICMP不可达差错,告诉你,需要分片!
这个网络中最小的MTU值,被称为路径MTU,我们应该有一种有效的手段,来发现这个值,最笨的方法或许是先
用traceroute查看所有节点,然后一个个ping……
5、到了传输层,也会有一个最大值的限制,当然,对于只管发,其它都不管的UDP来说,不再我们讨论之列。这里
说的是TCP协议。说到大小,或许会让人想到TCP著名的滑动窗口的窗口大小,它跟收发两端的缓存有关,这里讨论
的是传输的最大数据包大小,所以,它也不在讨论之列。
TCP的选项字段中,有一个最大报文段长度(MSS),表示了TCP传往另一端的最大数据的长度,当一个连接立时,连接
的双方都要通告各自的MSS,也就是说,它说是与TCP的SYN标志在一起的。当然,对于传输来讲,总是希望MSS越大越好,
现在超载这么严重,谁家不希望多拉点货……但是,MSS总是有个限制的,也就是MTU-IP头长度-TCP头长度,对于以太网来讲
它通常是1500-20-20=1460,虽然总是希望它能很大(如1460),但是大多数BSD实现,它都是512的倍数,如1024……
6、回到分片上来,例如,在Win2000下执行如下命令:
ping 192.168.0.1 -l 1473
按刚才的说法,1473+20(ip头)+8(icmp头)=1501,则好大于1500,它会被分片,但是,我们关心的是:
这个数据包会被怎么样分法?
可以猜想,第一个包是
以太头+IP头+ICMP头+1427的数据;
那第二个分片包呢?
它可以是:
以太头+IP头+ICMP头+1个字节的数据
或者是:
以太头+IP头+1个字节的数据
也就是省去ICMP头的封装,当然,IP头是不可以省的,否则怎么传输了……
事实上,TCP/IP协议采用的是后一种封装方式,这样,一次可以节约8个字节的空间。IP包头中,用了三个标志来描述一个分片包:
1、分片标志:如果一个包被分片了,被置于1,最后一个分片除外;——这样,对于接收端来讲,可以根据这个标志位做为重组的重
要依据之一;
2、分片偏移标志:光有一个标志位说明“自己是不是分片包”是不够的,偏移标志位说明了自己这个分片拉于原始数据报的什么位置,
很明显,这两个标志一结合,就很容易重组分片包了。
3、不允许分片标志:如果数据包强行设置了这个标志,那么在应该分片的时候,…… err,刚才已经说过了
网络缓冲区大小
RTO 超时重传时间 retransmission timeout RTT 往返时间 round trip time TTL: 存活时间。每经过一个路由器,会减1。防止在网络中无限循环。 发送窗口大小:发送缓存大小,接受缓存大小,丢包退让,慢启动4个因素决定 ARQ: automatic repeat request 自动重传请求 UNA: 旧的未确认的编号。表示此编号前所有的包已收到 ACK: 该编号包已收到 带宽:从一端到另一端网络的传输速度 发送速度:机器中进程调用send, 加上网卡转发的速度 一开始慢启动算法:拥塞窗口(cwnd)的初始值为1,2,4,8,16...每收到一个确认就指数增长。当拥塞窗口(cwnd)的大小等于慢启动门限值(ssthresh),执行拥塞避免算法,线性增长,每经过一个RTT则增加一个MSS的大小。当出现RTO时,ssthresh减为当前拥塞窗口的一半,拥塞窗口(cwnd)初始置为1,执行慢启动算法。循环重复。 MTU: 数据链路层的最大负载上限。最大传输单元。用于IP包分片。 MSS: TCP传输层的最大负载上限。最大报文段长度 网络字节序/主机字节序 计算机内部是小端字节序,网络传输大端字节序 可用带宽 = min(本地发送窗口字节尺寸, 远端可用接收窗口字节尺寸) x (1 - 丢包率) / RTT 连接的udp: 调用connect的udp, 就是远端地址不用每次填充。 无连接的udp: 没有调用connect的udp MSG_PEEK: 用于recv。预读接受缓冲区中的数据,而不会删除接受缓冲区中的数据。 TCP建立连接:交换初始序列号 TCP释放连接发送FIN,表示不再发送数据包,但可以接收。 处于TCP_FIN_WAIT_1和TCP_FIN_WAIT_2,都可以接收数据包,从1进2,因为收到了之前FIN的确认包。当收到对方的FIN包时,发送此包的确认包,就进入TCP_TIME_WAIT状态。 MSL: maximum segment lifetime 发送RST包表示因为异常要关闭连接。接收端收到RST包不用发ACK包。 网络抖动: 延迟和平均延迟的差值。 解决方案: 缓冲 listen的backlog决定全连接队列的大小 以太网适配器 = 网卡
UDP缓冲区
如果发送方发送的是6812H,则根据此规约,不考虑帧内格式字符,纯数据传输的比特流将是:01001000 00010110不过由于标准UART本身就是低位前高位后的协议,所以如果你是使用标准UART的话,从串口缓冲区所取到的数据帧仍然分别是0x12、0x68。至于UDP端口这块儿,俺不太清楚,你可以查一下底层硬件传输时比特流的顺序。如果默认是高位在前的话,就需要增加位序翻转处理;反之则不需要。
udp传输大小限制
65535
对于UDP协议来说,整个包的最大长度为65535,其中包头长度是65535-20=65515;对于TCP协议来说,整个包的最大长度是由最大传输大小(MSS,Maxitum Segment Size)决定,MSS就是TCP数据包每次能够传输的最大数据分段。
为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。
linux修改udp发送缓冲区大小
TCP有一个传输效率的公式:
Delivery Rate = CWND / RTT
CWND
:拥塞窗口大小,以字节为单位。* 在没有出现拥塞时,CWND = 对端通告window大小* 出现拥塞时,CWND 受本端拥塞算法控制,原则上<=带宽最大值*RTTRTT
:TCP报文一来一去的延迟,以秒为单位。如果想充分利用100M带宽,需要尽可能增加CWND大小,而在没有拥堵时,等于对端advertised window (对端缓存)的大小
,假定RTT时间是基本不变的。为何TCP多线程可以充分利用带宽?
变相增加对端的缓存大小。为何UDP可以充分利用带宽?
因为UDP没有拥塞机制,应用程序发送的速率 = 链路的最大带宽。udp发送缓冲区大小设置
udp协议的实时性好,率低。准确
TCP优点:可靠
UDP优点:实时性更好(速度快),UDP可以广播、多播。例:音视频直播等
UDP没有发送缓冲区,有接收缓冲区;TCP有发送缓冲区,也有接收缓冲区。
TCP和UDP的区别如下:
TCP是面向有连接型,UDP是面向无连接型;
TCP是一对一传输,UDP支持一对一、一对多、多对一和多对多的交互通信;
TCP是面向字节流的,UDP是面向数据报的;
TCP支持传输可靠性的多种措施,包括保证包的传输顺序、重发机制、流量控制和拥塞控制;UDP仅提供最基本的数据传输能力;
TCP 保证数据正确性,UDP 可能丢,TCP 保证数据顺序,UDP 不保证。
udp设置缓冲区大小为多少
发送缓冲区可以很大,但是在真正发送数据时需要分片发送。分片发送需要满足以下条件:
1、给每个udp包加上序号。
2、校验字节
每个udp包的最大大小是多少?
65507 约等于 64K
为什么最大是65507?
因为udp包头有2个byte用于记录包体长度. 2个byte可表示最大值为: 2^16-1=64K-1=65535
udp包头占8字节, ip包头占20字节, 65535-28 = 65507
如果要发送的udp报文大于65507怎么办?
需要在应用层由开发者自己分片发送. 分片的粒度最大65507字节. 系统的sendto函数是不支持大于65507字节的单包发送的.
udp默认缓冲区大小
1. tcp 收发缓冲区默认值[root@ ]# cat /proc/sys/net/ipv4/tcp_rmem 4096 87380 416153687380 :tcp接收缓冲区的默认值[root@ ]# cat /proc/sys/net/ipv4/tcp_wmem4096 16384 416153616384 : tcp 发送缓冲区的默认值2. tcp 或udp收发缓冲区最大值[root@ ]# cat /proc/sys/net/core/rmem_max131071131071:tcp 或 udp 接收缓冲区最大可设置值的一半。也就是说调用 setsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen); 时rcv_size 如果超过 131071,那么getsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen); 去到的值就等于 131071 * 2 = 262142[root@ ]# cat /proc/sys/net/core/wmem_max 131071131071:tcp 或 udp 发送缓冲区最大可设置值得一半。跟上面同一个道理3. udp收发缓冲区默认值[root@ ]# cat /proc/sys/net/core/rmem_default 111616:udp接收缓冲区的默认值[root@ ]# cat /proc/sys/net/core/wmem_default111616111616:udp发送缓冲区的默认值4. tcp 或udp收发缓冲区最小值tcp 或udp接收缓冲区的最小值为 256 bytes,由内核的宏决定;tcp 或udp发送缓冲区的最小值为 2048 bytes,由内核的宏决定
udp接收缓存一般开多大
不会阻塞,要么发送成功,要么丢包。这和TCP完全不同因为对UDP来讲,不存在什么ACK过程,结果只有两个,成功或者丢包但是作为形式上,它不会导致阻塞,因此代码将一直执行到结束。
在UDP模式下,不需要重传,因此UDP不存在缓冲区,调用socket的发送API函数时,报文被直接发送到底层,如果目的地址不存在,报文被丢弃,但是没有缓冲区的限制,所以不存在阻塞问题。
udp接收缓冲区最大多少
web使用udp协议
Web页面请求过程可能会用到的协议:DHCP(UDP)、DNS(UDP)、HTTP(TCP);ARP、OSPF、RIP、BGP
工作流程:
首先若主机无IP信息,则需要DHCP配置主机信息(IP、子网掩码、默认网关IP、DNS服务器IP),全是广播报文(FF:FF:FF:FF:FF:FF),并且四次信息交换后才确定好本机IP等信息。它利用UDP报文在客户端68和服务器端67之间传递报文。
然后通过DNS来解析网站域名对应的IP地址(HTTP服务器),通过网关路由器来与DNS服务器交换信息通过递归/迭代查询得到此信息。它利用UDP在53号端口来传递报文。
最后则是要与提供所需服务的HTTP服务器建立起TCP连接,生成TCP套接字从而请求接收服务。先是TCP三次握手(客TCP SYN、服TCP SYN ACK、客TCP ACK-捎带HTTP GET报文请求服务),然后HTTP服务器根据HTTP GET报文生成一个响应,将请求的Web页面内容放入报文主体中发回给主机。客户端收到后则会抽取出页面内容,然后进行渲染,显示Web页面。
在这个数据包传输过程中,若存在无ARP缓存的情况,则首先需要ARP协议来完成IP地址到MAC地址的寻址过程(才可完成点到点的传输,局域网内广播帧)。同时路由器的转发表则涉及到OSPF、RIP(内部网关协议)和BGP(外部网关协议)等路由选择协议来进行相关配置。