首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏陶辉笔记

    高性能网络编程7tcp连接的内存使用

    当服务器的并发TCP连接数以十万计时,我们就会对一个TCP连接在操作系统内核上消耗的内存多少感兴趣。 TCP连接在进程中使用的内存大小千变万化,通常程序较复杂时可能不是直接基于socket编程,这时平台级的组件可能就封装了TCP连接使用到的用户态内存。不同的平台、组件、中间件、网络库都大不相同。 而内核态为TCP连接分配内存的算法则是基本不变的,这篇文章将试图说明TCP连接在内核态中会使用多少内存,操作系统使用怎样的策略来平衡宏观的吞吐量与微观的某个连接传输速度。 我们希望的场景是,在并发连接比较少时,把缓存限制放大一些,让每一个TCP连接开足马力工作;当并发连接很多时,此时系统内存资源不足,那么就把缓存限制缩小一些,使每一个TCP连接的缓存尽量的小一些,以容纳更多的连接 在压力模式下,连接缓存上限可能会减少。在非压力模式下,连接缓存上限可能会增加,最多增加到tcp_rmem[2]或者tcp_wmem[2]。

    1.4K41发布于 2019-06-21
  • 来自专栏Laikee Tech Space

    golang socket连接复用 - smux

    今天来介绍一个socket连接复用的包 https://github.com/xtaci/smux 如图所示,多个channel输入通过smux合并在一个连接中,后端服务将连接中的channel分离出来进行处理 如果不做多路复用的话,apiservice和randservice之间的连接数就是客户端请求数,这样apiservice和randservice之间连接过多会导致性能问题。 -----------> | +-----------+ +-------------+ +---------------+ 经过多路复用后 */ var randClient *smux.Session func init() { //连接后端随机数服务 conn, err := net.Dial("tcp", ":9000 ) //连接后端随机数服务 conn, err := net.Dial("tcp", ":9000") if err !

    2K20编辑于 2022-04-25
  • 来自专栏Golang语言社区

    高性能网络编程7--tcp连接的内存使用

    当服务器的并发TCP连接数以十万计时,我们就会对一个TCP连接在操作系统内核上消耗的内存多少感兴趣。 TCP连接在进程中使用的内存大小千变万化,通常程序较复杂时可能不是直接基于socket编程,这时平台级的组件可能就封装了TCP连接使用到的用户态内存。不同的平台、组件、中间件、网络库都大不相同。 而内核态为TCP连接分配内存的算法则是基本不变的,这篇文章将试图说明TCP连接在内核态中会使用多少内存,操作系统使用怎样的策略来平衡宏观的吞吐量与微观的某个连接传输速度。 我们希望的场景是,在并发连接比较少时,把缓存限制放大一些,让每一个TCP连接开足马力工作;当并发连接很多时,此时系统内存资源不足,那么就把缓存限制缩小一些,使每一个TCP连接的缓存尽量的小一些,以容纳更多的连接 在压力模式下,连接缓存上限可能会减少。在非压力模式下,连接缓存上限可能会增加,最多增加到tcp_rmem[2]或者tcp_wmem[2]。

    2.3K91发布于 2018-03-23
  • 来自专栏用户2442861的专栏

    高性能网络编程7--tcp连接的内存使用

    当服务器的并发TCP连接数以十万计时,我们就会对一个TCP连接在操作系统内核上消耗的内存多少感兴趣。 TCP连接在进程中使用的内存大小千变万化,通常程序较复杂时可能不是直接基于socket编程,这时平台级的组件可能就封装了TCP连接使用到的用户态内存。不同的平台、组件、中间件、网络库都大不相同。 而内核态为TCP连接分配内存的算法则是基本不变的,这篇文章将试图说明TCP连接在内核态中会使用多少内存,操作系统使用怎样的策略来平衡宏观的吞吐量与微观的某个连接传输速度。 我们希望的场景是,在并发连接比较少时,把缓存限制放大一些,让每一个TCP连接开足马力工作;当并发连接很多时,此时系统内存资源不足,那么就把缓存限制缩小一些,使每一个TCP连接的缓存尽量的小一些,以容纳更多的连接 在压力模式下,连接缓存上限可能会减少。在非压力模式下,连接缓存上限可能会增加,最多增加到tcp_rmem[2]或者tcp_wmem[2]。

    85810发布于 2018-09-20
  • 来自专栏Golang语言社区

    高性能网络编程7--tcp连接的内存使用

    当服务器的并发TCP连接数以十万计时,我们就会对一个TCP连接在操作系统内核上消耗的内存多少感兴趣。 TCP连接在进程中使用的内存大小千变万化,通常程序较复杂时可能不是直接基于socket编程,这时平台级的组件可能就封装了TCP连接使用到的用户态内存。不同的平台、组件、中间件、网络库都大不相同。 而内核态为TCP连接分配内存的算法则是基本不变的,这篇文章将试图说明TCP连接在内核态中会使用多少内存,操作系统使用怎样的策略来平衡宏观的吞吐量与微观的某个连接传输速度。 我们希望的场景是,在并发连接比较少时,把缓存限制放大一些,让每一个TCP连接开足马力工作;当并发连接很多时,此时系统内存资源不足,那么就把缓存限制缩小一些,使每一个TCP连接的缓存尽量的小一些,以容纳更多的连接 在压力模式下,连接缓存上限可能会减少。在非压力模式下,连接缓存上限可能会增加,最多增加到tcp_rmem[2]或者tcp_wmem[2]。

    1.6K60发布于 2018-03-23
  • 来自专栏阿伟的个人博客

    Tcp连接建立与连接释放

    Tcp连接建立 ? 上图为Tcp连接建立过程: 1)客户端给服务器发送了一条将其SYN标志位置1的请求连接建立报文,然后其状态由closed转变为SYN-SENT(同步已发送)。 3)客户端收到该报文后,给服务器发送一条将ACK置为1的确认报文,之后就进入established状态(已建立连接)。 accept(); Tcp连接释放 ? 连接释放过程如上图所示. 1)客户端对服务器发送连接释放报文段将其FIN标志位置1,并由之前的established状态转化为finwait-1(终止等待1)状态。此时其已经不能再发送了,只能接收。 2)为了防止已失效的连接请求报文出现在本连接中。

    4.6K40发布于 2020-08-25
  • 来自专栏技术分享

    面向数据连接:TCP

    面向连接的传输: TCP TCP:概述 提供的是点对点的服务: 一个发送方,一个接收方 可靠的、按顺序的字节流 : 没有报文边界 管道化(流水线): TCP拥塞控制和流量控制设置 窗口大小 发送和接收 TimeOutInterval 超时: 重传后沿最老的报文段 重新启动定时器 收到确认: 如果是对尚未确认的报 文段确认 更新已被确认的报文序号 如果当前还有未被确认的 报文段,重新启动定时器 ACK7: 表示7之前的都发送了并且已经得到了确认。 基本方案是 : 变化的初始序号+双方确认对方的序号(3次握手) Client建立起连接 。然后将自己的初始序号, x发送TCP SYN报文。 就不会出现老数据传输 TCP 三次握手 : FSM TCP: 关闭连接 客户端,服务器分别关闭它自己这一侧的连接【通过发送FIN bit = 1的TCP段 】 一旦接收到FIN,用ACK回应 【

    93410编辑于 2024-05-31
  • 来自专栏Golang语言社区

    tcp连接问题

    sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) sock.setsockopt(socket.IPPROTO_TCP ,socket.TCP_NODELAY,1) sock.connect(('127.0.0.1',55555)) connected=True message): print message if not connected: print "reconnect"print "tcp tcp连接出现了! 原因分析 从上面的python脚本中,可以看到它只是在不断地尝试连接55555这个端口,并且是没有socket监听这个端口,那么为何最后却建立连接了呢? 因为对于tcp协议来讲,连接的流程是走的通,三次握手整个阶段都合法,连接自然可以建立。

    2.8K70发布于 2018-03-22
  • 来自专栏健程之道

    TCP连接及其优化

    TCP建立连接-三次握手 详解 ? .tcp_max_syn_backlog 被动建立连接时,发SYN/ACK(步骤3)重试次数 net.ipv4.tcp_synack_retries 说完了TCP建立连接,接下来,我们再来看看TCP正常断开连接的过程 TCP断开连接-四次挥手 详解 ? 因为这可以保证至少一次报文的往返时间内,端口是不可复用的。 假设 TIME_WAIT状态的持续时间很短,我们来模拟下面这种场景: ? .tcp_fin_timeout = 60 总结 看到这里,想必你应该对TCP连接有了一个大致的了解。

    2.3K20发布于 2019-11-02
  • 来自专栏程序员升级之路

    从RabbitMQ Channel设计看连接复用

    However, it is undesirable to keep many TCP connections open at the same time because doing so consumes are multiplexed withchannels that can be thought of as "lightweight connections that share a single TCP AMQP 0-9-1连接使用多个channel连接实现对单一Connection的复用。 客户端的每一个协议操作都发送在channel上。每个协议方法携带channel ID。 不过这也给我们如何最大程度使用单个连接设计一些参考。 当然如果服务端承受并发能力高,客户端TPS可控,使用连接池也可以解决连接复用的问题,相对来说就简单些,还是得看具体业务场景。 总体来说多线程连接复用是一个趋势,lettuce就有这样的设计,多个线程可以共享一个连接,而且tps还蛮高。

    2.5K50发布于 2020-09-11
  • 来自专栏Python小屋

    Python实现TCP协议套接字多路复用

    方案三:多路复用。 ================= Python标准库selector和selectors支持套接字的多路复用,使得可以在同一个线程中监听多个套接字的IO请求。

    1.3K40发布于 2020-05-08
  • 来自专栏haifeiWu与他朋友们的专栏

    我理解的 TCP 连接

    总述 TCP 是面向连接的协议。运输连接是用来传输 TCP 报文的。TCP 运输连接的建立和释放是每一次面向连接通信中必不可少的过程。因此,运输连接有三个阶段,即:连接建立,数据传输和连接释放。 如上图所示,上图画出了 TCP连接过程。假定主机 A 运行的是 TCP 客户程序,而B运行的是 TCP 服务器程序。最初两端的 TCP 进程都处于 CLOSE 状态。 图中在主机下面的方框中分别是 TCP 进程所处于的状态。请注意,A 主动打开链接,而 B 被动打开连接。 B的TCP服务器进程先创建传输控制快 TCB,准备接受客户进程的连接请求。 这时 TCP 连接建立完成,A 进入 ESTABLISHED(已建立连接)状态。 当 B 收到 A 的确认后,也进入 ESTABLISHED 状态。 TCP 连接的释放(四次挥手) ? 数据传输结束后,通信双方都可以释放连接。现在 A 和 B 都处于 ESTABLISHED 状态。 A 的应用进程先向其 TCP 发出连接释放报文段,并停止再发送数据,主动关闭 TCP 连接

    1.6K10发布于 2020-02-10
  • 来自专栏码农沉思录

    聊聊TCP连接管理

    我们今天要讲的TCP是属于运输层的协议,其特点是提供面向连接的可靠的数据传输,此外,TCP还提供了流量控制与拥塞控制等功能。 今天我们要讲的就是TCP连接管理,即TCP如何建立连接与断开连接,后续文章再介绍TCP的其他特性。 TCP建立连接 TCP建立连接的过程也叫“握手”,“握手”需要在客户端和服务端之间交换3个TCP报文,所以也俗称“三次握手”,其过程如下: ? TCP断开连接 TCP断开连接相对复杂一点,总共分为4个步骤,俗称“四次挥手”。其过程如下: ? 数据传输结束后,双方都可以断开连接,现在假设客户端A主动断开连接。 A经过2MSL时间后,可以保证在本次连接中传输的报文段都在网络中消失,这样一来就能保证在后面的连接中不会出现旧的连接产生的报文段了。 以上就是TCP连接管理的内容了,后续还会继续介绍TCP的其他特性。

    1.7K80发布于 2018-04-17
  • 来自专栏elon带你死磕技术

    关于TCP overflowed、全连接、半连接队列

    背景 最近遇到多台CVM中客户端访问服务器端超时的异常,当时查看了netstat -as信息,凭经验判断可能是tcp overflowed导致的。 我们一起探究探究 这个得从TCP三次握手说起, image.png 相信大家对三次握手都了然于胸,但是如果把这个过程放到linux环境下,结合linux内核的实现逻辑后是个什么形态呢? image.png 这里有两个队列: 半连接队列:SYN queue ,长度由tcp_max_syn_backlog和net.core.somaxconn和 业务tcp调用listen(fd, backlog 收到Client的ACK报文, 如果全连接队列未满,那么从半连接队列拿出相关信息放入到全连接队列中,进入ESTABLISHED状态 如果全连接队列满了并且tcp_abort_on_overflow是0的话 net.ipv4.tcp_max_syn_backlog 同时,提升 listen(fd, backlog) 的 backlog

    8.1K112发布于 2019-11-27
  • 来自专栏陶士涵的菜地

    使用tcpkill杀掉tcp连接

    在使用长连接的过程中,如果有的长连接一直连着,想要杀掉这条连接可以使用tcpkill命令 安装tcpkill , tcpkill使用dsniff的一个小工具 apt install dsniff 使用过程 : 比如连接服务端8082端口的这条连接 ? 杀掉连接, 过滤规则类似tcpdump tcpkill -i any -9 host 49.7.40.205 ? 连接成功被杀掉 ?

    8.5K20发布于 2020-08-24
  • 来自专栏程序员奇点

    TCP连接建立和释放

    什么是TCP协议? TCP 是面向连接的,保证高可靠连性(数据无丢失,数据不错位,数据不乱序,数据无重复)的传输协议。 TCP头 ? TCP 规定,在连接建立后所有传输的报文都必须把 ACK 置1 推送PSH 当两个应用进程进行交互式通讯是,有时在一端的应用进程希望键入一个命令后立即就能收到对方的响应。在这种情况。 TCP 就可以使用推送 push 操作。 复位 RST 当 RST = 1时,表明 TCP 连接中出现严重的差错(如 由于主机崩溃或其他原因),必须释放连接,然后再重新建立运输连接TCP的特点 面向连接的传输层协议 每一条TCP连接只能有两个端点 提供可靠交付的服务 提供全双工通信 面向字节流 建立连接: TCP 三次握手 1. 断开连接:四次挥手 A 向 B 发送连接释放报文端,并停止发送数据,主动关闭 TCP 连接,报文端首部 FIN 设置成1 ,序号 seq = u ,它等于前面已经传输过来的最后一个自己的序号+1 B

    2.2K40发布于 2019-08-13
  • 来自专栏Super 前端

    【HTTP】连接管理--TCP

    TCP连接 TCP连接是因特网上的可靠连接 TCP为HTTP提供了一条可靠(是因为 确认延迟)的比特传输管道。从TCP连接一端填入的字节会从另一端以原有的顺序、正确的传送出来。 两条不同的TCP连接不能拥有4个完全相同的地址组件值。 HTTP要传送一条报文时,会以流的形式将报文数据的内容通过一条打开的TCP连接按序传输。 并行连接:通过多条TCP连接发起并发的HTTP请求; 持久连接:重用TCP连接,以消除连接及关闭时延; 管道化连接:通过共享的TCP连接发起并发的HTTP请求; 复用连接:交替传送请求和响应报文。 服务端ACK+PUSH(Hello)=> 客户端ACK 21:54:39.671731 IP 127.0.0.1.62354 > 127.0.0.1.8431: Flags [P.], seq 1:7, 906578168], length 0 21:54:39.672276 IP 127.0.0.1.8431 > 127.0.0.1.62354: Flags [P.], seq 1:6, ack 7,

    1.6K22发布于 2019-08-14
  • 来自专栏陶士涵的菜地

    测试go连接imap的tcp连接

    连接上imap服务后,什么都不操作,我测试大约5分钟会被服务端断掉,测试代码如下 imapClient, _ := client.Dial("imap.sina.net:143") for { time.Sleep(time.Second * 1) } 为了保持住这条连接,每隔10秒列取一下邮件夹列表,这样就可以一直保持住连接了。 开三个窗口,一个窗口不停的netstat查看tcp连接情况,一个窗口运行代码,一个窗口打开tcpdump监听端口查看数据请求 while true;do clear;date;netstat -altupn

    2.5K10发布于 2019-11-22
  • 来自专栏sofu456

    c# tcp异步连接

    , port); m_listen.Start(); m_listen.BeginAcceptTcpClient(AcceptTcpClient, m_listen); //接收连接 } private void AcceptTcpClient(IAsyncResult ar) {//建立连接 TcpClient recClient = m_listen.EndAcceptTcpClient recClient.Client.BeginReceive(recData, 0, recData.Length, SocketFlags.None, RecieveDataAsyn, recClient);//接收连接

    2.5K30发布于 2020-02-13
  • 来自专栏后台技术底层理解

    TCP 连接的细节问题

    先来描述下三次握手连接: 第一次握手:A 的 TCP 客户端进程也是首先创建传输控制块 TCB。 然后,在打算建立 TCP 连接时, 向 B 发出连接请求报文段,这时首部中的同步位 SYN=1,同时选择一个初始序号 seq = x。 这时,TCP 连接已经建立,A 进入 ESTABLISHED(已建立连接)状态。 为什么要三次握手? TCP 连接使用三次握手的首要原因 —— 为了阻止历史的重复连接初始化造成的混乱问题,防止使用 TCP 协议通信的双方建立了错误的连接。 ,其中并不存在一个用于计数的全局时钟,而 TCP 可以通过不同的机制来初始化序列号,作为 TCP 连接的接收方我们无法判断对方传来的初始化序列号是否过期,所以我们需要交由对方来判断,TCP 连接的发起方可以通过保存发出的序列号判断连接是否过期

    1.6K30发布于 2020-09-01
领券