高性的能并发网络服务器设计与实现 1.pptVIP

高性的能并发网络服务器设计与实现 1.ppt

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
高性的能并发网络服务器设计与实现 1

高性能并发网络服务器 设计与实现 / 网络服务器开发 协议设计(网络协议和应用协议) 语法(报文格式) 语义(指令的处理, 交互时序等) 只要涉及到交互(即使不是网络交互), 就需要协议 网络实现(IO) 网络开发的基础是socket 任何对网络的封装, 在三度关系之内必然是socket(最多三层封装) 第一节 – 网络IO Talk is cheap, show me the code serv = new TcpSocket(); serv.listen(); sock = serv.accept(); sock.read(buf); sock.write(buf); sock.close() 一次服务 没有并发 短连接 有没有协议? 最简单的TCP服务器 重复服务 socket IO read/write是可阻塞的 阻塞是并发和高性能的死敌 实现并发和高性能的途径就是解阻塞 太简单了! 后面继续讲解read/write... 并发服务 优缺点 优点: 简单易用, 一般工作得很好 多线程, 可以利用CPU多核 缺点: 启动线程也有成本, 很可能占大头 线程的数量不受控制, 危险! 问题在于IO... IO多路复用 专业地解决一个问题 select/poll/epoll/kqueue的API几乎一样, 实现不同, 性能不同 IO多路复用接口的作用, 就是测试accept/read/write等IO调用会不会阻塞 IO多路复用示例 serv = new TcpSocket(); serv.listen(); select.add(serv, READ); // READ 表示只测试可读(读不阻塞) while(1){ readable, writable = select.wait(); foreach(readable as sock){ if(sock == serv){ sock = serv.accept(); select.add(sock, READ); }else{ sock.read(buf); sock.write(buf); sock.close(); } } // writable 为空, 因为我们不测试可写 } 还不完善 第二节 – 报文解析 报文设计 最重要的TCP协议是流式协议, 但几乎所有的应用协议都是基于报文的协议 报文分隔 用连接关闭来表示报文结束. 如, HTTP/1.0的响应 固定长度的报文. 如, TFTP的数据报文. 带自描述长度的固定长度首部的变长报文. 如IP包, TCP分段. 带结束符. 如, 行协议, HTTP协议. 逐字节解析和数据转义的影响. 高层 文本, 带结束符 底层 二进制, 固定长度 SSDB的报文格式 Packet := Block+ \n Block := Size Data Size := literal_integer \n Data := size_bytes_of_data \n 示例: 3 get 3 key 回车 优点 简单 带长度字段, 支持二进制数据 同时对人和对机器友好, 报文数据文本化效果好. 可以telnet到服务器进行交互 解析器非常简单, PHP代码不过几十行 同时兼容LF和CRLF(惯例) socket io 2 read/write读取/发送的是字节数组. C语言的char[], PHP的string read返回时读取的准确字节数无法预计 导致粘包, 断包 write返回时不表示数据已到达对方机器 所以, 即便基于可靠传输的TCP协议, 也需要应用层协议进行确认来保证真正意义上的可靠 带有报文解析的服务器 serv = new TcpSocket(); serv.listen(); sock = serv.accept(); client = new Client(sock); client.recv(packet); client.send(packet); client.close() packet一般是编程语言中的对象 序列化和反序列化 read收到的是字节数组, 要进行反序列化转成编程语言的对象 反序列化的过程就是报文解析 解析报文 bytes = []; while(1){ bytes += sock.read(); if(try_parse(bytes, len) == READY){ // 已经解析出了一个报文, 报文的长度是len // 从字节数组中清除掉已解析的 bytes.remove(len); }

文档评论(0)

牛X文档 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档