计算机网络原理:无线与移动网络

todo

一、计算机网络应用体系结构

二、网络应用通信基本原理

三、域名系统(DNS)

四、万维网(WWW)

五、Internet电子邮件

六、FTP

七、P2P应用

基于客户/服务器体系结构的应用,它们要求有总是在运行着的基础设施服务器,如DNS服务器、万维网服务器、邮件服务器等。与这些应用不同,基于P2P体系结构的应用是对等方之间直接进行通信,而且对等方主要运行于间断连接的主机上,如个人计算机,而不是运行于24h连续开机的服务器上。

目前,在互联网上流行的P2P应用主要包括P2P文件共享、即时通信、P2P流媒体、分布式存储等。在这里我们仅以P2P文件共享为例来简单介绍P2P的应用。文件共享应用实际上有两个基本的问题要解决:如何查找到你需要的文件,以及如何从拥有该文件的主机下载该文件。这里我们仅讨论后一个问题,即P2P文件分发(从文件拥有者角度看是将一个文件分发给多个对等方)。

7.1、P2P文件分发

我们通过一个简单的例子来说明P2P方式在文件分发应用中的优势。该任务是将主机H1 中的一个长度为L 的大文件分发给其余七台主机。假设文件传输的瓶颈是各主机的上载速率,再假定所有主机的上载速率都是R 。对于客户/服务器方式,主机H1 为服务器,而其他主机为客户。显然主机H1 要依次把文件发送给所有其他主机,所需的时间是7L /R 。可见采用客户/服务器方式,文件分发时间随客户机的数量呈线性增长。因此,基于客户/服务器方式的应用在面对大量用户访问时,服务器要承受极大的负担,并且消耗大量的服务器带宽。

在P2P文件分发中,每个对等方都能在收到文件后再将该文件分发给其余对等方,从而协助主机H1 进行分发,这样就大大缩短了文件分发的时间。例如,可以在3L /R 时间内就把长度为L 的文件分发给所有七台主机:

  • 第1个L /R 时间,H1 →H2 ;

  • 第2个L /R 时间,H1 →H3 ,H2 →H4 ;

  • 第3个L /R 时间,H1 →H5 ,H2 →H6 ,H3 →H7 ,H4 →H8 。

可以证明采用这种基本的P2P分发方式,文件分发时间随对等方数量呈对数增长。显然,每个对等方都参与了文件的分发,它们既是服务的请求者,也是服务的提供者。参加的对等方越多,服务的提供者也就越多。因此,P2P方式比客户/服务器方式具有更好的可扩展性。

实际上,通过分片 ,即把文件划分为很多等长的小数据块进行分发,可以进一步加快文件分发的速度。因为一个对等方不必等整个文件全部收完就可以将该文件的部分数据块分发给其余对等方,这提高了文件分发的并行性。这就是说,对每一台需要下载文件的主机来说,不仅可以从多个对等方下载数据块,而且可以同时给多个对等方上载数据块。下图说明了这种情况。可以看出,数据块的传送途径不仅有A→B,A→C,A→D,而且有B→C,B→D,C→B,C→D,D→B,D→C。

img

巧妙地设计分发算法可以大大提高整个系统文件分发的效率。在一个实际的P2P文件分发系统中,任意两个拥有不同数据块的对等方之间都可能互相传送数据块,并且不断有对等方加入或离开。下载某个文件的人越多,拥有该文件数据块的对等方就越多,新加入的对等方就可以从更多的对等方下载该文件,因此有可能更快地下载完整的大文件。这就是为什么使用P2P文件分发软件的用户会有“下载的人越多,下载速度越快”的体验。由于对等方随时都有可能离开,为避免所有下载同一文件的对等方都缺少同一数据块,对等方通常会优先下载“稀有”数据块(拥有该数据块的对等方少),因此每个文件的数据块下载顺序具有随机性。

八、Socket编程基础

典型的网络应用是由一对程序(即客户程序和服务器程序)组成的,分别位于两个不同的端系统中。当运行这两个程序时,便创建了一个客户进程和一个服务器进程,同时它们通过从套接字读出或写入数据,完成彼此之间的通信。

开发者创建一个网络应用时,其主任务就是编写客户程序和服务器程序的代码。网络应用程序可分为两类:实现标准协议的网络应用和专用网络应用。

  • 实现标准协议的网络应用的应用层协议遵循某个或某些标准,如RFC 定义的标准或某种其他标准,客户程序和服务器程序必须遵守标准所规定的规则。这类网络应用的客户程序和服务器程序可以分别由不同组织或人员开发,一个开发者编写的客户程序可以与另一个开发者编写的服务器程序进行正常通信,因为两者都遵守同一标准的各种规则。例如,一个组织开发的 Web 浏览器,可以与另一组织开发的 Web 服务器进行正常通信与交互,因为彼此共同遵守HTTP协议标准。事实上,大多数标准网络应用的客户程序和服务器程序通常都是由不同的程序员甚至是不同组织单独开发的。
  • 专用网络应用是针对某组织或个人的特殊需求编写的网络应用程序。这类应用的应用层协议是专门设计的,没有公开发布在 RFC 中,没有成为标准,只在小范围内甚至只在某个网络应用中使用。专用网络应用的开发通常要求开发者(或开发团队)同时完成应用的客户程序和服务器程序的编写,因为这类应用没有实现一个开放(或标准)的应用层协议,其他开发者将不能开发出和该应用程序交互的代码。显然,要想了解网络应用程序是如何编写的,需要同时理解客户程序和服务器程序的编写。

网络应用进程通信时需要通过API接口请求底层协议的服务(如传输层服务),目前在Internet 中应用最广泛的网络应用编程接口就是 Socket API。无论是客户进程还是服务器进程,都需要创建 Socket,实现底层协议接口,从而可以通过Socket 将数据发送出去或接收进来。

8.1、Socket的基本类型

应用进程可以根据需要,创建不同类型的 Socket和不同的底层协议接口,当然也就使用了不同底层协议提供的不同类型的服务。应用进程面向 TCP/IP 协议栈的Socket接口模型如下图所示。

网络应用进程可以创建3种类型的 Socket:数据报类型套接字 SOCK_DGRAM、流式套接字SOCK_STREAM和原始套接字SOCK_RAW。其中,SOCK_DGRAM面向传输层 UDP 接口;SOCK_STREAM面向传输层TCP接口; SOCK_RAW 面向网络层协议(如IP、ICMP)接口。

前两类套接字均是面向传输层的接口,比较容易理解,而原始套接字比较特殊,“绕”过了传输层,是面向网络层的接口。原始套接字的创建有权限限制,例如,在 Linux 操作系统中,具有 root 权限的用户才能创建原始套接字。通过原始套接字,应用进程可以实现—些特殊的功能,如收发 ICMP报文等。

8.2、典型的Socket API函数

Socket为开发人员提供了开发C/S 网络应用的途径与架构,具体形式为一组Socket API 函数。在编写客户程序和服务器程序时,需要调用不同的 Socket API 函数,实现创建套接字、发送数据、接收数据等功能。典型的Socket API函数如下。

8.3、Socket API函数调用过程

在开发 C/S 架构网络应用程序时,需要根据应用特点和需求等选择使用传输层 TCP 或UDP。

TCP 提供面向连接、可靠的字节流传输服务,选择使用 TCP 的网络应用程序,无须处理数据丢失等问题,从而使得应用程序设计相对简单。基于 TCP 客户与服务器的典型Socke API函数调用过程如下图所示。

服务器程序运行后,调用 socket()函数创建 SOCK _ STREAM 类型的主套接字 ms;调用bind()函绑定本地端点地址;调用 listen()函数置主套接字 ms 为监听模式;调用 accept ( )数通过主套接字 ms 接收客户连接请求,并阻塞服务器进程,直到有客户连接请求到达accept()函数调用成功,返回(创建)连接套接字ss.

客户程序在服务器程序运行后执行,创建了本地sOCK STREAM类型的套接字cs后调用 connect()函数请求与服务器建立 TCP 连接,connect()函数调用成功,表明 TCP连接建立成功。接下客户程序与服务器程序通过调用 send()和 recv()函数,实现数据发送与接收。通信结束后,客户程序通过调用 close()函数,释放套接字 cs;服务器程序通过调用close()函数,释放套接字 ss,从而关闭 TCP 连接。服务器程序继续调用 accept)函数,通主套接2s接收一个客户连接请求。通常情况下,服务器程序不会关闭主套接字 ms,为服务器还要继续为其他客户提供服务:

服务器器端在调用 accept()函数时,通常阻塞服务器进程,等待客户的连接请求,一日客户连接请求到达,accept()函数会返回(创建)个新的套接字 Ss, sS 是真正与客户建TCP 连接的。服务器与客户的通信是通过与特定客户连接的ss 进行的,当与该客户通信结市;可调用 closes()函数关闭与客户通信的 Ss。服务器通常通过无限循环机制,继续用 accept()函数继续等待新的客户连接请求,周而复始。当然,服务器也可以通过并发机制,如多线程机,实现并发的服务器,实现在与个(些)客户通信的同时继续接收新的客连请

UDP 提供无连接可靠的数据报传输服务,选择使用 UDP 的网络应用程序,不能依UDP实现可靠数据传输。应用程序或者容许 UDP 的不可靠数据传输特点(例如,多媒体应可以允一定比例的数据丢失),或者应用程序在应用层自己解决可靠性问题。基于UDP 与服务器邈型SoceAI函数调用过程如图2.22所方

服务器程序运行后,调用 socket)函数创建 SOCK DGRAM 类型的套接字 ums:调用bind()函数绑定本地端点地址。客户程序运行后,创建本地 SOCK DGRAM 类型的套接ucs。接下:客户程序与服务器程序通过调用 sendto()和recvfrom()函数,实现数据发送与羹接收。通信结束后,客户程序通过调用 close()函数,释放夿字ucs:服务器程序继续调片recvfrom()函数,通过套接字 ums 接收下一个客户发送过来的数据报。通常情况下,服务器程序不会关闭套接字ums。

九、参考

计算机网络教程(第6版·微课版)

计算机网络原理创新教程

计算机网络原理 自考04741


计算机网络原理:无线与移动网络
https://kuberxy.github.io/2024/12/15/计算机网络原理07:无线与移动网络/
作者
Mr.x
发布于
2024年12月15日
许可协议