首页 > 编程知识 正文

网络编程和网页编程,程序设计基础吴文虎

时间:2023-05-04 11:44:30 阅读:156789 作者:4529

3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com /

视频显示,一些专有名词不太肯定,版权归苹果太阳镜大神。

你好。 我是苹果太阳镜。 我被邀请学习关于网络编程的在线课程。 本课程名为《网络编程实战》,主要通过介绍10多个实例,展示了web编程的常用技术。

《网络编程实战》是一个内向的大碗传奇,这门课程我想我已经大致读过本书了。 具备基本的TCP/IP知识,如IP地址的端口号等,并且用Sockets API编写类似echo Sever的简单网络程序是本课程的前提条件。

本课程面向Linux系统,使用C、Python、Go几种语言,其中C使用最多。

gsdyl .史蒂文斯于1990年出版了《UNIX网络编程》的第一版,之后写了《UNIX网络编程》和《UNIX环境高级编程》三卷书。

然后他开始写《TCP/IP详解》第二版,计划分三卷出版:

第一卷论述了web编程API,于1998年出版。 这本书主要讲述的是Sockets APIs,他还讲述了现在废除的XTI,但这一点就不谈了;

第二卷其实和网络编程没什么关系,主要是谈进程间通信。 它于1999年出版。 你可以认为我在谈论多进程和多线程的同时编程。 这两本书都使用c语言。

第三卷中最受期待的书是关于网络编程的应用,但遗憾的是,内向的大碗于1999年9月1日不幸去世,本书没有后续。

当然,我这门课程并不是想继续《UNIX网络编程》第三卷,而是通过补充实际编程实例,帮助读者更好地掌握《UNIX网络编程》第一卷的内容。

我认为《UNIX网络编程》第一卷没有强调两个东西:

第一个是信息形式的处理,没有特别提到如何在无阻塞IO中正确处理TCP分包。

二是该书讲授的并发模型略显陈旧,高并发服务多采用事务驱动和无阻塞IO方式。 这是一个传统的东西,《UNIX网络编程》的分量不够,只有一章,但有一本书专门涉及这方面的内容,叫做《UNIX网络编程》第2卷,讲了各种各样的并发模式,这本书的课上也可以参考这本书。 这本书是2000年出版的

《面向模式的软件架构》第三版是别人不断写的,于2003年出版。 如果你要去买书,请考虑买他的第三版。

本课程名为《UNIX网络编程》,有10多个代码示例,用于分析代码背后的原因。 本课程主要针对服务器端的TCP网络编程,与客户端、图形用户界面、APP等几乎无关。 但是,虽然会说TCP客户端,但不是用户操作的客户端。 只要稍微提到一下UDP,就可以说出UDP和TCP编程的巨大区别。 特别是处理并发的方法完全不同。

说起网络编程,很多人都会想到高性能,但本课程强调的是可测量的性能。 无法测量的性能指标是没有意义的。 另外,想避免基于推测、推测的优化。 因为我们发现,除了使代码更复杂和更难维护之外,一些优化并没有实质性地提高性能。 网络编程有很多虚假欺骗的讲究。 中文论坛举例说,民间传说使用STL来尽量减少动态内存的分配是罪大恶极的,但Linux内核从网卡接收包后经过协议栈进行APP

我知道网络是分层的。 典型的程序员关注四层:以太网层、IP层、传输层和APP应用层。

>我们在谈几层的时候,术语要准确,以太网 Frame 叫帧,IP Packet 叫分组,TCP segment叫分节,应用层通常我们谈消息(message),注意“IP的分组”和“IP的分片”是两个事情,一般我们不用管IP分片。

网络编程是一个入门容易精通难的事情,初学者有一些常见的错误,这里列了一些,在后面的课程中还会具体的结合例子来讲,这里先大致提一下:

一个是《UNIX网络编程》的示例代码,往往把网络IO和业务逻辑穿插在一起,这固然比较容易写出紧凑易读的代码,但是在大型项目中,这种做法的可维护性比较低,因为不是每个人都那么精通网络编程的方方面面的细节,如果他熟悉业务逻辑,那他在写业务逻辑的时候,可能一不小心就引入网络编程方面的Bug,应该是尽量避免在网络编程中把和Socket API 打交道代码和业务逻辑穿插在一起。

第二个呢,也是中文论坛上,长期出现的项目,有人说TCP不可靠,收到的数据不完整,这个话题以后我还会专门讲,主要是涉及TCP连接断开的时机与条件,Close太早的话,有可能导致协议栈发送RST分节,将连接重置,数据自然就收不完了,在阻塞编程中可以使用SO_LINGER这个选项,在非阻塞SO_LINGER这个选项没用,我们现在从应用层的协议上入手解决问题,你在设计应用层协议的时候,把TCP连接的断开,要放到协议设计的考虑当中去。

第三个呢,TCP是一个字节流协议,他保证字节按顺序到达,但不保留消息的边界,因为对于TCP本身来说没有消息概念,就说你发送一堆的数据过去。那么,TCP我们检测程序的一个办法,就是如果他一个字节一个字节收到的话,你程序应该也能正常工作。在应用程序中,我们要设计并实现TCP分包的逻辑,把TCP的字节流切分成一个一个可以分开的消息,这方面有一些小坑,初学者容易掉进去,课程以后会讲到。

第四个呢,初学者常见的一个设计失误,直接发送C语言的结构体,这个问题有两个:

第一个呢,他要考虑对齐,有的人会直接修改全局的对齐的方式,他把pack设成1,直接导致第三方library扩大,因为破坏了API二进制接口;

还有问题是在于,高度的不可扩展。因为你要增加一个字段的话,就所有的客户端服务端都要升级,而且如果有一方不是用C语言写的话,你就要手工实现 pack、unpack 的代码,也是维护上有很大的代价,这么做就一开始用发送C strcut,可能是受了学TCP的教材的影响,因为TCP/IP的header,它就用的是定长的那种字段的格式,而且它里面用了Bit field(位域),所以可能有的人照猫画虎说,既然TCP/IP自己这么用,那我自己写应用的时候也是用struct来表示消息,这个情况我认为通常应该避免的。

第五个是一个具体的小坑,就是TCP的“自连接”。你发现TCP的客户端往本机的服务端发起连接的时候,如果服务器没有起来,在一定条件下,客户端会自己和自己建立一个连接,比方说从localhost的端口54321,再连到了54321端口,你收发数据出现鬼打墙的现象,发个数据,自己收回来,就跟出现loop循环编程的时候一样,你知道现象就很很好办,你发现种情况就把连接断开,重新试就行了。

最后呢,非阻塞网络编程中还有很多很多坑,一个好的库呢,应该把大多数坑都填上,同时程序员,你要明白非阻塞网络编程的特点,避免别人把坑填好了,你自己再把坑挖开掉进去。

现在千兆网早就普及了,在很多机房里面,万兆网,实际的以太网也已经不堪使用,那么你很自然的想法,千兆网到底有多快?如果我们用TCP来传输数据的话,这里有简单的计算,它把从以太网的层面消息的每部分的长度列出来,算出来一个最大的带宽是117兆字节每秒,或者用二进制的 Mega,bit 计算的话是112,下面我们先来做个实验,验证一下计算是否正确。

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。