无法打开udp套接字

无法打开udp套接字,第1张

三、解决方法

        1、修改应用程序代码,一直 recvfrom 收数据,netbuf 用完即释放。

        2、修改 base,将 netbuf 数量改大或者消息队列长度改小(消息队列长度改小如果接收速度慢可能会丢数)。

        修改 netbuf 的头文件在 libsylixos/SylixOS/config/net/ 目录下的 net_perf_cfg.h。第 34 行 LW_CFG_LWIP_MSG_SIZG 为一个套接字最大的消息队列长度,第39行 LW_CFG_LWIP_NUM_NETBUF 为系统总的 netbuf 数量。

就个人而言,网络中,抛开网络安全加密这些,就只单单讨论协议本身,比较难的有三个地方:

其实协议本身根据《TCP/IP详解卷1》理解起来并不难,但是实现起来就很难:数据的操作,标志位的设置,网络状态的变换,中断多线程通讯等等;

在下图的七层网络协议参考模型中,IP层属于网络层,网络层最主要的作用就是:将指定IP的数据报传输到对应的主机。

下图是以太帧封装格式(RFC 894),RFC 894封装格式也是我们最常用的。

下面做个简单介绍:

下面再看看数据部分:IP数据报

图中从左到右为0~31位,共四个字节,从上到下依次增长,IP头部占20字节,剩下的为数据,如果传输层为TCP则还有20字节的TCP头部,如果是UDP则还有8字节(如果分片的话,中间的包没有UDP头部,即0字节)的UDP头部。剩下的才是真正的用户要传送的数据。可以看出传送同样多的数据,UDP协议要比TCP传送的数据多,但从这一点来说UDP速度也要比TCP快。

下面对一些字段做个简单介绍:

从上面的介绍我们知道,一个以太帧最大为1518字节

(14字节以太首部,20字节IP首部,UDP8/TCP20,因此IP包每次最大为1500==MTU。去掉协议头UDP有效数据1472字节,TCP为1460字节。还有最后的4字节CRC),但是一个IP数据报则可能会有8192字节,超过以太帧的最大限制,那么这时就需要IP分片,分批进行传输。

发送方会在IP层将要发送的数据分成多个数据包分批发送,而接收方则将数据按照顺序再从新组织起来,等接收到一个完整的数据报之后,然后再提交给上一层传输层。

我们知道,协议本身并没有对数据在各个层中间怎么传递做出要求,比如嵌入式实现和BSD实现就不太一样,因为嵌入式内存比较少,数据在层与层之间传递时会尽量避免数据拷贝,而只是指针的操作。下面我们以嵌入式中用的比较多的LwIP举例

LwIP允许的最大IP由如下决定: IP_REASS_MAX_PBUFS 决定IP分片允许最大pbuf数量, IP_REASS_MAXAGE 分片的生存时间,超过则错误并将之前接收的IP分片丢弃。

如果数据大于 IP_REASS_MAX_PBUFS 则有两种选择,一,直接删除数据返回;二,是删除生存时间最长的IP分片PBUF,这个通过 IP_REASS_FREE_OLDEST 来使能。

当为UDP协议时,如果缓冲区描述符大小小于完整的IP数据包,IP分片数据包到来时,很快将描述符耗尽,后来的IP包由于无缓冲区描述符而丢弃,UDP没有重传机制,很可能永远不会接收到完整的IP分片包。从而大于 IP_REASS_MAXAGE 出现错误,因此缓冲区描述符也应增大以适应IP分片重装。

TCP发送数据时,将大于MSS的数据分段(segment不叫分片),MSS一般为1460.所以,TCP数据包不会在IP层分片。

IP头部有3位标志字段,标志是否为分片包。第一位无用,第二位0:允许分片,1:不允许。第三位0:最后一片,1:后面还有分片。13位offset表示偏移,用于IP重组时数据排序,13位因此支持最大IP数据包为8192字节。

标准的BSD协议实现如下图所示,采用两个结构体,IPQ为表头,将各个IP分片表头连接起来,并存储IP信息。Ipasfrag为具体的分片数据。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/403463.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-21
下一篇2023-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存