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接口.
引言 TCP协议是传输层中非常重要的协议。本篇博客我们将从TCP头部信息、TCP状态转移、TCP数据流、TCP数据流的控制等等方面来讨论! 在TCP协议中,通信双方的地位是平等的。...1、TCP协议的特点 传输层中我们常用的协议有两个:TCP协议和UDP协议。TCP协议相对于UDP协议的特点是:面向连接、可靠的、面向字节流的。...当TCP模块真正开始发送数据时,发送缓冲区中这些等待发送的数据可能被封装成一个或者多个TCP报文发出去,因此,TCP模块发送出的TCP报文段的个数和应用程序执行的写操作次数没有固定的数量关系。...当接收缓冲区收到一个或者多个TCP报文后,TCP模块将它们携带的应用程序的数据按照TCP报文的序号【见下文】依次放入TCP接收缓冲区中,并通知应用程序读取数据。...Linux中(BSD Unix和Windows也是如此), 超时以500ms为一个单位进行控制, 每次判定超时重发的超时 时间都是500ms的整数倍.
wide': 0 tcp:tcp_retransmit_skb...0 tcp:tcp_send_reset 0 tcp:tcp_receive_reset...5 tcp:tcp_rcv_space_adjust...0 tcp:tcp_retransmit_synack 9 tcp:tcp_probe...] [k] tcp_rcv_state_process + 50.00% 0.00% python [kernel.kallsyms] [k] __tcp_transmit_skb
可以看到握手时会在客户端和服务器之间传递一些TCP头信息,比如ACK标志、SYN标志以及挥手时的FIN标志等。...除了以上这些常见的标志头信息,还有另外一些标志头信息,比如推标志PSH、复位标志RST等。其中复位标志RST的作用就是“复位相应的TCP连接”。...原因在于Socket.close()方法的语义和TCP的“FIN”标志语义不一样:发送TCP的“FIN”标志表示我不再发送数据了,而Socket.close()表示我不在发送也不接受数据了。...然后是客户端和服务器统一使用TCP长连接:客户端使用TCP长连接很容易配置(直接设置HttpClient就好),而服务器配置长连接就比较麻烦了,就拿tomcat来说,需要设置tomcat的maxKeepAliveRequests...使用长连接可以避免每次建立TCP连接的三次握手而节约一定的时间,但是我这边由于是内网,客户端和服务器的3次握手很快,大约只需1ms。
如何在 Linux 上安装 tcpping 测量到远程主机的网络延迟的一种常用方法是使用ping应用程序。该ping工具依赖 ICMP ECHO 请求和回复数据包来测量远程主机的往返延迟。...在这种情况下,你将需要依赖使用 TCP/UDP 数据包的第 3 层测量工具,因为这些第 3 层数据包更有可能绕过常见的防火墙规则。 一种这样的第 3 层测量工具是tcpping....为了测量延迟,tcpping利用所谓的半开放连接技术,基于 TCP 三路握手。也就是说,它通过端口号(默认为 80)向远程主机发送 TCP SYN 数据包。...RepoForge,然后运行: $ sudo yum install tcptraceroute 安装依赖 bc 使用的另一个工具tcpping是GNUbc,它预装在所有主要的 Linux 发行版上...在Debian 的 Linux 上安装: $ sudo apt-get install bc 在 Red Hat 的 Linux 上安装: $ sudo yum install bc 安装 tcpping
在Linux上做网络应用的性能优化时,一般都会对TCP相关的内核参数进行调节,特别是和缓冲、队列有关的参数。...网卡Bonding模式 当主机有1个以上的网卡时,Linux会将多个网卡绑定为一个虚拟的bonded网络接口,对TCP/IP而言只存在一个bonded网卡。...Adaptive load balancing 详细的说明参考内核文档Linux Ethernet Bonding Driver HOWTO。...Linux根据参数net.ipv4.tcp_adv_win_scale计算额外开销的大小: Buffer / 2tcp_adv_win_scale 如果net.ipv4.tcp_adv_win_scale...参考文档 Queueing in the Linux Network Stack TCP Implementation in Linux: A Brief Tutorial Impact of Bandwidth
大家好,又见面了,我是你们的朋友全栈君。 开头 本文从内核的角度看timewait是如何解决的。贴代码,和网上看到的挺多冲突的!...1. timewait是什么 timewait在tcp结束后主动关闭一方的等待时候的行为。图片中的服务和客户端描述不是非常准确,这里客户端是主动关闭一方。...2. timewait在客户端的问题 这里的客户端,不是四次握手的客户端,而是指发起tcp请求的一方。...发起一方需要绑定本地端口,本地端口的绑定方式非常暴力:直接是从配置的偶数值开始遍历查找可用端口:(偶数端口和奇数端口内核的一个patch) 在占用端口中,查看是否可以回收利用:如果可以回收,则返回;如果不能...tcp_send_ack(sk); tcp_time_wait(sk, TCP_TIME_WAIT, 0); break; } struct inet_timewait_sock *inet_twsk_alloc
今天笔者就从Linux源码的角度看下Server端的Socket在进行Accept的时候到底做了哪些事情(基于Linux 3.10内核)。...在这里,我们直接给出TCP Socket所对应的ops也就是操作函数。 accept系统调用 好了,我们直接进入accept系统调用吧。...理解accept的关键点是,它会创建一个新的Socket,这个新的Socket来与对端运行connect()的对等Socket进行连接,如下图所示: 接下来,我们就进入Linux内核源码栈吧 accept...,可以见笔者另一篇博客的详细分析 《从Linux源码看Socket(TCP)的listen及连接队列》: https://www.cnblogs.com/alchemystar/p/13845081.html...总结 Linux内核源码博大精深,每次扎进去探索时候都会废寝忘食,其间可以看到各种优雅的设计,在此分享出来,希望对读者有所帮助。
本文大部分讨论的是socket设置为block的情况,即setNonblock(false),仅在最后提及了nonblock socket(本文基于linux 2.6.32-431内核)。...kernel代码版本细微变化 值得注意的是,linux本身官方发布的2.6.32源码对于tcp_syn_retries2的解释和RFC并不一致(至少笔者阅读的代码如此,这个细微的变化困扰了笔者好久,笔者下载了和机器对应的内核版本后才发现代码改了...以下为代码对比: ========================>linux 内核版本2.6.32-431<======================== #define TCP_TIMEOUT_INIT...在timeout>0时,将socket设置为非阻塞,然后用select系统调用去模拟超时,而没有走linux本身的超时逻辑,如下图所示: 由于没有java并没有设置so_sndtimeo的选项,所以在...java的SocketInputStream的sockRead0超时时间 java的超时时间由SO_TIMOUT决定,而linux的socket并没有这个选项。
今天笔者就来从Linux源码的角度看下Server端的Socket在进行bind的时候到底做了哪些事情(基于Linux 3.10内核)。...在这里,我们直接给出TCP Socket所对应的ops也就是操作函数。...例如32位的ipv4地址或128位的ipv6地址+16位的TCP活UDP端口号。...SO_REUSEPORT SO_REUSEPORT是Linux在3.9版本引入的新功能。...鉴于此,Linux增加了SO_REUSEPORT,而之前bind中判断是否冲突的下面代码也是为这个参数而添加的逻辑: if(!reuseport || !
从linux源码看socket(tcp)的timeout 前言 网络编程中超时时间是一个重要但又容易被忽略的问题,对其的设置需要仔细斟酌。...本文大部分讨论的是socket设置为block的情况,即setNonblock(false),仅在最后提及了nonblock socket(本文基于linux 2.6.32-431内核)。...kernel代码版本细微变化 值得注意的是,linux本身官方发布的2.6.32源码对于tcp_syn_retries2的解释和RFC并不一致(至少笔者阅读的代码如此,这个细微的变化困扰了笔者好久,笔者下载了和机器对应的内核版本后才发现代码改了...在timeout>0时,将socket设置为非阻塞,然后用select系统调用去模拟超时,而没有走linux本身的超时逻辑,如下图所示: ?...java的SocketInputStream的sockRead0超时时间 java的超时时间由SO_TIMOUT决定,而linux的socket并没有这个选项。
示例:点击 -> 性能监控 /proc/net/tcp 第四列 01代表了 TCP_ESTABLISHED 06代表代表time_wait 08代表close_wait [root@wangzi ~]#...cat /proc/net/tcp| awk '{if($4 == '01') print $0}'|wc -l 22 [root@wangzi ~]# netstat -antpl|grep ESTABLISHED...|wc -l 22 [root@wangzi ~]#cat /proc/net/tcp| awk '{if($4 == '01' || $4=='06' || $4=='08') print $4}'...因使用netstat命令有时会占用较多资源,当机器负载较高时,可以用使用上面的命令来查看tcp正在通信的连接数。...(): ret=Popen("""cat /proc/net/tcp| awk '{if($4 == '01' || $4=='06' || $4=='08') print $4}'""",shell
正常TCP TIME_WATI时长为2MSL,用于挥手阶段最后一个ACK报文的重传,以及防止当前连接上滞留的报文影响到下一个连接。...当启用tcp_tw_recycle后,系统会在一个RTO的极短时间内回收处于TIME_WAIT状态的socket,但仍然无法杜绝接收到上一个连接在链路上滞留的报文。...为了防止这种情况的发生,在启用tcp_tw_recycle的情况下,由于已经释放了socket,系统无法使用socket来标记一条连接,只能退而求其次,通过判断对端IP发过来的报文的时间戳来判断该报文是新产生的还是老的报文...因此复现场景为:服务端主动断开与客户端的一条连接,在后续的TCP_PAWS_MSL(60s)时间内,如果客户端发过来的SYN报文的TSVal时间戳小于系统保留的上一个连接的时间戳,则该SYN报文会被丢弃...和tcp_tw_recycle可能会导致客户端连接不上前提条件是server主动断开过与客户端的连接(可能是服务重启等原因),导致server处于TIME_WAIT状态的socket被快速回收,如果在TCP_PAWS_MSL
netstat -nat|grep -i "80"|wc -l 查看80的 统计httpd协议的连接数 ps -ef |grep httpd|wc -l 统计状态为ESTABLISHED的连接数 netstat
Linux作为一个强大的操作系统,提供了一系列内核参数供我们进行调优。光TCP的调优参数就有50多个。在和线上问题斗智斗勇的过程中,笔者积累了一些在内网环境应该进行调优的参数。...即在tcp_timestamps开启(Linux默认开启),tcp_tw_recycle会经常导致下面这种现象。 ?...但在某个版本之后Linux内核仅仅用这个tcp_retries2来计算超时时间,在这段时间的重传次数纯粹由RTO等环境因素决定,重传超时时间在5/15下的表现为: tcp_retries2 对端无响应...tcp_slow_start_after_idle 还有一个可能需要调整的参数是tcp_slow_start_after_idle,Linux默认是1,即开启状态。...Linux 新版本 /* TCP initial congestion window */ #define TCP_INIT_CWND 10 总结 Linux提供了一大堆内参参数供我们进行调优,其默认设置的参数在很多情况下并不是最佳实践
那么可以这么理解,当client进入time_wait的等待时间是2个MSL 让我们看一下一台linux服务器的网络状态: # netstat -an | awk '/^tcp/ {++State[$NF...略显偏高, 也就是说大量的关闭操作在等待2个MSL后结束,正常我们的tcp 端口是65535个,如果并发再高一些,可能会大量的socket不能及时被释放,从而导致性能下降,所以我们可以通过linux内核进行一些网络调整比如...允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭; net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收...连接过多的问题,可以通过激活tcp_tw_reuse来缓解。...net.ipv4.tcp_keepalive_time = 1200 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
Linux作为一个强大的操作系统,提供了一系列内核参数供我们进行调优。光TCP的调优参数就有50多个。在和线上问题斗智斗勇的过程中,笔者积累了一些在内网环境应该进行调优的参数。...即在tcp_timestamps开启(Linux默认开启),tcp_tw_recycle会经常导致下面这种现象。...但在某个版本之后Linux内核仅仅用这个tcp_retries2来计算超时时间,在这段时间的重传次数纯粹由RTO等环境因素决定,重传超时时间在5/15下的表现为: tcp_retries2 对端无响应...tcp_slow_start_after_idle 还有一个可能需要调整的参数是tcp_slow_start_after_idle,Linux默认是1,即开启状态。...echo 0 > /proc/sys/net/ipv4/tcp_slow_start_after_idle 当然了,Linux启用这个参数也是有理由的,如果我们的网络情况是时刻在变化的,例如拿个手机到处移动
文章目录 功能 语法 示例 lsof -i 显示 tcp,udp 的端口和进程等相关 查看服务器 80 端口的占用情况 使用 -p 查看指定进程打开的文件 更多命令 功能 lsof(list open...语法 语法格式:lsof -i:端口号 ---- 示例 lsof -i 显示 tcp,udp 的端口和进程等相关 [root@VM-24-3-centos ~]# lsof -i |more COMMAND...111507996 0t0 TCP *:http (LISTEN) [root@VM-24-3-centos ~]# COMMAND:进程的名称 PID进程标识符 USER:进程所有者 FD...:80 查看TCP协议80端口占用情况 lsof -c lsof 查看lsof命令使用的所有文件 lsof -p 1234:列出进程号为1234的进程所打开的文件 lsof -g gid:显示归属gid...的进程情况 lsof +d /usr/local/:显示目录下被进程开启的文件 lsof +D /usr/local/:同上,但是会搜索目录下的目录,时间较长 lsof -d 4:显示使用fd为4的进程
分析认为SESU10母盘上内核TCP拥塞控制算法和Windows的Ack频率控制的策略存在不兼容情况。...这里是一个典型的下载速度曲线: 我们的服务器的曲线:(纵轴单位:包/s) 百度的服务器下载的曲线: 重现该问题的测试环境: 网络: 公司体验网,普通联通4M ADSL 服务器:Linux64位服务器...Linux这一端,首先怀疑和nagle算法有关系,在nws服务器上设置TCP_NODELAY以后仍然可以重现,可以排除Nagle算法的影响。...因为每次linux仅发送一个数据包,因此怀疑拥塞窗口的问题,推测问题如下: 初始情况下,客户端回复一个ACK时,拥塞窗口增大,每次发送多个数据包,因此刚开始可以有较快的传输速度;因为网络延时抖动或丢包导致服务器协议栈判定数据包超时...通过测试增大初始拥塞窗口为10 (更换内核加载架平新技术组的TCP优化模块实现),下载速度恢复正常。
领取专属 10元无门槛券
手把手带您无忧上云