
linux 网络
文章平均质量分 95
linux 网络
王YANLONG
技术总结,自我沉淀
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
linux内核网络分层概述
在开发应用时,我们使用 socket 实现网络数据的收发。以tcp为例,server端通过 socket, bind, listen来创建服务端,然后通过 accept接收客户端连接;客户端通过 socket和 connect系统调用来创建客户端。用于数据收发的系统调用包括 send, recv, sendto, recvfrom等。除了上述系统调用之外,另外还有多路复用技术 select,poll, epoll,也常常在网络应用中使用。在做应用开发时,使用上述系统调用比较简单和简洁。对于 linux原创 2024-12-22 09:43:32 · 873 阅读 · 0 评论 -
fastdds基础:多播
支持多播和广播,这是udp相对于tcp的优势。因为tcp是面向连接的协议,面向连接的意思是一对一之间的连接,那么tcp就无法支持多播和广播。多播的应用比较广泛,比如视频会议、在线直播。在fastdds中也使用了多播,用多播来做writer和reader之间的发现,也叫服务发现。多播也叫组播。原创 2024-11-17 20:45:37 · 1423 阅读 · 0 评论 -
xdp 入门
xdp 全称 eXpress Data Path,是 linux ebpf 中的一个功能。ebpf 在内核中预留了一些插入点,用户可以在这些插入点插入自己的处理逻辑,当数据路过插入点时可以做一些预期的处理,具体实现方式如下:① 用户编写数据处理代码,也就是对于路过这个插入点的数据想做什么处理② 将代码编译③ 将编译好的目标文件安装到插入点安装之后,数据路过插入点时便会被安装的代码处理。插入点的处理逻辑就像一些路口的收费站,不同身份的车辆通过收费站的时候,可能需要做不同的事情。原创 2024-02-28 18:08:19 · 4634 阅读 · 0 评论 -
select、poll、epoll的区别
select、poll、epoll均为linux中的多路复用技术。3种技术出现的顺序是select、poll、epoll,3个版本反应了多路复用技术的迭代过程。我们现在开发网络应用时, 一般都会使用多路复用,很少有用一个线程来监听一个fd的,其中epoll又是最常使用的。关于epoll的实现和常见问题可以参考。当我们在使用epoll的时候,会想当然的认为这种技术是理所应当的,这就是多路复用技术应该的样子。殊不知,从select到poll再到epoll也经历了一定的过程,epoll并不是一开始就出现的。原创 2024-09-07 21:57:22 · 1171 阅读 · 0 评论 -
阻塞、非阻塞、同步、异步
异步机制,在实际工作中,往往是用户向异步实现模块注册回调,线程发送请求并注册回调之后,就交给底层的异步模块来负责,线程就不用关心了,有事件到来之后,异步调度模块会自动调用用户注册的回调。领导给你下发任务之后,并不是只盯着你的工作,其它什么工作都不做了。而是给你安排任务之后,就去做其它工作了,但是领导过一会就来问你,工作完成了没有,直到你工作完成,就不来问你了。领导给你下发了任务,下发之后,领导什么事都不做了,而是坐在你的工位旁边,一直监督着你来工作,直到你完成工作,领导才回去做其它的工作,这就是阻塞模式。原创 2024-06-01 22:04:51 · 693 阅读 · 0 评论 -
napi:linux网卡驱动收包机制
linux 操作系统一般指 linux 内核。在 linux 上开发应用的时候,可以使用 linux 提供的系统调用。linux 内核管理着机器上的硬件资源:内存,磁盘,网卡等。开发应用的时候不能直接操作这些硬件,而只能通过系统调用来使用这些资源。linux 系统调用可以说是 linux 内核提供给上层的一些接口。这种内核和用户隔离的机制保证了安全性的同时,也简化了应用的开发。linux 内核除了给上层应用提供了接口之外,给底层的硬件驱动也提供了框架和机制。原创 2024-04-20 16:10:12 · 1828 阅读 · 0 评论 -
linux 中 unix socket 常见使用场景
unix socket 又称本地套接字,用于系统内的进程间通信,不能用于跨系统的网络通信(跨系统网络通信可以使用 tcp, udp)。unix socket 分为 3 类:socketpair, fs unix socket, abstract unix socket。原创 2024-01-13 12:03:13 · 2700 阅读 · 0 评论 -
epoll实现原理和常见问题总结
epoll 是一种多路复用技术。多路复用技术即一个线程可以监听多个文件句柄的的事件,多路指的是多个句柄,复用是指多个句柄复用一个线程资源。可想而知,和多路复用技术相对的就是一个文件句柄使用一个线程来监听。多路复用技术适用于高并发的场景。除了 epoll, linux 中的多路复用技术还有 poll 和 select。nginx, libevent, golang net 库中均使用了 epoll。原创 2024-01-13 16:09:11 · 1450 阅读 · 0 评论 -
使用 tcp 时常见注意事项
本文中使用的代码参考如下:tcp server: tcp client:“Address already in use” 是一个错误,经常出现在服务端,比如当一个服务端退出之后立即又起来,这个时候服务端 bind 的时候很可能返回这个错误。当 tcp 连接断开的时候,主动断开连接的一方,最后一个状态是 time wait,这个定时器的时间是 60s,所以当服务端退出的时候,time wait 状态还没有结束。在 linux 中,我们常常说进程是资源管理的单位,进程的资源包括内存,打开的文件,信号原创 2024-01-23 20:53:23 · 1327 阅读 · 1 评论 -
linux tcp 主要数据结构
当讨论 tcp 的时候, 我们能想到很多概念:传输层协议,面向连接,可靠,字节流,状态机,三次握手,四次挥手,端口号,连接队列,mss,rtt,定时器,ack,流控,拥塞控制,重传机制,窗口,慢启动,序列号,保序,发送缓冲区,接收缓冲区,nagle,minshall,autocrok,fastopen,慢路径和快路径,延迟 ack,NODELAY, linear, SO_REUASEADDR,SO_REUSEPORT,tso,time-wait, address already in use,性能,吞吐量,原创 2024-01-28 19:50:00 · 1198 阅读 · 1 评论 -
tcp中使用的定时器
定时器的使用场景主要有两种。(1)周期性任务这是定时器最常用的一种场景,比如 tcp 中的 keepalive 定时器,起到 tcp 连接的两端保活的作用,周期性发送数据包,如果对端回复报文,说明对端还活着;如果对端不回复数据包,就会判定对端已经不存在了;再比如分布式系统中,各个组件之间的心跳报文也是定时发送来维护组件之间的状态。(2)兜底功能一些不立即执行的任务的时间底线。原创 2024-02-12 19:54:44 · 2052 阅读 · 1 评论 -
从可靠性的角度理解tcp
可靠性是 tcp 最大的特点。常见的用户层协议,比如 http, ftp, ssh, telnet 均是使用的 tcp 协议。可靠性,即从用户的角度来看是可靠的,只要用户调用系统调用返回成功之后,tcp 协议栈保证将报文发送到对端。引起不可靠的表现主要有两个方面,丢包和乱序。对于 tcp 来说,即使报文在传输过程中出现了丢包或者乱序,tcp 协议也能通过重传、排序等方式解决这些问题。(1)丢包丢包的原因,比如链路上有一个节点(比如路由器, 交换机或服务器)的网卡接收缓冲区满,会导致丢包;原创 2024-02-19 13:50:07 · 1552 阅读 · 1 评论 -
netfilter
iptables,ip 说明这个工具工作在 ip 层,tables 说明这个工具的工作方式,通过多个表来工作。iptables 基于 netfilter 来实现,常常被用来做防火墙,通过 iptables 可以对报文进行过滤,修改或者 NAT。iptables 包括的概念比较多,功能很丰富,当然也很复杂,本文中只对一些基本的概念和操作做梳理。原创 2024-02-19 14:28:00 · 1185 阅读 · 0 评论 -
使用 kprobe 观察 tcp 拥塞窗口的变化
tcp 中拥塞窗口用来做拥塞控制。在发送侧,要发送数据的时候会基于拥塞窗口进行判断,当前这个包还能不能发送出去。tcp 发包函数是 tcp_write_xmit(),在这个函数中调用 tcp_cwnd_test() 来判断当前拥塞窗口让不让发包。从 tcp_cwnd_test() 函数能看出来,in_flight 是已经发送出去,但是还没有被确认的包,如果这个数大于拥塞窗口,那么就返回 0,不能发包了,因为没有确认的包太多了,再发送可能加重网络拥塞,所以就返回 0。原创 2024-03-04 09:22:27 · 1721 阅读 · 0 评论 -
socket非阻塞模式使用注意事项
在使用 socket 的一些 api 的时候,默认情况下都是阻塞模式。比如使用 tcp socket 时,客户端调用 connect() 创建连接,connect() 返回的时候要么是创建连接成功了,要么是出现了错误,反正 connect() 返回的时候结果是确定的;tcp 服务端使用 accept() 接收连接的时候,accept() 返回的时候一般就是接收到了新的连接;使用 recv() 接收数据的时候,直到接收到数据之后,才会返回;原创 2024-03-12 21:09:48 · 1452 阅读 · 0 评论