首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux源码看Socket(TCP)的accept

今天笔者就从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内核源码博大精深,每次扎进去探索时候都会废寝忘食,其间可以看到各种优雅的设计,在此分享出来,希望对读者有所帮助。

1.8K00

Linux内核源码规范解析

scripts/Lindent 源码路径下的scripts目录中的工具Lindent可以用来自动修改缩进问题。不过使用Lindent要求系统安装indent这个工具。...Linux内核文档,最权威的文档路径,很全很强大,原来在这个网站上已经有中文版了,感谢万分,具体的更新可以跳转到你懂的网址。...「来自 Documentation/process/coding-style.rst 的中文翻译」 Linux 内核代码风格 这是一个简短的文档,描述了 linux 内核的首选代码风格。...虽然 C 语言里没有这样的要求,在 Linux 里这是提倡的做法,因为这样可以很简单的给读者提供更多的有价值的信息。...10 Kconfig 配置文件 对于遍布源码树的所有 Kconfig* 配置文件来说,它们缩进方式有所不同。

2.8K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    linux源码看socket(tcp)的timeout

    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

    4.6K20

    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){...其源码可见笔者的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

    2K20

    Linux源码看Socket(TCP)Client端的Connect

    今天笔者就来从Linux源码的角度看下Client端的Socket在进行Connect的时候到底做了哪些事情。由于篇幅原因,关于Server端的Accept源码讲解留给下一篇博客。...(基于Linux 3.10内核) 一个最简单的Connect例子 int clientSocket; if((clientSocket = socket(AF_INET, SOCK_STREAM, 0)...int connect(int sockfd,const struct sockaddr *serv_addr,socklen_t addrlen) 这个系统调用有三个参数,那么依据规则,它肯定在内核中的源码长下面这个样子...60 seconds */ Linux自然也考虑到了这种情况,所以提供了一个tcp_tw_reuse参数使得在搜索端口号时可以在某些情况下重用TIME_WAIT。...重传的超时时间和 /proc/sys/net/ipv4/tcp_syn_retries 息息相关,Linux默认设置为5,建议设置成3,下面是不同设置的超时时间参照图。

    71220

    Linux源码看Socket(TCP)Client端的Connect

    今天笔者就来从Linux源码的角度看下Client端的Socket在进行Connect的时候到底做了哪些事情。...int connect(int sockfd,const struct sockaddr *serv_addr,socklen_t addrlen) 这个系统调用有三个参数,那么依据规则,它肯定在内核中的源码长下面这个样子...60 seconds */ Linux自然也考虑到了这种情况,所以提供了一个tcp_tw_reuse参数使得在搜索端口号时可以在某些情况下重用TIME_WAIT。...重传的超时时间和 /proc/sys/net/ipv4/tcp_syn_retries 息息相关,Linux默认设置为5,建议设置成3,下面是不同设置的超时时间参照图。 ?...,任何一个环节有问题就会导致创建连接失败,笔者详细的描述了这些机制的源码实现。

    1.5K41

    TCP协议的解析

    TCP报文段结构 TCP和UDP报文一样的是,首部都包含了源端口号和目的端口号以及校验和字段。一般而言TCP的首部是20字节(通常,这个Options是空的)。TCP的首部长度是可变的。...head len是指示以4字节为单位的TCP的长度。 TCP是在可靠数据传输原理上建立的,它采用的依然是超时重传。超时重传的最大问题是应该把它设置为多少?我们知道它肯定得大于往返时间(RTT)。...发送方 TCP的发送方从上层接收到数据,生产具有序列号的TCP报文段,启动定时器。如果超出等待时间,那么重传具有最小序号的未确认报文段,并且重启定时器。如果收到ACK。...快速重传 在实际实现TCP协议的时候,TCP每次重传时都会将下一次的超时时间间隔设置为先前的两倍,而不是在使用公式计算出来的时间。...这就是TCP的快速重传。 3次ACK就重传是根据丢包概率以及性能得出的。并不是说3次就一定是丢包了。 接收方 ?

    87610

    linux内核进程创建fork源码解析

    平时写过多进程多线程程序,比如使用linux的系统调用fork创建子进程和glibc中的nptl包里的pthread_create创建线程,甚至在java里使用Thread类创建线程等,虽然使用问题不大...这次在自己写操作系统的时候,看了一遍linux内核的进程创建过程。算是有了比较深入的理解。     进程概念:进程是对正在运行程序的一个抽象。...在linux下线程属于轻量级进程,拥有完全一样的数据结构,是系统调度的最小单位。并且线程和cpu是1:1模型,也就是说当前cpu在一个时间片周期内只运行一个线程,这样可以充分利用硬件。    ...下面看重要的函数dup_mmap复制vma和页表,先介绍下linux的页表结构,linux支持四级页表,但是有的cpu mmu只支持两级页表或者三级页表,比如x86_32如果不开启PAE则只支持2级页表...,开启PAE支持3级页表,x86_64支持四级页表,所以为了适应不同硬件,linux写了一个很巧妙的代码,在只支持二级页表的cpu中,pud和pmd的结果都是pgd,看以下代码 //在支持二级或三级页表的

    8.7K22

    TCP keepalive特性解析

    在早期的TCP实现中,如果连接处于空闲状态,TCP协议不会发送任何数据包,这可能会导致网络中的路由器或防火墙关闭连接。...二 linux内核设置keepalive 操作系统设置tcp协议keep alive参数主要为以下三个文件: $ ll /proc/sys/net/ipv4/tcp_keepalive* -rw-r--...第二次成功实验 这次我们希望模拟网络不通的情况,思路是,用自己的linux客户端程序访问我自己mac电脑上的服务端程序,建立连接后,关闭mac的WiFi,完整的抓包结果如下: 可以看到: 客户端服务端先进行了三次握手后...然后,我们讨论了TCP keepalive的配置和调整,包括操作系统默认的TCP keepalive属性和套接字的TCP keepalive属性。...最后,我们编写了一个TCP客户端和服务端,并使用抓包工具来查看TCP keepalive包的状态,以帮助我们更好地理解TCP keepalive机制的工作原理。

    54310

    Linux源码看Socket(TCP)的listen及连接队列

    今天笔者就来从Linux源码的角度看下Server端的Socket在进行listen的时候到底做了哪些事情(基于Linux 3.10内核),当然由于listen的backlog参数和半连接hash表以及全连接队列都相关...接下来,我们就进入Linux内核源码栈吧 listen |->INLINE_SYSCALL(listen......)...tcp的连接队列有两个,一个是sync_queue,另一个accept_queue。但笔者仔细阅读了一下源码,其实并非如此。事实上,sync_queue其实是个hash表(syn_table)。...if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1) { NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENOVERFLOWS...而笔者也正是写这篇博客而详细阅读源码的时候偶然间灵光一闪,找到了最近一个诡异问题的根因。这个诡异问题的分析过程将会在近期写出来分享给大家。

    1.8K20

    Linux源码看Socket(TCP)的accept从Linux源码看Socket(TCP)的accept一个最简单的Server端例子总结

    Linux源码看Socket(TCP)的accept 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情。...今天笔者就从Linux源码的角度看下Server端的Socket在进行Accept的时候到底做了哪些事情(基于Linux 3.10内核)。...接下来,我们就进入Linux内核源码栈吧 accept |->SYSCALL_CANCEL(accept......) .........,可以见笔者另一篇博客的详细分析 《从Linux源码看Socket(TCP)的listen及连接队列》: https://my.oschina.net/alchemystar/blog/4672630...总结 Linux内核源码博大精深,每次扎进去探索时候都会废寝忘食,其间可以看到各种优雅的设计,在此分享出来,希望对读者有所帮助。

    1.9K41

    Linux网络编程TCP

    TCP/IP协议 TCP/IP 协议栈是一系列网络协议(protocol)的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入因特网,以及数据如何在它们之间进行传输。...OSI 7层模型和TCP/IP四层网络模型对应关系 计算机网路基础的知识不过多讲解,主要是让大家明白接下来的Linux网络编程数据流属于那一层,具体如下图 TCP/IP协议数据流示意图 我们接下来讲解的...Linux网络编程Tcp协议是属于传输层的协议 Linux Socket 网络编程 TCP协议 TCP是面向连接的可靠的传输层协议。...TCP编程 Linux中的网络编程是通过socket接口来进行的。socket是一种特殊的I/O接口,它也是一种文件描述符。常用于不同机器上的进程之间的通信,当然也可以实现本地机器上的进程之间通信。...使用TCP协议的流程图 根据流程图逐一讲解API接口.

    5.4K30
    领券