您的位置:首页 > 理论基础 > 计算机网络

计算机网络自顶向下方法之——第二章 之四

2016-05-03 19:55 435 查看

2.7 Socket Programming:Creating Network Application

我们看完了几个重要的网络应用,现在探索网络应用程序是怎么编写的,我们2.1节提到通常网络应用由client program和server program组成,运行于两个不同的终端系统,当这两个程序运行的时候,就会产生一个client process和一个server process,这些进程彼此交流是通过从sockets中写入或读出,因此,当要完成一个网络应用,开发者的主要工作就是编写client和server的程序

这里有两种网络应用,一种是按照指定的大家都知道的标准执行,如果两个开发者分别开发客户端和服务器端,只要他俩严格遵守RFC的规则,那么这两个程序就可以interoperate,事实上,浸提那很多的包含客户端和服务器端通信的应用都是独立的开发者开发的,例,火狐浏览器与阿帕奇Web server通信,

另一种是专用的,这种情况下客户端和服务器端用一个没有在RFC或者其他地方公开的应用程协议,客户端和服务器端都是一个人或者同一个团队开发,开发者具有完全的控制,但是因为这些代码不是用open protocol,所以其他的开发者是不能写出代码与这个程序交互的

这节我们讲解在开发client-server架构应用时的核心问题,我们将会亲自动手搞个很简单的CS应用,在开发阶段,先要做出的决定就是要用TCP还是UDP协议,重新说明当客户端或者服务器端程序用RFC中定义的协议的时候,它需要使用哪个与这个协议相关联的端口,当开发私有应用时候,要注意不要用这些well-known端口,

我们通过简单的一个UDP应用和TCP应用来介绍TCP和UDP socket programming,应用使用Python来写,因为这种语言代码比较少,而且便于我们解释

2.7.1 Socket Programming with UDP

这小节我们用UDP协议来写简单的CS架构程序,下面的小节将用TCP来写,2.1的时候我们提到过运行于不同机器间的进程通过socket来通信,我们在这里仔细看下用UDP socket交互的通信进程,使用UDP,当发送方可以push一个packet到socket之前,必须给packet加上目的地地址,包通过socket之后,互联网用这个地址找到接收方的socket,然后接收方进程会从socket中提取出packet,查看内容并采取合适行为

所以你大概想知道,什么东西还会和packet一起到目的地呢?目的地的IP当然得算目的地地址的一部分,通过IP,网络中的路由器可以将packet发送到目标计算机, 但这个计算机可能同时运行多个应用,所以还需要指定目的端口,当一个socket被创建,一个叫做端口号的标识符便会分配给它,因此,总结,发送方附在packet上的目的地地址包括目的计算机的IP和端口号,我们一会还会看到,发送方的IP和端口号也会附在packet,然而,把发送方的地址附在packet普遍不是UDP应用的代码所执行的,而是底层的操作系统自动完成,

我们将用下面简单的client-server应用来演示UDP和TCP的socket programming

1.客户端从键盘输入一行字母并发送给服务器

2.服务器接收并把字母转换为大写

3.服务器把修改过的信息发送给客户端

4.客户端收到并在屏幕上显示



UDPClient.py

Python代码及运行部分单独作为一篇发表

TCPClient.py

Python代码及运行部分单独作为一篇发表

2.7.2 Socket Programming with TCP

与UDP不同,TCP是面向连接的,因此在发送消息前必须先握手并建立TCP连接,一端连接client socket,另一端连接server socket,创建TCP连接时,我们将client socket address(IP和port number)和server socket address(IP和port number)和它关联,这是当需要发送信息,发送方通过socket直接将数据送入TCP连接,不像UDP需要在packet上附上地址

我们来看TCP客户端程序与服务器程序的交互,客户端得向服务器端发起连接,这就要求服务器端要准备好,包括两个方面,一是,像UDP一样,服务器进程必须处于运行状态,二是服务器必须要有专门的socket来接受这种发起连接的消息,用我们house/door和process/socket的类比,我们把client发起连接称为“knocking on the welcoming door”,当服务器进程运行,客户端就能发起TCP连接,这会让client program创建一个TCP socket,当这个socket创建时,它会指定服务器IP和socket的端口号,创建完成后,client会发起three-way握手并与服务器建立TCP连接,握手发生在传输层,所以在client program和server program是不可见的

在握手期间,客户端进程在服务器进程敲门,当服务器听到敲门,它会创建一个新的门——更准确的说,这个新的socket是这个client专用的,在我们下面的例子中,the welcoming door is a TCP socket object that we call serverSocket,新创建的专为发起连接的client的socket叫做connectionSocket,



从应用的角度,客户端的socket和服务器的connection socket是通过“管道”直接连接的,像图中一样,客户端可以发送任意字节的消息到它的socket,TCP会保证接收端按照发送的顺序收到所有的字节,socket是能进能出的



TCPClient.py

Python代码及运行部分单独作为一篇发表

TCPServer.py

Python代码及运行部分单独作为一篇发表

2.8 Summary

这章,我们学习了网络应用的概念和执行方面,学习了无处不在的client-server架构,看了它在HTTP,FTP,SMTP,POP3,DNS协议中的应用,我们学习了这些应用层的重要协议并联系了相关的应用,我们也看了越来越受欢迎的P2P架构,讲解了socket API是如何用来构建应用的,我们也看了socket在TCP和UDP中的应用,

2.1节我们讲解了TCP和UDP协议提供给调用他们的应用的服务模式,2.7中我们更用简单的实践做了更加详细的说明,但是我们却没有提到TCP和UDP是怎么提供这些服务的,下一章我们会将一些关于传输层协议的how和why,而不是仅仅的这章提到的what
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: