我的网络编程之旅

简介:

首先给大家推荐下Markdown,我想用过github的同僚一定很熟悉了,这篇文章的排版就是使用的markdown,以后我们不必再去适应各个博客系统自己繁杂的排版方式了。


网络编程是什么?

给大家从招聘信息上截取几段内容:

  • 熟悉Socket编程,熟悉Tcp/Ip协议栈;

  • 熟悉TCP/IP协议、UDP协议,有相关的协议开发经验;

  • 熟悉网络编程/多线程编程技术;

大家应该很清晰了吧,关键词就是TCP/IP,Socket,我再附加一个多线程。下面开始我的网络编程之旅。

tcp/ip协议分析

其实协议分析并不是大众认为的网络编程的范畴,现在网络编程已经完全和socket等同了。socket是表面,TCP/IP协议是里,有了协议分析的经历更会让你的网络编程之路更加平坦。

想必有些童鞋经历过这样的公司吧,对公司内部的上网行为进行监控:你访问过哪些域名,上传下载过哪些资源,你占用了多少带宽流量,甚至你的邮件正文,附件都会呈现在监控系统上。这就是协议分析的杰作。经典的网络四层模型构成了协议分析的基础。


了解TCP/IP协议一本书足矣《TCP/IP详解 卷1:协议》,进行协议分析并也不需要我们自己从头做起,我们完全可以站在巨人的肩膀上,这个巨人就是pcap,另外还有非常知名的基于pcap实现的开源项目供我们参考,比如snorttcpdumpwireshark特别是snort的功能模块化设计和实现非常经典,应用在大型协议分析项目中极为合适。至于作为协议分析工具的tcpdump和wireshark,不会使用的话咱就别好意思说咱是干这行的了。

socket编程

socket的扫盲书籍及文章太多太多,咱在这就不废话了。起初我有个疑问,对很多公司招聘信息上写的熟悉Socket编程感到很不解,因为我觉得是很简单的事情,无非就是调用几个API,理解下三次握手、listen...等等几个状态。之后在真正做企业级的牵扯到多Client对单Server网络编程和具体的网络环境时才慢慢理解了那些招聘信息的含义和需求深度。(以下如不特殊指定均指TCP协议)

  • 局域网
    我们这个项目主要针对局域网用户,相比广域网的网络环境,几乎可以忽略带宽考虑,用户并发数也相对较小,对性能和效率要求较低,另外业务较复杂。在这种情况下最合适的就是采用RFC(远程过程调用),于是我们首先想到了开源的RFC框架,经他人尝试推荐采用了RCF,相当于我们只需要在此框架上套上业务逻辑即可,起初在我们实践和小规模的测试中并未发现有问题,但是真正模拟到高并发情况时却在网络层出现了不可控的错误,初步判断是RCF的线程模型和我们的使用场景不一致,于是决定开发一套自己的网络库,于是在一位以前有过网游经验的研发人员的指导下,我们一起开发了一个基于boost asio的远程过程调用框架,boost asio的网络模型在windows下采用的完成端口,在类unix系统下采用的是相应的多路复用接口,由于在局域网环境下,用户并发数也不多,也就是用好boost asio,设计好网络传输协议,处理好数据封包解包就好了,并未遇到太大的问题。

  • 广域网
    首先抛开广域网复杂的网络环境不谈,这个产品是个互联网项目,面向普通用户,有些类似于IM软件,由于有QQ这个优秀的采用UDP协议的例子,我们也曾经在TCP和UDP协议间犹豫过,但是鉴于UDP实现的难度太大,还是采用了TCP来实现C/S通信。客户端(windows,linux,android),服务端(linux)网络库的设计编写都由我负责,考虑到以后可能出现的海量并发,在服务端我采用了master——worker模型,一个事件循环一个线程的多线程网络模型,这样可以充分利用服务器的多核资源,客户端和服务端的网络库都采用了libevent。服务端的设计思路及代码实现可以参考我的github:highPerformanceNetworkServer(这只是个演示demo,离企业及应用还有许多需要自己完善的)。

前面说到了socket编程的简单VS深度,其实你需要了解、注意、掌握的东西有很多,比如MTU,MSS,SO_LINGER,TCPNODELAY,TIMEWAIT,keepalive(最好用应用层心跳包),串话...,在实际的编写和使用中你会慢慢知道的。

另外很重要的一点就是网络传输协议的设计,这也进行socket编程的重中之重,可以参考我曾经的文章网络传输数据格式的选择

扩展话题

  • UDP
    UDP也属于socket编程的范畴,把他单拿出来是因为他的使用范围相比较TCP还是有局限性的。在做可靠信息传输这种应用中,腾讯QQ的技术让我们体会到了他的可靠和高效。业界也有相应的对UDP可靠传输的包装,我仔细研究过的是UDT。在我们的产品应用中,主要是使用UDP来进行NAT穿透,我和同事一起使用过UDP和UDT进行NAT穿透,很有效,但依然有局限性:比如针对对称nat。另外使用UDP来进行相对可靠的视频传输,现在我的一个同事在专心搞这块,我想以后从他那一定可以学到不少更深的技术。

  • 多线程
    如果搞网络编程不掌握多线程就好像你只有一条腿一般。比如我前面说所的master——worker模型,一个事件循环一个线程,一些涉及到IO bound、CPU bound、心跳包、客户端抢带宽都可以利用线程来进行相应的解决。

  • Python
    用python来写网络测试脚本,事半功倍。

推荐书籍

本文转自永远的朋友博客51CTO博客,原文链接http://blog.51cto.com/yaocoder/1193313如需转载请自行联系原作者

yaocoder

目录
打赏
0
0
0
0
90
分享
相关文章
网络基础之三
网络基础之三
114 0
告别网络编程迷雾!Python Socket编程基础与实战,让你秒变网络达人!
在网络编程的世界里,Socket编程是连接数据与服务的关键桥梁。对于初学者,这往往是最棘手的部分。本文将用Python带你轻松入门Socket编程,从创建TCP服务器与客户端的基础搭建,到处理并发连接的实战技巧,逐步揭开网络编程的神秘面纱。通过具体的代码示例,我们将掌握Socket的基本概念与操作,让你成为网络编程的高手。无论是简单的数据传输还是复杂的并发处理,Python都能助你一臂之力。希望这篇文章成为你网络编程旅程的良好开端。
101 3
解锁未来网络新纪元!NFV基础知识大揭秘,让你的网络功能秒变“变形金刚”!
【8月更文挑战第25天】网络功能虚拟化(NFV)正引领网络架构的重大变革。NFV通过虚拟化技术将传统专有硬件上的网络功能转移到标准IT设备上,实现软硬件解耦,提升灵活性与成本效益。其关键技术架构包括NFV基础设施(NFVI)、虚拟网络功能(VNF)及管理编排模块。NFV不仅降低了成本和能耗,还加快了业务创新速度,并支持资源共享。目前,NFV已广泛应用于固定和移动网络中,提供用户接入控制等多种服务,未来将在网络发展中扮演更重要角色。
121 4
.NET框架:软件开发领域的瑞士军刀,如何让初学者变身代码艺术家——从基础架构到独特优势,一篇不可错过的深度解读。
【8月更文挑战第28天】.NET框架是由微软推出的统一开发平台,支持多种编程语言,简化应用程序的开发与部署。其核心组件包括公共语言运行库(CLR)和类库(FCL)。CLR负责内存管理、线程管理和异常处理等任务,确保代码稳定运行;FCL则提供了丰富的类和接口,涵盖网络、数据访问、安全性等多个领域,提高开发效率。此外,.NET框架还支持跨语言互操作,允许开发者使用C#、VB.NET等语言编写代码并无缝集成。这一框架凭借其强大的功能和广泛的社区支持,已成为软件开发领域的重要工具,适合初学者深入学习以奠定职业生涯基础。
179 1
💡探索C#语言进化论:揭秘.NET开发效率飙升的秘密武器💼
【8月更文挑战第28天】C#语言凭借其强大的功能与易用性深受开发者喜爱。伴随.NET平台演进,C#持续引入新特性,如C# 7.0的模式匹配,让处理复杂数据结构更直观简洁;C# 8.0的异步流则使异步编程更灵活高效,无需一次性加载全部数据至内存。通过示例展示了模式匹配简化JSON解析及异步流实现文件逐行读取的应用。此外,C# 8.0还提供了默认接口成员和可空引用类型等特性,进一步提高.NET开发效率与代码可维护性。随着C#的发展,未来的.NET开发将更加高效便捷。
96 1
前端必备网络安全知识
【8月更文挑战第25天】前端必备网络安全知识
143 1
入门网络,少不了这份详细的网络基础学习指南!
入门网络,少不了这份详细的网络基础学习指南!
271 0
LabVIEW开发为何仿制(致敬)经典成熟软件
LabVIEW开发为何仿制(致敬)经典成熟软件
68 2
网络编程基础知识
网络编程基础知识
90 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等