当前位置: 首页 > news >正文

浅谈如何学习网络编程

如何学习网络编程?这是我的经验之谈,我从来就没有系统的学习过网络编程(非科班么),学习过程中走了不少弯路。最近在读经典的《Linux程序设计(第3版)》,第十五章讲的是套接字Socket编程,读完之后,产生了一些想法,觉得有必要写下来。

学习网络编程我遇到的主要两个困惑是:
第一:计算机网络中的一个个协议都是抽象的,怎么和具体实际结合起来呢?
第二:知道了socket编程的一般步骤后,如何能够写成复杂的服务器程序?(如Web服务器)

我的学习过程是这样子的:
●先是利用WinInet函数库写了几个简单的网络应用程序:简易登录、查询新书RSS等;了解了HTTP协议的一些内容。
●后来又看了孙鑫的VC视频教程,[这里是图片001] ,虽然照着视频能够写出实例代码来,但是仅仅是会用,其中很多原理都不理解,比如说WSA开头的异步函数,Winsock2对socket的一些增强或者改进等。

●后来是一边上《计算机网络》的课,一边读《C++网络编程》。通过计算机网络课我知道了所谓的协议分析是怎么一回事情,通过wireshark抓包分析,“协议”就如同这个词本身意思是一样的,是通信过程中的一种约定,规定了数据包中的每个或每几个字节代表了什么意思;

●至于《C++网络编程》,十分惭愧,我最大的收获不是如何进行网络编程,而是ACE框架的设计原则,通过实际的例子明白了设计模式是怎么一回事情,可以去我的豆瓣书评 看看。

● 再后来,偶然的发现了《计算机网络高级编程技术》,我初略的翻了翻,看到里面的基础、提高、综合训练篇、突然反应过来:socket和操作系统提供的系统调用,基本上都是C语言接口的,协议字段的具体表现,不就是用结构体吗?协议中的几个字节代表什么与C语言基本数据类型就能对应了起来(-_-!这是缺少实践造成的迟钝啊)。

●再后来,了解了下Boost.asio,Java的MINA框架,这些都是异步I/O前摄器模式的实现,当然还有ACE_Proactor

●再后来由于参加比赛的需要,飞快的阅读了《深入理解MySQL核心技术》和Linux程序设计(第3版)》,就这样从把整个知识体系都联系起来,从socket到完整网络服务器程序,我的网络编程才算正式进入了门道。

所以,正常的学习路径应该是:C/C++语言 -->>计算机网络 -->>协议分析 -->>BSD Socket、OS API ( fork()、pthread_create()、select() ) -->>Reactor、Proactor模式

在这个过程我的体会是,最好是从Linux下或者Unix底下学习,比起Windows,Linux的编程接口设计更很简洁,使用的基本上都是标准的数据类型,很多源代码是开放的,而且我比较习惯于看小写的英文单词。。。我发现,如果最一开始能够从整体上了解网络编程的全景,就会知道应该学习什么,下一步该学什么,循序渐进才是好的学习方法。

我所理解的“全景”:

–计算机网络种类有很多种:ATM、X.25、Internet(大大小小的局域网互联而成,以太网、令牌网等等)

---- Internet通信的协议也有很多种,其中最核心的是TCP/IP协议

---- 网络编程接口也有很多种,BSD UNIX提出了socket,是一种通信机制,是管道概念的扩展

-------- socket有三种属性:域(或协议族)、类型、协议

-------- 最常用的协议族有AF_UNIX和AF_INET(对应现在的Internet),AF_INET的类型又有两种:数据流(tcp)和数据报 (udp)

------------ 在<sys/types.h>和<sys/socket.h>定义了socket编程的系统调用:socket()、struct sockaddr、bind()、listen()、accept()、connect()、close()、sendto()、recvfrom()

------------ 其中bind()是用来给创建的socket命名的,如果是AF_UNIX会关联到文件系统的一个路径上,如果是AF_INET则会绑定到IP的端口号上;listen()用来保存未处理的客户请求的队列;accept()等待客户端的连接,会创建新的socket用来处理客户端连接。

------------ 由于历史原因,不同的计算机使用不同的字节序来表示整数,Intel和Motorola的处理器的字节序就不一样,所以要转换为网络序(好像Unicode中的Little-Endian、Big-Endian也是这么个情况。。)

------------ 服务器必然为多客户服务的,为了提高运行效率,高效利用系统资源,就出现多进程、多线程的服务端程序,这就需要用到fork()和pthread_create()了,再往下就是select()、pull()等多路复用和异步I/O机制了。

----------------为了简化网络应用程序的开发,增加代码的复用性、扩展性、可谓性;出现了Reacotr、Preactor等设计模式,出现了ACE、Boost.asio等框架、进一步简化网络开发的难度,出现了WinInet、libcurl这样的面向应用层的函数库。

最后我试着回答最开始的两个问题:

第一:描述协议基本上是C/C++中的结构体、协议中规定的多少字节代表什么,对应中C/C++中的标准数据类型。这是因为操作系统基本上都是用C语言编写的,提供的接口也是C语言的接口。上层的一些协议如HTTP、SOAP、XMPP基本上纯文本的,字符串就能表示。

第二:复杂的服务器程序复杂之处在于对高性能、执行效率的要求,这就需要利用操作系统提供的一些机制,比如多进程、多线程、原生支持的异步I/O机制。针对软件开发的复用性等要求,需要利用面向对象的设计思想,分层的思想、设计模式等。

相关文章:

  • 【MYSQL】表的增删改查
  • 中国地板工具租赁服务行业竞争态势与经营效益预测报告2022-2028年
  • 查看docker 容器的端口
  • xubuntu16.04系统中隐藏网络连接的弹窗提示
  • 基于HTML的环境网站设计 HTML+CSS环保网站项目实现 带设计说明psd
  • 第25集丨人生中最高的精神价值
  • php+mysql计算机公共课在线学习网站
  • Git工具快速入门_一小时速成
  • 声明式HTTP客户端-Feign 使用入门详解
  • 未来:spring响应式编程 Hands-On Reactive Programming in Spring 5(三),spring事件监听
  • SQL Server教程 - SQL Server主要的命令行管理工具
  • NoSQL之Redis主从复制、哨兵集群
  • Redis配置与优化
  • 网卡限速工具之WonderShaper
  • sku详情接口
  • (三)从jvm层面了解线程的启动和停止
  • [译]Python中的类属性与实例属性的区别
  • 【个人向】《HTTP图解》阅后小结
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • MD5加密原理解析及OC版原理实现
  • Promise初体验
  • 对超线程几个不同角度的解释
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 通过npm或yarn自动生成vue组件
  • 通过几道题目学习二叉搜索树
  • 我从编程教室毕业
  • 一个完整Java Web项目背后的密码
  • 以太坊客户端Geth命令参数详解
  • 06-01 点餐小程序前台界面搭建
  • mysql面试题分组并合并列
  • PostgreSQL之连接数修改
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (分布式缓存)Redis持久化
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)负载均衡,回话保持,cookie
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET BackgroundWorker
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET框架
  • .stream().map与.stream().flatMap的使用
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • /etc/sudoers (root权限管理)
  • :O)修改linux硬件时间
  • @Conditional注解详解
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • []Telit UC864E 拨号上网
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——