此前的文章中,我们介绍了 tcp 协议的基本概念和连接的建立与终止 最后,我们介绍了“经受时延的确认”,这是一种将 ACK 包与下一条数据包合并发送的策略,这样可以尽量减少发往网络的报文,以提高传输的效率,节省网络资源。 除此之外,TCP 还有很多其他算法和策略用来优化网络的使用。
有时候我们要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要控制套接字的选项了. 以下资料均从网上收集得到 getsockopt 和 setsockopt 获得套接口选项:
在Linux上做网络应用的性能优化时,一般都会对TCP相关的内核参数进行调节,特别是和缓冲、队列有关的参数。网上搜到的文章会告诉你需要修改哪些参数,但我们经常是知其然而不知其所以然,每次照抄过来后,可能很快就忘记或混淆了它们的含义。本文尝试总结TCP队列缓冲相关的内核参数,从协议栈的角度梳理它们,希望可以更容易的理解和记忆。注意,本文内容均来源于参考文档,没有去读相关的内核源码做验证,不能保证内容严谨正确。作为Java程序员没读过内核源码是硬伤。
为了让大家更容易「看得见」 TCP,我搭建不少测试环境,并且数据包抓很多次,花费了不少时间,才抓到比较容易分析的数据包。
今天继续来讲面试,已经出了将近十个美团java一面真题系列文章了,今天来讲一讲Linux命令相关内容,在全球超级计算机TOP500强操作系统排行榜中,Linux的占比最近十几年长期保持在85%以上,且一直呈现快速上升趋势。根据2016年的排行榜,Linux的占比已经高达98.80%。其实在各种大、中小型企业的服务器应用领域,Linux系统的市场份额也越来越接近这个比例,这足以说明Linux的表现是多么出色。所以面试的时候却经常会被问到,我们根据面经来进行补短板,查漏补缺。下面开始今天的干货内容吧,走起,记得点赞,点击在看哦。
最近花了些时间在学习TCP/IP协议上,首要原因是由于本人长期以来对TCP/IP的认识就只限于三次握手四次分手上,所以希望深入了解一下。再者,TCP/IP和Linux系统层级的很多设计都可以用于中间件系统架构上,比如说TCP 拥塞控制算法也可以用在以响应时间来限流的中间件上。更深一层,像TCP/IP协议这种基础知识和原理性的技术,都是经过长时间的考验的,都是前人智慧的结晶,可以给大家很多启示和帮助。
最近花了些时间在学习TCP/IP协议上,首要原因是由于本人长期以来对TCP/IP的认识就只限于三次握手四次分手上,所以希望深入了解一下。再者,TCP/IP和Linux系统层级的很多设计都可以用于中间件系统架构上,比如说TCP 拥塞控制算法也可以用于以响应时间来限流的中间件。更深一层,像TCP/IP协议这种基础知识和原理性的技术,都是经过长时间的考验的,都是前人智慧的结晶,可以给大家很多启示和帮助。
之前文章《Linux服务器性能评估与优化(一)》太长,阅读不方便,因此拆分成系列博文:
int setsockopt( SOCKET s, int level, int optname, const char* optval, int optlen );
大多数Linux 发布版都定义了适当的缓冲区和其他 Transmission Control Protocol(TCP)参数。可以修改这些参数来分配更多的内存,从而改进网络性能。设置内核参数的方法是通过 proc 接口,也就是通过读写 /proc 中的值。幸运的是,sysctl 可以读取 /etc/sysctl.conf 中的值并根据需要填充/proc,这样就能够更轻松地管理这些参数。清单2 展示在互联网服务器上应用于 Internet 服务器的一些比较激进的网络设置。
这些年,接触了形形色色的项目,写了不少网络编程的代码,从windows到linux,跌进了不少坑,由于网络编程涉及很多细节和技巧,一直想写篇文章来总结下这方面的心得与经验,希望对来者有一点帮助,那就善莫大焉了。 本文涉及的平台包括windows和linux,下面开始啦。 一、非阻塞的的connect()函数如何编写 我们知道用connect()函数默认是阻塞的,直到三次握手建立之后,或者实在连不上超时返回,期间程序执行流一直阻塞在那里。那么如何利用connect()函数编写非阻塞的连接代码呢? 无论在win
这些年,接触了形形色色的项目,写了不少网络编程的代码,从windows到linux,跌进了不少坑,由于网络编程涉及很多细节和技巧,一直想写篇文章来总结下这方面的心得与经验,希望对来者有一点帮助,那就善莫大焉了。 本文涉及的平台包括windows和linux,下面开始啦。 一、非阻塞的connect()函数如何编写 我们知道用connect()函数默认是阻塞的,直到三次握手建立之后,或者实在连不上超时返回,期间程序执行流一直阻塞在那里。那么如何利用connect()函数编写非阻塞的连接代码呢? 无论在wind
前几天,我厂剑英和晓培同学在定位一个TCP通信失败问题时,发现原因是客户端发送的TCP数据过长(1460字节),导致数据包无法成功发送到服务端。但通过抓包发现,在三次握手时,双方协商的MSS就是1460。那么,应该是在这个连接的传输过程中,数据包的传输路径发生了变化,走了不同的中间设备,从而导致协商时的MSS大小已经超过了实际的传输路径限制。因为客户端已经发布,我们通过修改服务端的对外接口的MTU,暂时解决了这样的问题。
很简单呀,因为我做了实验和看了 TCP 协议栈的内核源码,发现要增大这两个队列长度,不是简简单单增大某一个参数就可以的。
net.core.netdev_max_backlog = 400000 #该参数决定了,网络设备接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。 net.core.optmem_max = 10000000 #该参数指定了每个套接字所允许的最大缓冲区的大小 net.core.rmem_default = 10000000 #指定了接收套接字缓冲区大小的缺省值(以字节为单位)。 net.core.rmem_max = 10000000 #指定了接收套接字缓冲区大小的最大值(以字节为单位)。 net.core.somaxconn = 100000 #Linux kernel参数,表示socket监听的backlog(监听队列)上限 net.core.wmem_default = 11059200 #定义默认的发送窗口大小;对于更大的 BDP 来说,这个大小也应该更大。 net.core.wmem_max = 11059200 #定义发送窗口的最大大小;对于更大的 BDP 来说,这个大小也应该更大。 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 #严谨模式 1 (推荐) #松散模式 0 net.ipv4.tcp_congestion_control = bic #默认推荐设置是 htcp net.ipv4.tcp_window_scaling = 0 #关闭tcp_window_scaling #启用 RFC 1323 定义的 window scaling;要支持超过 64KB 的窗口,必须启用该值。 net.ipv4.tcp_ecn = 0 #把TCP的直接拥塞通告(tcp_ecn)关掉 net.ipv4.tcp_sack = 1 #关闭tcp_sack #启用有选择的应答(Selective Acknowledgment), #这可以通过有选择地应答乱序接收到的报文来提高性能(这样可以让发送者只发送丢失的报文段); #(对于广域网通信来说)这个选项应该启用,但是这会增加对 CPU 的占用。 net.ipv4.tcp_max_tw_buckets = 10000 #表示系统同时保持TIME_WAIT套接字的最大数量 net.ipv4.tcp_max_syn_backlog = 8192 #表示SYN队列长度,默认1024,改成8192,可以容纳更多等待连接的网络连接数。 net.ipv4.tcp_syncookies = 1 #表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭; net.ipv4.tcp_timestamps = 1 #开启TCP时间戳 #以一种比重发超时更精确的方法(请参阅 RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项。 net.ipv4.tcp_tw_reuse = 1 #表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭; net.ipv4.tcp_tw_recycle = 1 #表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。 net.ipv4.tcp_fin_timeout = 10 #表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。 net.ipv4.tcp_keepalive_time = 1800 #表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为30分钟。 net.ipv4.tcp_keepalive_probes = 3 #如果对方不予应答,探测包的发送次数 net.ipv4.tcp_keepalive_intvl = 15 #keepalive探测包的发送间隔 net.ipv4.tcp_mem #确定 TCP 栈应该如何反映内存使用;每个值的单位都是内存页(通常是 4KB)。 #第一个值是内存使用的下限。 #第二个值是内存压力模式开始对缓冲区使用应用压力的上限。 #第三个值是内存上限。在这个层次上可以将报文丢弃,从而减少对内存的使用。对于较大的 BDP 可以增大这些值(但是要记住,其单位是内存页,而不是字节)。 net.ipv4.tcp_rmem #与 tcp_wmem 类似,不过它表示的是为自动调优所使用的接收缓冲区的值。 net.ipv4.tcp_wmem = 30000000 30000000 30000000 #为自动调优定义每个 socket 使用的内存。 #第一个值是为 socket 的发送缓冲区分配的最少字节数。 #第二个值是默认值(该
相关参数仅供参考,具体数值还需要根据机器性能,应用场景等实际情况来做更细微调整。
近日,安全研究人员发现了一个新漏洞,使潜在的攻击者可以劫持受影响的* NIX设备上的VPN连接,并将任意数据有效载荷注入IPv4和IPv6 TCP流中。
上周Linux内核修复了4个CVE漏洞[1],其中的CVE-2019-11477感觉是一个很厉害的Dos漏洞,不过因为有其他事打断,所以进展的速度比较慢,这期间网上已经有相关的分析文章了。[2][3]
服务器收到客户端SYN数据包后,Linux内核会把该连接存储到半连接队列中,并响应SYN+ACK报文给客户端。
作者:Hcamael@知道创宇 404 实验室 时间:2019 年 6 月 26 日 英文版本:https://paper.seebug.org/967/
根据用户提供的文章内容进行摘要总结
TCP 性能的提升不仅考察 TCP 的理论知识,还考察了对于操作系统提供的内核参数的理解与应用。
很多人常常对TCP优化有一种雾里看花的感觉,实际上只要理解了TCP的运行方式就能掀开它的神秘面纱。Ilya Grigorik 在「High Performance Browser Networking」中做了很多细致的描述,让人读起来醍醐灌顶,我大概总结了一下,以期更加通俗易懂。 流量控制 传输数据的时候,如果发送方传输的数据量超过了接收方的处理能力,那么接收方会出现丢包。为了避免出现此类问题,流量控制要求数据传输双方在每次交互时声明各自的接收窗口「rwnd」大小,用来表示自己最大能保存多少数据,这主要是针
很多人常常对TCP优化有一种雾里看花的感觉,实际上只要理解了TCP的运行方式就能掀开它的神秘面纱。Ilya Grigorik 在「High Performance Browser Networking」中做了很多细致的描述,让人读起来醍醐灌顶,我大概总结了一下,以期更加通俗易懂。
前两天看到一群里在讨论 Tomcat 参数调优,看到不止一个人说通过 accept-count 来配置线程池大小,我笑了笑,看来其实很多人并不太了解我们用的最多的 WebServer Tomcat,这篇文章就来聊下 Tomcat 调优,重点介绍下线程池调优及 TCP 半连接、全连接队列调优。
由于默认的Linux内核参数考虑的是最通用场景,这明显不符合用于支持高并发访问的Web服务器的定义,所以需要修改Linux内核参数,是的Nginx可以拥有更高的性能;
一、前言 1) Linux Proc文件系统,通过对Proc文件系统进行调整,达到性能优化的目的。 2) Linux性能诊断工具,介绍如何使用Linux自带的诊断工具进行性能诊断。 加粗斜体表示可以直接运行的命令。 下划线表示文件的内容。 二、/proc/sys/kernel/优化 1) /proc/sys/kernel/ctrl-alt-del 该文件有一个二进制值,该值控制系统在接收到ctrl+alt+delete按键组合时如何反应。这两个值分别是: 零(0)值,表示捕获ctrl+alt+delete,并将其送至 init 程序;这将允许系统可以安全地关闭和重启,就好象输入shutdown命令一样。 壹(1)值,表示不捕获ctrl+alt+delete,将执行非正常的关闭,就好象直接关闭电源一样。
以上是测试压力机与服务器之前的网络带宽简单方法,大家做性能测试是否也是这样确定网络带宽大小。
主动断开连接 主动断开连接会发送,关闭事件 connec函数检测连接状态,getlasterror send发送(tcp keeplive心跳包或者有数据时检测),recv接收判断异常(无数据判断异常) linux中的 select(socket用户和内核传递数组,大小有限制) poll(同select大小无限制,链表维护) epoll(内核态数据) 拔网线 拔网线后,关闭事件不能传递,连接状态不好检测 设置连接或者发送超时,同步套接字超时设置 // platform-specific switch #i
服务器运维人员在日常运维服务器的过程中经常会遇到服务器网络故障,有服务器硬件造成的,也有服务商网络问题造成的,也有区域网络问题造成的,这个时候就需要用到ping,traceroute,mtr这三个命令
Linux内核是高并发服务的关键组件之一。以下是一些可用于优化Linux内核的配置。
前言 记得第一次接触/etc/security/limits.conf和/etc/sysctl.conf时 是因为部署Oracle时要按需修改内核参数。limits.conf文件实际是Linux PA
对于 Mac OS X: Mac OS 10.14 Mojave 及更高版本,32 和 64 位 Intel CPU
而且,这个超时时间在不同的网络的情况下,根本没有办法设置一个死的值。只能动态地设置。 为了动态地设置,TCP引入了RTT——Round Trip Time,也就是一个数据包从发出去到回来的时间。这样发送端就大约知道需要多少的时间,从而可以方便地设置Timeout——RTO(Retransmission TimeOut),以让我们的重传机制更高效。 听起来似乎很简单,好像就是在发送端发包时记下t0,然后接收端再把这个ack回来时再记一个t1,于是RTT = t1 – t0。没那么简单,这只是一个采样,不能代表普遍情况。
从上面的解释来看,就是定义了一个队列,并设置了队列长度,那么这个队列是做什么的,接着往下看
对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》
mergecap为wireshark下的配套命令,是wireshark安装时附带的可选工具之一,mergecap用于合并多个包文件。
图片下载走的 k8s ingress,这个 ingress 路径对应后端 service 是一个代理静态图片文件的 nginx deployment,这个 deployment 只有一个副本,静态文件存储在 nfs 上,nginx 通过挂载 nfs 来读取静态文件来提供图片下载服务,所以调用链是:client --> k8s ingress --> nginx --> nfs。
信息安全课程——窃取密码 一、 一、 安装ubantu16-64 Desktop版本 通过XShell连接虚拟机。 sudo apt install openssh-server sudo apt-get install vim #安装vim,使用上下左右键 sudo apt-get install gcc-multilib 代码如下: //getpass.c #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <
注:ngrep可以用于网络流量的抓取和过滤,类似于grep命令对文件的过滤,ngrep对网络流量进行过滤和匹配。
在开发 socket 应用程序时,首要任务通常是确保可靠性并满足一些特定的需求。利用本文中给出的 4 个提示,您就可以从头开始为实现最佳性能来设计并开发 socket 程序。本文内容包括对于 Sockets API 的使用、两个可以提高性能的 socket 选项以及 GNU/Linux 优化。
作者:engleliu,腾讯 PCG 开发工程师 本文主要介绍 TCP 拥塞控制算法,内容多来自网上各个大佬的博客及《TCP/IP 详解》一书,在此基础上进行梳理总结,与大家分享。因水平有限,内容多有不足之处, 敬请谅解。 一、TCP 首部格式 在了解 TCP 的拥塞控制之前,先来看看 TCP 的首部格式和一些基本概念。 TCP 头部标准长度是 20 字节。包含源端口、目的端口、序列号、确认号、数据偏移、保留位、控制位、窗口大小、校验和、紧急指针、选项等。 TCP 首部格式 1.1 数据偏移(D
TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面。所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获。关于TCP这个协议的细节,我还是推荐你去看W.Richard Stevens的《TCP/IP 详解 卷1:协议》(当然,你也可以去读一下RFC793以及后面N多的RFC)。另外,本文我会使用英文术语,这样方便你通过这些英文关键词来查找相关的技术文档。 之所以想写这篇文章,目的有三个, 一个是想锻炼一下自己是否可以用简单的篇幅把这么复杂的TCP协议描清
Tips : OOM(Out Of Memory) killer机制是指Linux操作系统发现可用内存不足时,强制杀死一些用户进程(非内核进程),来保证系统有足够的可用内存进行分配。 Tips : swappiness参数在Linux 3.5版本前后的表现并不完全相同,Redis运维人员在设置这个值需要关注当前操作系统的内核版本。
前些日子,在分享网络编程知识文章的时候,有个网友私信给我留言了一条“能不能写一篇关于 TCP 滑动窗口原理的文章”。
本文主要分析 TCP 协议的实现,但由于 TCP 协议比较复杂,所以分几篇文章进行分析,这篇主要介绍 TCP 协议建立连接时的三次握手过程。
领取专属 10元无门槛券
手把手带您无忧上云