今天我们来分析 TCP Server 模块 的实现原理,下面这张图是来自 Swoole 的官网。...那么,我们就主要分析这段言简意赅的代码,从这段代码中可以看出设置了四个回调方法,还有构造方法 new Swoole\Server(127.0.0.1, 9503)、服务启动方法 $server->start...zval *zserv = ZEND_THIS; char *host; size_t host_len = 0; zend_long sock_type = SW_SOCK_TCP...TCP Server 模式是基础模块,我们经常使用的 HTTP 模块就是基于此模块进行扩展的,所以我们需要有一定的了解。
今天笔者就从Linux源码的角度看下Server端的Socket在进行Accept的时候到底做了哪些事情(基于Linux 3.10内核)。...理解accept的关键点是,它会创建一个新的Socket,这个新的Socket来与对端运行connect()的对等Socket进行连接,如下图所示: 接下来,我们就进入Linux内核源码栈吧 accept...关于epoll的原理可以看下笔者之前的博客《从linux源码看epoll》: https://www.cnblogs.com/alchemystar/p/13161781.html 在这里描述一下原因,...,可以见笔者另一篇博客的详细分析 《从Linux源码看Socket(TCP)的listen及连接队列》: https://www.cnblogs.com/alchemystar/p/13845081.html...总结 Linux内核源码博大精深,每次扎进去探索时候都会废寝忘食,其间可以看到各种优雅的设计,在此分享出来,希望对读者有所帮助。
kernel代码版本细微变化 值得注意的是,linux本身官方发布的2.6.32源码对于tcp_syn_retries2的解释和RFC并不一致(至少笔者阅读的代码如此,这个细微的变化困扰了笔者好久,笔者下载了和机器对应的内核版本后才发现代码改了...以下为代码对比: ========================>linux 内核版本2.6.32-431<======================== #define TCP_TIMEOUT_INIT...,源码如下所示: int tcp_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t size){...其源码可见笔者的blog: https://my.oschina.net/alchemystar/blog/1936433 tcp_retries2的设置位置为: cat /proc/sys/net/ipv4...我们先看下系统调用的源码: read系统调用 socket的read系统调用最终调用的是tcp_recvmsg, 其源码如下: int tcp_recvmsg(struct kiocb *iocb, struct
从linux源码看socket(tcp)的timeout 前言 网络编程中超时时间是一个重要但又容易被忽略的问题,对其的设置需要仔细斟酌。...kernel代码版本细微变化 值得注意的是,linux本身官方发布的2.6.32源码对于tcp_syn_retries2的解释和RFC并不一致(至少笔者阅读的代码如此,这个细微的变化困扰了笔者好久,笔者下载了和机器对应的内核版本后才发现代码改了...以下为代码对比: ========================>linux 内核版本2.6.32-431<======================== #define TCP_TIMEOUT_INIT...,源码如下所示: int tcp_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t size){...我们先看下系统调用的源码: read系统调用 socket的read系统调用最终调用的是tcp_recvmsg, 其源码如下: int tcp_recvmsg(struct kiocb *iocb, struct
今天笔者就来从Linux源码的角度看下Server端的Socket在进行bind的时候到底做了哪些事情(基于Linux 3.10内核)。...源码调用栈吧。...SO_REUSEADDR 在之前的源码里面,我们看到判断bind是否冲突的时候,有这么一个分支 (!reuse || !...SO_REUSEPORT SO_REUSEPORT是Linux在3.9版本引入的新功能。...https://www.nginx.com/blog/socket-sharding-nginx-release-1-9-1/ 总结 Linux内核源码博大精深,一个看起来简单的bind系统调用竟然牵涉这么多
Zabbix源码分析 -- net.tcp.port 关于 thinkc(社区川总) 某大型企业云计算架构师,多年Zabbix,Python,Linux使用经验,社区群活跃核心成员之一 Zabbix版本...下面简单分析一下。 想了解zbx端口监控,就是分析net.tcp.port这个键值的实现原理。...非常熟悉的ZBX_METRICparameters_xxxx[] =格式,具体分析请参见zbx源码分析 -- agent.ping net.tcp.port对应的NET_TCP_PORT函数所在的文件是...NET_TCP_PORT函数中最主要的就是调用tcp_expect函数,tcp_expect函数的实现就在NET_TCP_PORT函数的上方。 ?...zbx对功能函数进行了大量二次封装,再加上迭代调用,导致我们这些初学者刚开始看会很挠头,但只要稍微耐心一点,还是可以分析清楚的。
上一篇文章我们分析了shutdown方法的实现,这里我们再看下close方法。...= NULL) { u32 len = TCP_SKB_CB(skb)->end_seq - TCP_SKB_CB(skb)->seq; ......tcp_set_state(sk, TCP_CLOSE); tcp_send_active_reset(sk, sk->sk_allocation); } else if (sock_flag...tcp_send_fin(sk); } ... } EXPORT_SYMBOL(tcp_close); 方法描述 1....如果未读字节数等于0,则调用tcp_close_state方法,根据当前sk状态设置sk下一状态,比如,假设当前sk状态为TCP_ESTABLISHED,则下一状态为TCP_FIN_WAIT1,该方法的返回值为
在上一篇文章 Linux epoll 源码分析 2 中,我们分析了 epoll_ctl 的 ep_insert 方法,在这里我们继续看下 ep_remove 和 ep_modify 方法。...struct file *file = epi->ffd.file; ... // 将epitem从tcp socket的事件变动通知队列中移除 ep_unregister_pollwait...有关tcp在何种情况下,会通知给epoll何种事件,我们会在其他文章中详细讲解。
对比上一篇文章中的tcp_prot中各字段的值我们可以知道,sk->sk_prot->get_port指向的是inet_csk_get_port方法。
在linux下,假设我们想打开文件/dev/tty,我们可以使用系统调用open,比如: int fd = open("/dev/tty", O_RDWR, 0); 本文将从源码角度看下,在linux内核中...// include/linux/fs.h struct filename { const char *name; /* pointer to actual...限于篇幅原因,本文暂且分析到这,下一篇继续分析vfs_open方法。 完。
/* * linux/mm/memory.c * * (C) 1991 Linus Torvalds */ /* * demand-loading started 01.12.91 -...invalidate()"s - I wasn't doing enough of them. */ #include #include #include linux.../sched.h> #include linux/head.h> #include linux/kernel.h> volatile void do_exit(long code); static
我的源码分析,是基于Linux Kernel 4.4.19 (https://www.kernel.org/pub/linux/kernel/v4.x/patch-4.4.19.gz)版本的,由于namespace...初始化完成处理信息 调用 wake_up_new_task 将子进程加入调度器,为之分配 CPU 如果是 vfork,父进程等待子进程完成 exec 替换自己的地址空间 ##copy_process源码分析...###sched_fork源码分析 linux-4.4.19/kernel/sched/core.c #2187 int sched_fork(unsigned long clone_flags, struct...return 0; } 我们可以看到sched_fork大致完成了两项重要工作,一是将子进程状态设置为 TASK_RUNNING,二是为其分配 CPU ###copy_thread_tls源码分析...return PTR_ERR(new_ns); tsk->nsproxy = new_ns; return 0; } ###Create_new_namespaces源码分析
继上一篇 Linux epoll 源码分析 1,我们来继续看下 epoll_ctl 方法。...下面,我们再以tcp socket文件为例,具体看下ep_item_poll是如何做的。 如果是tcp socket类型的文件,ep_item_poll方法最终会调用tcp_poll方法。...struct sock *sk = sock->sk; const struct tcp_sock *tp = tcp_sk(sk); ......// include/linux/poll.h static inline void poll_wait(struct file * filp, wait_queue_head_t * wait_address...限于篇幅原因,ep_remove和ep_modify方法我们会在下一篇文章中分析。
Linux下的tcp编程中,第一步就是要创建socket,本文将从源码角度看下socket是如何被创建的。...-45.48 有关如何找到当前运行的Ubuntu版本对应的内核源码,请参考 找到运行的Ubuntu版本对应的内核源码。...在看具体的源码分析之前,最好先看下socket的man文档,这样能对socket api有个大概的了解。...// include/linux/fs.h struct file_operations { ......有关epoll的源码分析,请参见 Linux epoll 源码分析 1 Linux epoll 源码分析 2 Linux epoll 源码分析 3 5.
本文将从源码角度分析epoll的实现机制,使用的内核版本为 ➜ bionic git:(ffdd392b8196) git remote -v origin git://git.launchpad.net.../~ubuntu-kernel/ubuntu/+source/linux/+git/bionic (fetch) origin git://git.launchpad.net/~ubuntu-kernel...-4.15.0-45.48 有关如何找到对应的内核源码,请参考 找到运行的Ubuntu版本对应的内核源码。...对于tcp socket对象,这个方法最终会调用 tcp_poll 方法,由于该方法涉及的都是tcp相关的内容,我们以后会另起文章再讲。 2....至此,epoll_wait 方法也分析完毕。 有关 epoll_ctl 方法及其他epoll内容,我们会在另起文章再来分析。
Linux内核源码分析方法 一、内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次。...我也是通过一个项目接触了Linux内核源码的分析,从源码的分析工作中,我受益颇多。除了获取相关的内核知识外,也改变了我对内核代码的过往认知: 1.内核源码的分析并非“高不可攀”。...内核源码分析的难度不在于源码本身,而在于如何使用更合适的分析代码的方式和手段。...目前的Linux源码会把模块相关的文档说明保存在源码目录的documention的文件夹下,如果待分析的模块没有文档说明,这多少会增加定位关键源码文件的难度,但是不会导致我们找不到我们要分析的源码。...源码定位也比较关键,找到一部分源码文件是分析源码的基础。 第三步:简单注释 在已定位好的源码文件中,分析每个变量、宏、函数、结构体等代码元素的大致含义和功能。
unix_proto_getname, unix_proto_read, unix_proto_write, unix_proto_select, unix_proto_ioctl }; 二、建立连接源码分析...buf = NULL; upd->bp_head = upd->bp_tail = 0; } } --upd->refcnt; } 三、读发送接收源码分析
之前的文章已经分析了tcp的建立过程以及tcp读和写,下面我们继续看下shutdown方法。...由第一篇文章可以知道,sk->sk_prot->shutdown指向的方法为tcp_shutdown。...// net/ipv4/tcp.c void tcp_shutdown(struct sock *sk, int how) { ... if (!...FIN if needed. */ if (tcp_close_state(sk)) tcp_send_fin(sk); } } EXPORT_SYMBOL(tcp_shutdown...调用tcp_close_state方法,根据当前sk->sk_state的状态,设置其下一状态,比如,如果当前状态为TCP_ESTABLISHED,则下一状态应该为TCP_FIN_WAIT1,之后该方法返回是否需要发送
= TCP_LISTEN) { ......sk_state_store(sk, TCP_LISTEN); if (!...tcp建立连接完成之后,对应的sock就会放到这个队列中,之后accept方法再从这个队列中获取。 2. 初始化最大backlog和当前backlog值。 3....设置sock状态为TCP_LISTEN。 4. 调用sk->sk_prot->get_port(sk, inet->inet_num)方法做 listening transition 验证。...= TCP_CLOSE) { ...
上面的文章已经分析了tcp建立的整个过程,下面我们来看下write是如何实现tcp写的。...// include/linux/fs.h static inline ssize_t call_write_iter(struct file *file, struct kiocb *kio,...// net/ipv4/tcp.c int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size) { ......return ret; } EXPORT_SYMBOL(tcp_sendmsg); 该方法又调用了tcp_sendmsg_locked方法。...tcp_sock *tp = tcp_sk(sk); ...
领取专属 10元无门槛券
手把手带您无忧上云