自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(5)
  • 收藏
  • 关注

原创 05. 详解 connect 系统调用,告别三次握手疑难故障

TCP客户端想通信要先connect一下,但我们大多数人只停留在“成功建连、失败报错”的表层认知,connect阻塞和非阻塞怎么实现的?连接队列是怎么工作的?排查网络故障时只会抓包,却不知道对应内核的哪种行为,导致排查效率极低。三次握手过程涉及到网络包的收发,本文暂时忽略收发过程,后续文章会详细分享。服务端首先调用listen打开监听,初始化连接队列客户端调用connect,sock状态设置为,选择本地端口,构造并发送第一个 syn 包,同时启动重传定时器。至此,三次握手正式启动。

2026-09-08 19:50:08 554

原创 深入Linux网络子系统04:accept如何从全连接队列取出TCP连接

从监听套接字的全连接队列中取出一个已完成三次握手的连接,返回其对应的套接字;监听 socket 和 accept 返回的新 socket 有什么区别?阻塞与非阻塞模式下 accept 行为有什么差异?accept 参与三次握手吗?accept 不参与三次握手,只是消费全连接队列中内核已经握手完成的连接;返回全新的已连接套接字 fd,监听 socket 本身不受影响,继续接收新连接;阻塞模式队列为空会睡眠等待;非阻塞模式直接返回 EAGAIN。

2026-09-02 19:39:56 467

原创 深入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

原创 深入Linux网络子系统02:bind()到底做了什么?

上一篇文章我们讲了socket()系统调用:它仅仅在内核创建一个空的套接字对象,分配 fd、初始化sock结构体等等,但是没有 IP、没有端口,没有任何地址信息,内核不知道要从哪个网卡、哪个端口收发数据。bind到底干了什么?为什么客户端通常不需要 bind?内核端口绑定原理?socket()创建空白套接字;bind()为套接字分配本地 IP + 端口,在内核建立地址映射bind 内核流程:状态校验→拷贝地址→端口冲突检查→填充 socket 地址→注册bhash。

2026-08-25 10:45:05 249

原创 深入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

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除