范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

linuxTCP网络通信过程

  原文:http://blog.csdn.net/russell_tao/article/details/9111769
  编写服务器时,许多程序员习惯于使用高层次的组件、中间件(例如OO(面向对象)层层封装过的开源组件),相比于服务器的运行效率而言,他们更关注程序开发的效率,追求更快的完成项目功能点、希望应用代码完全不关心通讯细节。他们更喜欢在OO世界里,去实现某个接口、实现这个组件预定义的各种模式、设置组件参数来达到目的。学习复杂的通讯框架、底层细节,在习惯于使用OO语言的程序员眼里是绝对事倍功半的。以上做法无可厚非,但有一定的局限性,本文讲述的网络编程头前冠以"高性能",它是指程序员设计编写的服务器需要处理很大的吞吐量,这与简单网络应用就有了质的不同。因为:1、高吞吐量下,容易触发到一些设计上的边界条件;2、偶然性的小概率事件,会在高吞吐量下变成必然性事件。3、IO是慢速的,高吞吐量通常意味着高并发,如同一时刻存在数以万计、十万计、百万计的TCP活动连接。所以,做高性能网络编程不能仅仅满足于学会开源组件、中间件是如何帮我实现期望功能的,对于企业级产品来说,需要了解更多的知识。
  掌握高性能网络编程,涉及到对网络、操作系统协议栈、进程与线程、常见的网络组件等知识点,需要有丰富的项目开发经验,能够权衡服务器运行效率与项目开发效率。以下图来谈谈我个人对高性能网络编程的理解。
  上面这张图中,由上至下有以下特点:
  •关注点,逐渐由特定业务向通用技术转移
  •使用场景上,由专业领域向通用领域转移
  •灵活性上要求越来越高
  •性能要求越来越高
  •对细节、原理的掌握,要求越来越高
  •对各种异常情况的处理,要求越来越高
  •稳定性越来越高,bug率越来越少
  在做应用层的网络编程时,若服务器吞吐量大,则应该适度了解以上各层的关注点。
  如上图红色文字所示,我认为编写高性能服务器的关注点有3个:
  1、如果基于通用组件编程,关注点多是在组件如何封装套接字编程细节。为了使应用程序不感知套接字层,这些组件往往是通过各种回调机制来向应用层代码提供网络服务,通常,出于为应用层提供更高的开发效率,组件都大量使用了线程(Nginx等是个例外),当然,使用了线程后往往可以降低代码复杂度。但多线程引入的并发解决机制还是需要重点关注的,特别是锁的使用。另外,使用多线程意味着把应用层的代码复杂度扔给了操作系统,大吞吐量时,需要关注多线程给操作系统内核带来的性能损耗。
  基于通用组件编程,为了程序的高性能运行,需要清楚的了解组件的以下特性:怎么使用IO多路复用或者异步IO的?怎么实现并发性的?怎么组织线程模型的?怎么处理高吞吐量引发的异常情况的?
  2、通用组件只是在封装套接字,操作系统是通过提供套接字来为进程提供网络通讯能力的。所以,不了解套接字编程,往往对组件的性能就没有原理上的认识。学习套接字层的编程是有必要的,或许很少会自己从头去写,但操作系统的API提供方式经久不变,一经学会,受用终身,同时在项目的架构设计时,选用何种网络组件就非常准确了。
  学习套接字编程,关注点主要在:套接字的编程方法有哪些?阻塞套接字的各方法是如何阻塞住当前代码段的?非阻塞套接字上的方法如何不阻塞当前代码段的?IO多路复用机制是怎样与套接字结合的?异步IO是如何实现的?网络协议的各种异常情况、操作系统的各种异常情况是怎么通过套接字传递给应用性程序的?
  3、网络的复杂性会影响到服务器的吞吐量,而且,高吞吐量场景下,多种临界条件会导致应用程序的不正常,特别是组件中有bug或考虑不周或没有配置正确时。了解网络分组可以定位出这些问题,可以正确的配置系统、组件,可以正确的理解系统的瓶颈。
  这里的关注点主要在:TCP、UDP、IP协议的特点?linux等操作系统如何处理这些协议的?使用tcpdump等抓包工具分析各网络分组。
  一般掌握以上3点,就可以挥洒自如的实现高性能网络服务器了。
  下面具体谈谈如何做到高性能网络编程。
  众所周知,IO是计算机上最慢的部分,先不看磁盘IO,针对网络编程,自然是针对网络IO。网络协议对网络IO影响很大,当下,TCP/IP协议是毫无疑问的主流协议,本文就主要以TCP协议为例来说明网络IO。
  网络IO中应用服务器往往聚焦于以下几个由网络IO组成的功能中:A)与客户端建立起TCP连接。B)读取客户端的请求流。C)向客户端发送响应流。D)关闭TCP连接。E)向其他服务器发起TCP连接。
  要掌握住这5个功能,不仅仅需要熟悉一些API的使用,更要理解底层网络如何与上层API之间互相发生影响。同时,还需要对不同的场景下,如何权衡开发效率、进程、线程与这些API的组合使用。下面依次来说说这些网络IO。
  1、与客户端建立起TCP连接
  谈这个功能前,先来看看网络、协议、应用服务器间的关系:
  上图中可知:
  为简化不同场景下的编程,TCP/IP协议族划分了应用层、TCP传输层、IP网络层、链路层等,每一层只专注于少量功能。
  例如,IP层只专注于每一个网络分组如何到达目的主机,而不管目的主机如何处理。
  传输层最基本的功能是专注于端到端,也就是一台主机上的进程发出的包,如何到达目的主机上的某个进程。当然,TCP层为了可靠性,还额外需要解决3个大问题:丢包(网络分组在传输中存在的丢失)、重复(协议层异常引发的多个相同网络分组)、延迟(很久后网络分组才到达目的地)。
  链路层则只关心以太网或其他二层网络内网络包的传输。
  回到应用层,往往只需要调用类似于accept的API就可以建立TCP连接。建立连接的流程大家都了解--三次握手,它如何与accept交互呢?下面以一个不太精确却通俗易懂的图来说明之:
  研究过backlog含义的朋友都很容易理解上图。这两个队列是内核实现的,当服务器绑定、监听了某个端口后,这个端口的SYN队列和ACCEPT队列就建立好了。客户端使用connect向服务器发起TCP连接,当图中1.1步骤客户端的SYN包到达了服务器后,内核会把这一信息放到SYN队列(即未完成握手队列)中,同时回一个SYN+ACK包给客户端。一段时间后,在较中2.1步骤中客户端再次发来了针对服务器SYN包的ACK网络分组时,内核会把连接从SYN队列中取出,再把这个连接放到ACCEPT队列(即已完成握手队列)中。而服务器在第3步调用accept时,其实就是直接从ACCEPT队列中取出已经建立成功的连接套接字而已。
  现有我们可以来讨论应用层组件:为何有的应用服务器进程中,会单独使用1个线程,只调用accept方法来建立连接,例如tomcat;有的应用服务器进程中,却用1个线程做所有的事,包括accept获取新连接。
  原因在于:首先,SYN队列和ACCEPT队列都不是无限长度的,它们的长度限制与调用listen监听某个地址端口时传递的backlog参数有关。既然队列长度是一个值,那么,队列会满吗?当然会,如果上图中第1步执行的速度大于第2步执行的速度,SYN队列就会不断增大直到队列满;如果第2步执行的速度远大于第3步执行的速度,ACCEPT队列同样会达到上限。第1、2步不是应用程序可控的,但第3步却是应用程序的行为,假设进程中调用accept获取新连接的代码段长期得不到执行,例如获取不到锁、IO阻塞等。
  那么,这两个队列满了后,新的请求到达了又将发生什么?
  若SYN队列满,则会直接丢弃请求,即新的SYN网络分组会被丢弃;如果ACCEPT队列满,则不会导致放弃连接,也不会把连接从SYN列队中移出,这会加剧SYN队列的增长。所以,对应用服务器来说,如果ACCEPT队列中有已经建立好的TCP连接,却没有及时的把它取出来,这样,一旦导致两个队列满了后,就会使客户端不能再建立新连接,引发严重问题。
  所以,如TOMCAT等服务器会使用独立的线程,只做accept获取连接这一件事,以防止不能及时的去accept获取连接。
  那么,为什么如Nginx等一些服务器,在一个线程内做accept的同时,还会做其他IO等操作呢?
  这里就带出阻塞和非阻塞的概念。应用程序可以把listen时设置的套接字设为非阻塞模式(默认为阻塞模式),这两种模式会导致accept方法有不同的行为。对阻塞套接字,accept行为如下图:
  这幅图中可以看到,阻塞套接字上使用accept,第一个阶段是等待ACCEPT队列不为空的阶段,它耗时不定,由客户端是否向自己发起了TCP请求而定,可能会耗时很长。
  对非阻塞套接字,accept会有两种返回,如下图:
  非阻塞套接字上的accept,不存在等待ACCEPT队列不为空的阶段,它要么返回成功并拿到建立好的连接,要么返回失败。
  所以,企业级的服务器进程中,若某一线程既使用accept获取新连接,又继续在这个连接上读、写字符流,那么,这个连接对应的套接字通常要设为非阻塞。原因如上图,调用accept时不会长期占用所属线程的CPU时间片,使得线程能够及时的做其他工作。

光伏新动力光伏电池片技术百舸争渡!行业发展竞得满园香?在冉冉升起的光伏风电锂电等新能源赛道,上游新能源设备企业技术储备业务发展更为外界瞩目。以光伏电池为例,当下光伏技术变革面临由P型电池转向N型电池(TOPConHJTIBC)过渡阶段铁骑力士集团副董事长雷博打破固有思维开启农牧食品行业创新经营新经济领军人物封面新闻记者朱珠3月29日下午,由四川省经信厅四川省工商联四川日报报业集团作为指导单位,封面新闻华西都市报封面科技主办的榜样中国2021四川十大经济影响力人物评选活动颁奖典礼在成都黑客从视频游戏AxieInfinity的Ronin网络中窃取了超过6亿美元最新的加密黑客攻击针对的是一个以游戏为中心的区块链网络,该网络支持流行的视频游戏AxieInfinity。黑客利用价值约6。25亿美元的以太坊和USDC这两种加密货币,成为有史以来数字经济下金融科技发展之路数字经济是当前我国经济增长的核心动力之一。我国十四五规划提出锚定2035年远景目标,加快数字化发展,建设数字中国,打造数字经济新优势。近期,金融科技发展规划(20222025年)关36氪首发毫米波雷达芯片公司正和微芯获数千万天使轮融资,让消费电子拥有自动驾驶级的感知36氪获悉,毫米波雷达智能感知芯片及系统解决方案提供商正和微芯(Possumic)完成天使轮数千万元融资,本轮由达泰资本领投,横琴金投跟投。创始人邹建发告诉36氪,资金将用于新产品猎户星空推出消杀机器人,致力于做真有用机器人产品来源经济日报新闻客户端日前,北京猎户星空科技有限公司(以下简称猎户星空)正式发布消杀机器人,采用超声波喷雾原理,通过简单操作即可实现全场景广域无死角消杀,还可以根据需求进行个性化场快手CEO程一笑坚持普惠原则,中腰及长尾创作者贡献平台80以上视频播放3月29日,快手科技发布2021年四季度及全年业绩。数据显示,快手四季度DAU(平均日活跃用户)达3。23亿,同比增长19。2,MAU(平均月活跃用户)同比增长21。5达5。78亿荣耀出手了,一亿像素100W快充,颜值产品跌至2219元现在的国内性价比手机市场,几乎所有的手机品牌都不会亲自下场来做了,因为想要提高自己的手机品牌定位,肯定就不可能只做性价比产品,所有很多手机产品都选择分出一个子品牌来做性价比产品,就荣耀Note10的用户狂喜终于等来了新的巨屏旗舰荣耀Note10大概是从2018年起市场上唯一的旗舰巨屏手机了,当年的这款机型搭载了麒麟970处理器超强的对称扬声器在当时已经是很大的5000毫安电池,甚至可以说这款机型为当年的荣阿斯麦CEO回应不卖EUV光刻机给中国大陆苹果股价连涨11天创十多年来最长纪录三星宣布与西部数据合作(全球TMT2022年3月30日讯)今日焦点阿斯麦CEO回应不卖EUV光刻机给中国大陆苹果股价连涨11天创十多年来最长纪录三星宣布与西部数据合作谷歌在法国被罚200万欧元。阿斯麦C中国移动擅自更改用户套餐,投诉无门我该怎么办?被改了套餐(当然是低档改高档)!我用移动28元的套餐近十年了,一直按时缴费,没出过什么问题。去年12月中旬宊然收到短信提示欠费40余元!去营业室咨询了一下,说是套餐由每月28元改成
工信部将组织编制汽车产业绿色发展路线图来源人民网原创稿人民网北京2月28日电(申佳平)今日,在国务院新闻办公室举行的发布会上,工业和信息化部副部长辛国斌表示,我国新能源汽车产业发展已进入规模化快速发展的新阶段,预计今年王一鸣委员产业互联网发展浪潮值得期待数实融合将塑造怎样的未来?王一鸣委员产业互联网发展浪潮值得期待!数字技术与实体经济的深度融合正在快马加鞭。展望未来,数实融合要达到怎样的高度与深度?又应注意哪些问题?一起来听听全国明日起!外卖出餐新规上线!餐厅和骑手冲突将缓解?文职业餐饮网旖旎明日(3月1日)起,美团外卖平台实施新规明确出餐上报管控!新规则,未上报或非真实上报的商家都将被处罚!从外卖上线开始,商家和骑手因出餐慢矛盾不断升级骑手因为出餐慢,Zoom(ZM。US)Q4业绩指引不及预期还要被微软截胡?智通财经APP获悉,Zoom(ZM。US)公布了2022财年全年和第四季度财务业绩。数据显示,Q4营收为10。8亿美元,同比增长22。4,预期10。5亿美元。Q4净利润4。91亿美满哥帮忙未经同意开通视频点播服务?中国移动称补偿500元,但要求用户保密近日,市民刘先生通过今日头条头条帮忙入口向潇湘晨报记者反映,在去年一次查询话费账单时发现账单中莫名出现了点播魔百盒包月的费用,每月费用20元,但刘先生称自己从未开通过这样的服务。刘氪星晚报高通与字节跳动宣布合作,共建XR生态特斯拉柏林工厂审批程序已进入最后阶段腾讯区块链交易方法专利公布大公司特斯拉柏林工厂审批程序已进入最后阶段德国勃兰登堡州环境部周一表示称,特斯拉计划在柏林附近建厂的审批程序已进入最后阶段。特斯拉正等待获得许可,以便在其位于柏林郊外格伦海德的电动苹果iOS15。3。1正式版发布,有了许多新设置,它的功能是重头戏三分钟看尽每周数码科技资讯热点。大家可能都知道的是,苹果公司的iOS15新系统发布,引发出了许多问题,比如相关APP可能会莫名其妙的出现重启或者卡顿的情况。将近一个月前,为了修复系猛投600亿!小米汽车落户通州这里!周边村分5标段拆迁投资600亿!小米汽车将落户通州马驹桥!日前,北京市2022年重点工程计划名单发布,300个项目中就包括小米汽车,这是否意味着小米汽车将拉开建设大幕?另有消息称,周边通州8村也将分智能制造2025碳中和东数西算将是A股的主旋律近年来,国家推出了多个重磅战略,在我看来智能制造碳中和东数西算是最具有代表性的几个战略,其专业指导性战略性实用性都非常强,将会给国民经济带来实实在在的好处,最终也将表现在股市上。智初中生制作的Win11内核纯净PE系统,支持插件下载安装很多人都会备用一个PE系统吧,可以用来安装系统装机维护等等,非常实用。目前网上上很多PE系统都夹带私货,一些推广啥的,所以之前锋哥给大家分享了几款还不错的PE系统,例如有Edgel美国最大银行警告不要滥用SWIFT制裁,会坑了美元就在西方国家宣布对俄罗斯实施前所未有的制裁,包括禁止俄罗斯的几家主要银行使用SWIFT国际结算系统,以及冻结俄罗斯央行的资产几个小时后,摩根大通首席执行官JamieDimon在接受