![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Socket源码分析
文章平均质量分 78
Mrpre
??
展开
-
PAWS 到底是什么
名词PAWS : Protection Against Wrapping SequenceISN: Init sequence NumberSEQ 回环TCP的 seq 是一个u32的递增数字,SYN和FIN会消耗一个seq,其次每个TCP的payload都会消耗对应长度的seq,也就是说,对于每一个TCP连接而言,seq是单调递增的,所以u32会溢出于是就回环了,回环本身没有什么问题,常见的通过将seq强转成有符号比较,if ((s32)current > (s32)last),永远能简单高原创 2022-05-07 16:36:12 · 1798 阅读 · 0 评论 -
netlink 读取数据流程
前言本篇缘起是我要实现类似ss -i 的功能,通过netlink获取系统中的所有socket信息代码如下//发送tcpdiag的数据sendto(netlinkdf, msg,...)//sleep足够时间,使得内核处理//因为每次都读取少部分数据,以为内核没来得及处理sleep(10)char buffer[10000]len = recvfrom(buffer, sizeof(buffer), 0);上面流程中,recvfrom 返回的字节大小,小于buffer大小,理应我们认为原创 2022-04-23 21:23:32 · 1247 阅读 · 0 评论 -
tcp_diag 内核相关实现 以及调用层次
tcp_diag 内核相关实现前言tcp_diag 是一个内核模块,本文的目的是梳理调用关系,如果从用户态的socket一路调用到tcp_diag模块dump出所有socket的。大致分层关系 总结如下:netlink层->sock_diag层->inet_diag层->tcp_diag用户态代码类似 ss 功能的代码可以从 https://man7.org/linux/man-pages/man7/sock_diag.7.html 中获得,但是它只是打印 unix_socket原创 2022-04-22 16:09:19 · 3971 阅读 · 0 评论 -
通过splice完成socket代理零拷贝
spilce 的应用通常,一个反向代理服务器,需要做转发处理,例如流量模型如下:client -> proxy -> server客户端和 proxy建立socket,然后proxy和server建立socket下面这个程序逻辑非常简单,从fd获取数据,将数据转发到fd2。为了让 fd对应的socket有待读数据,这里访问了1.1.1.1,它是我启动的server。#define _GNU_SOURCE#include <unistd.h>#include <原创 2020-06-12 17:27:28 · 1464 阅读 · 0 评论 -
TCP选项分析 之 SO_REUSEADDR
TCP选项分析 之 SO_REUSEADDR首先 从工程角度考虑如下问题问题: 1:Server 进行 bind(),listen(),accept(),然后进行等待Client连接。 2:Client 进行 连接。即,Server的accept()返回client_fd 3:Server 程序退出(异常退出,或者)。但是和客户端的连接依旧存在。 4:Server 重启程序,但...原创 2018-09-12 08:59:56 · 1118 阅读 · 0 评论 -
socket源码分析之accept
socket源码分析之accept()基于 kernel 3.10 之前有分析过TCP accept()的实现,但是太过于沉浸于代码本身,没有结合应用去分析accept()函数。 我们要解决如下几个问题: 1:accept()函数的实现,包括从全队列中取出sock。 2:accept()函数如何如何被唤醒 3:accept()函数如何解决惊群 4:多个进程accept(),...原创 2018-09-12 09:02:04 · 2763 阅读 · 4 评论 -
tcp_tw_reuse对客户端的作用
tcp_tw_reuse对客户端的作用客户端频繁建立连接然后主动关闭连接,会产生大量TIME_WAIT,此时,如何快速利用TIME_WAIT呢?必须满足下面所有条件:客户端:/proc/sys/net/ipv4/tcp_tw_reuse 为 1/proc/sys/net/ipv4/tcp_timestamps 为 1 TIME_WAIT socket 生存时间超过1秒服务端:...原创 2019-04-16 10:48:56 · 2576 阅读 · 0 评论 -
进程间文件描述符传递原理
进程间文件描述符传递原理进程中文件的管理以及fork每个进程的文件描述符是独立的,即一个进程打开的文件描述符是记录在进程对象上的(task_struct)。task_struct { files_struct *files;}files_struct { struct fdtable __rcu *fdt;}fdtable { struct file _...原创 2019-06-06 13:36:13 · 2476 阅读 · 0 评论