Linux网络子系统
文章平均质量分 74
codeVita书码日记
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
05. 详解 connect 系统调用,告别三次握手疑难故障
TCP客户端想通信要先connect一下,但我们大多数人只停留在“成功建连、失败报错”的表层认知,connect阻塞和非阻塞怎么实现的?连接队列是怎么工作的?排查网络故障时只会抓包,却不知道对应内核的哪种行为,导致排查效率极低。三次握手过程涉及到网络包的收发,本文暂时忽略收发过程,后续文章会详细分享。服务端首先调用listen打开监听,初始化连接队列客户端调用connect,sock状态设置为,选择本地端口,构造并发送第一个 syn 包,同时启动重传定时器。至此,三次握手正式启动。原创 2026-09-08 19:50:08 · 554 阅读 · 0 评论 -
深入Linux网络子系统04:accept如何从全连接队列取出TCP连接
从监听套接字的全连接队列中取出一个已完成三次握手的连接,返回其对应的套接字;监听 socket 和 accept 返回的新 socket 有什么区别?阻塞与非阻塞模式下 accept 行为有什么差异?accept 参与三次握手吗?accept 不参与三次握手,只是消费全连接队列中内核已经握手完成的连接;返回全新的已连接套接字 fd,监听 socket 本身不受影响,继续接收新连接;阻塞模式队列为空会睡眠等待;非阻塞模式直接返回 EAGAIN。原创 2026-09-02 19:39:56 · 467 阅读 · 0 评论 -
深入Linux网络子系统03:调用 listen 之后,内核发生了哪些事?
socket()创建套接字、bind()绑定 IP 与端口。完成 bind 之后,socket 还只是处于CLOSED状态,并不能接收客户端连接,想要对外提供服务,必须调用listen()。listen在内核中完成了哪些工作?backlog参数限制的哪一个队列?半连接、全连接队列什么区别?listen()将 socket 从连接创建状态(TCP_CLOSE)切换为监听状态TCP_LISTEN),使其能够接收客户端连接请求,初始化全连接队列,TCP三次握手过程由内核自动完成。原创 2026-08-30 22:49:17 · 290 阅读 · 0 评论 -
深入Linux网络子系统02:bind()到底做了什么?
上一篇文章我们讲了socket()系统调用:它仅仅在内核创建一个空的套接字对象,分配 fd、初始化sock结构体等等,但是没有 IP、没有端口,没有任何地址信息,内核不知道要从哪个网卡、哪个端口收发数据。bind到底干了什么?为什么客户端通常不需要 bind?内核端口绑定原理?socket()创建空白套接字;bind()为套接字分配本地 IP + 端口,在内核建立地址映射bind 内核流程:状态校验→拷贝地址→端口冲突检查→填充 socket 地址→注册bhash。原创 2026-08-25 10:45:05 · 249 阅读 · 0 评论 -
深入Linux网络子系统01:socket() 到底做了什么?
Linux网络编程:socket()函数内核实现解析 本文通过分析socket()函数的内核实现过程,揭示Linux网络子系统的核心工作机制。当用户调用socket()创建TCP套接字时,内核主要完成以下操作: 结构体初始化:通过sock_alloc()分配socket结构体,sk_alloc()分配sock结构体,形成socket(用户层接口)与sock(内核协议栈实体)的对应关系。 协议栈注册:根据协议族(如AF_INET)找到注册的inet_family_ops操作集,调用其create方法(inet原创 2026-07-11 16:10:37 · 335 阅读 · 0 评论
分享