热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

udp传输丢包问题

本文主要介绍关于kubernetes,conntrack的知识点,对【k8s之udp丢包问题】和【udp传输丢包问题】有兴趣的朋友可以看下由【分享放大价值】投稿的技术文章,希望该技术和经验能帮到你解决

本文主要介绍关于kubernetes,conntrack的知识点,对【k8s之udp丢包问题】和【udp传输丢包问题】有兴趣的朋友可以看下由【分享放大价值】投稿的技术文章,希望该技术和经验能帮到你解决你所遇的kubernetes,疑难杂症相关技术问题。

udp传输丢包问题

最近在k8s环境上,碰到udp丢包的问题,测试拓扑图如下,

#include #include #include #include #include #include #include #include #include #include #include #include #define __USE_GNU #include #include #include #include #define THREAD_COUNT 4 struct sockaddr_in sin; unsigned char sendBuf[sizeof(struct ethhdr) + 60]; int info[THREAD_COUNT]; int sockfd[THREAD_COUNT]; static int source_port; static int source; static int last_use[THREAD_COUNT]; unsigned short checksum(unsigned short *buf,int nword) { unsigned long sum; for(sum=0;nword>0;nword--) { sum += *buf++; sum = (sum>>16) + (sum&0xffff); } return ~sum; } #define PORT_RANGE_START (40000) #define PORT_RANGE_END (65535) #define PORT_RANGE_MASK (PORT_RANGE_END - PORT_RANGE_START) uint16_t get_port(uint32_t seed) { return (seed & PORT_RANGE_MASK) + PORT_RANGE_START; } int create_socket(int index) { //套接字 sockfd[index] = socket(AF_INET, SOCK_RAW, IPPROTO_UDP); if (sockfd[index] == -1) { perror("create socket fail"); return 0; } int daddr = inet_addr("2.2.2.4"); sin.sin_family = AF_INET; sin.sin_port = htons(80); sin.sin_addr.s_addr = daddr; int val = 1; if (setsockopt(sockfd[index], IPPROTO_IP, IP_HDRINCL, &val, sizeof(val)) <0) { printf("IP_HDRINCL\n"); return 0; } //填充IP头部 struct iphdr ipheader; memset(&ipheader, 0, sizeof(struct iphdr)); ipheader.version = 0x4; ipheader.ihl = 0x5; ipheader.tos = 0x00; ipheader.tot_len = htons(60); //20 + 8 + 32 ipheader.id = 0x1000; ipheader.frag_off = 0x0000; ipheader.ttl = 128; ipheader.protocol = 17; ipheader.check = 0; ipheader.saddr = inet_addr("2.2.2.2"); ipheader.daddr = daddr; ipheader.check = checksum((void *)&ipheader, sizeof(struct iphdr)); struct udphdr udpheader; udpheader.source = htons(1000); udpheader.dest = htons(80); udpheader.len = htons(40); udpheader.check = 0; memset(sendBuf, 0, sizeof(sendBuf)); memcpy(sendBuf, &ipheader, sizeof(struct iphdr)); memcpy(sendBuf + sizeof(struct iphdr), &udpheader, 8); } void *worker(void *arg) { int *a = (int *)arg; int index = *a; printf("the index is: %d\n", index); //显示是第几个线程 cpu_set_t mask; //CPU核的集合 CPU_ZERO(&mask); //置空 CPU_SET(index, &mask); //设置亲和力值 if (sched_setaffinity(0, sizeof(mask), &mask) == -1)//设置线程CPU亲和力 { printf("warning: could not set CPU affinity, continuing...\n"); } create_socket(index); while (1) { if (source == last_use[index]) continue; struct udphdr* udpheader = NULL; udpheader = (struct udphdr*)(sendBuf + sizeof(struct iphdr)); last_use[index] = source; udpheader->source = htons(source); udpheader->check = 0; udpheader->check = checksum((void *)udpheader, 40); printf("source port is %d on thread %d socket: %d\n", udpheader->source, index, sockfd[index]); int len= sendto(sockfd[index], sendBuf, sizeof(sendBuf), 0, (const struct sockaddr*)&sin, sizeof(struct sockaddr)); if (len > 0) printf("send success.\n"); else perror("send fail"); } } int main(void) { int i = 0; //创建多个线程 for (i = 0; i

下面编译程序,开始复现

//配置ens8 ip为2.2.2.2/24
root@node2:~#ifconfig ens8 2.2.2.2/24
//2.2.2.4是不存在的,所以需要配置静态arp
root@node2:~#arp -s 2.2.2.4 00:00:00:00:00:01

//编译
root@node2:~#gcc -o udp udp_client.c -lpthread

//程序执行前,查看计数
root@node2:~# conntrack -S
cpu=0           found=0 invalid=57309 ignore=1171 insert=0 insert_failed=2636 drop=1730 early_drop=0 error=0 search_restart=3215
cpu=1           found=0 invalid=53922 ignore=1368 insert=0 insert_failed=3344 drop=2464 early_drop=0 error=0 search_restart=3048
cpu=2           found=0 invalid=61931 ignore=1591 insert=0 insert_failed=2573 drop=2035 early_drop=0 error=0 search_restart=2669
cpu=3           found=0 invalid=59014 ignore=383 insert=0 insert_failed=1124 drop=571 early_drop=0 error=0 search_restart=1790

//执行程序一段时间,比如一分钟
root@node2:~#./udp

//再次查看计数,可看到insert_failed已经在涨了
root@node2:~# conntrack -S
cpu=0           found=0 invalid=57309 ignore=1171 insert=0 insert_failed=2637 drop=1730 early_drop=0 error=0 search_restart=3215
cpu=1           found=0 invalid=53922 ignore=1368 insert=0 insert_failed=3345 drop=2464 early_drop=0 error=0 search_restart=3048
cpu=2           found=0 invalid=61931 ignore=1591 insert=0 insert_failed=2573 drop=2035 early_drop=0 error=0 search_restart=2669
cpu=3           found=0 invalid=59014 ignore=383 insert=0 insert_failed=1126 drop=571 early_drop=0 error=0 search_restart=1790
参考

此问题的复现方法和fix时的log
https://github.com/brb/conntrack-race

腾讯云-k8s网络疑难杂症排查分享
https://segmentfault.com/a/1190000020069368?utm_source=tag-newest

也可参考:k8s之udp丢包问题 - 简书 (jianshu.com) 

本文《k8s之udp丢包问题》版权归分享放大价值所有,引用k8s之udp丢包问题需遵循CC 4.0 BY-SA版权协议。


推荐阅读
  • 小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限
    小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限 ... [详细]
  • 本文将详细探讨 Linux 系统中的 netstat 命令,该命令用于查看网络状态和连接情况。通过了解 IP 地址和端口的基本概念,我们将更好地理解如何利用 netstat 命令来监控和管理网络服务。 ... [详细]
  • 本文提供了一个全面的Kubernetes(K8s)技能图谱,旨在帮助技术从业者和爱好者系统地了解和掌握K8s的核心概念、操作实践以及相关工具。该图谱将定期更新,以反映最新的技术和行业趋势。 ... [详细]
  • 本文深入探讨了Kubernetes中Pod的基础概念及其分类,旨在帮助读者更好地理解和利用这一核心组件。通过详细的解析,我们将了解Pod如何作为最小的部署单元在Kubernetes集群中工作。 ... [详细]
  • Kubernetes与Docker之间的关系解析
    本文探讨了Kubernetes(简称k8s)与Docker之间的关系,旨在帮助读者理解这两种技术如何协同工作,以提高应用程序的部署效率和可扩展性。文章首先介绍了两者的基本概念,然后从虚拟化和部署的角度深入分析。 ... [详细]
  • 本文详细介绍了如何利用go-zero框架从需求分析到最终部署至Kubernetes的全过程,特别聚焦于微服务架构中的网关设计与实现。项目采用了go-zero及其生态组件,涵盖了从API设计到RPC调用,再到生产环境下的监控与维护等多方面内容。 ... [详细]
  • 匠心|传统_2021年度总结 | 葡萄城软件开发技术回顾(上)
    匠心|传统_2021年度总结 | 葡萄城软件开发技术回顾(上) ... [详细]
  • 重新审视Kubernetes的必要性
    近期,我注意到不少人误以为我是Kubernetes的推广者。实际上,我只是分享了一些适合用Kubernetes解决的案例。本文旨在探讨Kubernetes的适用场景,并提供一些替代方案。 ... [详细]
  • 深入解析 RuntimeClass 及多容器运行时应用
    本文旨在探讨RuntimeClass的起源、功能及其在多容器运行时环境中的实际应用。通过详细的案例分析,帮助读者理解如何在Kubernetes集群中高效管理不同类型的容器运行时。 ... [详细]
  • Kubernetes 实践指南:初次体验
    本文介绍了如何通过官方提供的简易示例,快速上手 Kubernetes (K8S),并深入理解其核心概念和操作流程。 ... [详细]
  • 为何Compose与Swarm之后仍有Kubernetes的诞生?
    探讨在已有Compose和Swarm的情况下,Kubernetes是如何以其独特的设计理念和技术优势脱颖而出,成为容器编排领域的领航者。 ... [详细]
  • 本文总结了一次针对大厂Java研发岗位的面试经历,探讨了面试中常见的问题及其背后的原因,并分享了一些实用的面试准备资料。 ... [详细]
  • EHF频段(5G毫米波频段)的应用与发展
    国际电信联盟(ITU)负责管理卫星业务的频段分配,其中Ka频段因其较高的雨衰减和对器件工艺的高要求,发展相对缓慢。然而,随着C波段和Ku波段卫星轨道资源的枯竭及频率带宽的紧张,Ka频段近年来得到了快速发展。 ... [详细]
  • Kubernetes 1.9.0 Alpha.1 发布公告 [Kubernetes 最新动态]
    近日,Kubernetes 社区发布了两个新版本:1.8.0 RC.1 和 1.9.0 Alpha.1。这是 k8s 1.9.0 的首次发布,自 v1.8.0 Alpha.3 以来进行了大量更新,共提交了 279 次。 ... [详细]
  • 检查 Kubernetes 系统命名空间中的 Pod 状态时,发现 Metric Server Pod 虽然处于运行状态,但存在异常:日志显示 'it doesn’t contain any IP SANs'。 ... [详细]
author-avatar
加肥的猫miao_115
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有