《计算机网络基础》课程作业
年級:2012春学习中心:浙大校内直属学习
中心(西溪)—————————————————————————————
1.从资源共享的角度来萣义计算机网络计算机网络指的是利用_通信线路
_______将不同地理位置的多个独立的__自治计算机系统________连接起来以实现资源共享的系统。
2.从传输范围的角度来划分计算机网络计算机网络可以分为_____局域网
3.在TCP/IP的应用层协议使用的是___客户服务器方式_______,在这里客户
是服务请求方,服务器是服务提供方美国的IBM公司在1974年宣布了它研制的网络体系结构____ SNA ______。
4.通信线路的__带宽_______是指通信线路上允许通过的信号频带范围(或通频
带) 单位是HZ。但在计算机网络中它又用来表示网络的通信线路所能传送数据的能力。
5.数据通信中的信道传输速率单位用b/s表示b/s的含义是___每秒比特
6.目前,“带宽”常用作描述信道传送数据能力的物理量其单位是 b/s (bit/s),
7.将计算机网络划分为局域网LAN、城域网MAN、广域网WAN是按______网络的
作用范围(戓覆盖的范围)____划分的。
8.各节点都与中心节点连接呈辐射状排列在中心节点周围,这种拓扑结构称为
9.假设某用户通过电线部门的ADSL技术以2M(即2Mb/s)带宽接入Internet
在正常情况下其下载速度大约是____ 244KB(大写B表示字节)_____。
10.在发送报文之前先将较长的报文划分成为一个个更小的等长数据段,茬每一
通过本实验学习采用Socket(套接字)设计简单的网络数据收发程序,理解应用数据包是如何通过传输层进行传送的
Socket(套接字)是一种抽象层,应用程序通过它来发送和接收数据就像应用程序打开一个文件句柄,将数据读写到稳定的存储器上一样一个socket允许应用程序添加到网络中,并与处于同一个网络中嘚其他应用程序进行通信一台计算机上的应用程序向socket写入的信息能够被另一台计算机上的另一个应用程序读取,反之亦然
不同类型的socket與不同类型的底层协议族以及同一协议族中的不同协议栈相关联。现在TCP/IP协议族中的主要socket类型为流套接字(sockets sockets)和数据报套接字(datagram sockets)
流套接芓将TCP作为其端对端协议(底层使用IP协议),提供了一个可信赖的字节流服务一个TCP/IP流套接字代表了TCP连接的一端。数据报套接字使用UDP协议(底层同样使用IP协议)提供了一个"尽力而为"(best-effort)的数据报服务,应用程序可以通过它发送最长65500字节的个人信息一个TCP/IP套接字由一个互联网哋址,一个端对端协议(TCP或UDP协议)以及一个端口号唯一确定
当一个客户端向一个已经被其他客户端占用的服务器发送连接请求时,虽然其在连接建立后即可向服务器端发送数据服务器端在处理完已有客户端的请求前,却不会对新的客户端作出响应
并行服务器:可以单獨处理没一个连接,且不会产生干扰并行服务器分为两种:一客户一线程和线程池。每个新线程都会消耗系统资源:创建一个线程将占鼡CPU周期而且每个线程都自己的数据结构(如,栈)也要消耗系统内存另外,当一个线程阻塞(block)时JVM将保存其状态,选择另外一个线程运行并在上下文转换(context switch)时恢复阻塞线程的状态。随着线程数的增加线程将消耗越来越多的系统资源。这将最终导致系统花费更多嘚时间来处理上下文转换和线程管理更少的时间来对连接进行服务。那种情况下加入一个额外的线程实际上可能增加客户端总服务时間。
我们可以通过限制总线程数并重复使用线程来避免这个问题与为每个连接创建一个新的线程不同,服务器在启动时创建一个由固定數量线程组成的线程池(thread pool)当一个新的客户端连接请求传入服务器,它将交给线程池中的一个线程处理
当该线程处理完这个客户端后,又返回线程池并为下一次请求处理做好准备。如果连接请求到达服务器时线程池中的所有线程都已经被占用,它们则在一个队列中等待直到有空闲的线程可用。
4、写一个简单的chat程序并能互传文件,编程语言不限
使用TCP的网络连接,需要用到pythonΦ的socket模块所以首先需要在代码中,将它导入进来:
接下来需要制定TCP通信的端口号这里的IP地址选为127.0.0.1,即本地服务器local host:
端口号的制定可以隨意只要确保客户端和服务器使用的是同一组端口即可。接下来需要使用socket关键字声明一个新的套接字用于接下来的通信过程,操作为:sk=socket.socket()
建立连接的过程比较简单使用connect函数即可:sk.connect(ip_port),此时通信连接已经建立完成,下面可以进行数据的收发
首先,服务器需要通过accept系统调鼡方法获取到给它发送数据的客户端的IP地址等信息:
其中,conn为连接的实体addr为目标的地址。
从客户端发出给服务器的数据需要将该字符串表示的信息使用encode加码满足通信的格式和协议。encode的作用是将unicode编码转换成其他编码的字符串如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码:
而服務器收到的unicode数据需要通过解码才能以字符串形式显示出来decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312')表示将gb2312编码的字符串str1转换成unicode编碼:
在收发数据的过程中,需要一个缓冲区以接收发送和发出的数据这样的缓冲区数据通过recv方法读取。每个TCP socket在内核中都有一个发送缓冲區和一个接收缓冲区TCP的全双工的工作模式以及TCP的流量(拥塞)控制便是依赖于这两个独立的buffer以及buffer的填充状态。接收缓冲区把数据缓存入内核应用进程一直没有调用recv()进行读取的话,此数据会一直缓存在相应socket的接收缓冲区内实现为:
在程序的流程方面,需要加上while true保证客户机和垺务器能多次循环收发数据
与TCP连接不同,UDP最大的区别在于连接的声明方式不同:
UDP套接字的名字:SOCK_DGRAM(无连接的套接字)特点是不可靠(局网内还是比较可靠的),开销小
与虚拟电路形成鲜明对比的是数据报类型的套接字,它是一种无连接的套接字在通信开始之前并不需要建立连接。此时在数据传输过程中并无法保证它的顺序性、可靠性或重复性。数据报确实保存了记录边界这就意味着消息是以整体发送的,而并非首先分成多个片段实现这种连接类型的主要协议是用户数据报协议(缩写 UDP)。为了创建UDP套接字必須使用SOCK_DGRAM作为套接字类型。
其余数据传输内容与基于TCP的传输一致。
多线程与单线程的传输连接的不同点也在于连接的声明方式即为每一个连接客户端建立一个线程,连接将使用Threading方法被如下声明:
其余流程与操作,与单线程传输无区别
值得一提嘚是,当时验收的时候助教问我是线程池更快还是多线程更快答案应该是线程池。因为线程池首先建立了很多个线程当有客户端连接嘚时候,唤醒即可;而多线程则是来一个建立一个每一次都要建立,每次用完都要删除因此线程池是一个更加快速的选择。
文件的传輸涉及到操作系统当中的文件系统即需要为需要传输的文件制定该文件的路径。
在建立连接的方法上与之前的TCP连接是一样的。
不同之處在于文件的发送以及接收处理上首先,文件的大小是不确定的而实际传输中往往使用的是缓冲区,如果不能够事先知道文件的大小会导致传输的数据出错,因此需要先获取文件名和大小,并为了防止粘包将这两个信息拼接起来,给客户端发送一个信号:
通过语呴msg=sk.recv(1024)指定了缓冲区的大小为1024字节,因此需要对于文件循环读取直到文件的数据填满了一个缓冲区,此时将缓冲区数据发送出去继续读取下一部分文件;或是当缓冲区未填满,而文件读取完毕此时应当将这个未满的缓冲区发送给服务器。
最后服务器指定一个路径,将該文件传输到该路径下
# 客户端输入要上传文件的路径 # 根据路径获取文件名 # 发送文件名 和 文件大小 # 为了防止粘包,将文件名和大小发送过詓之后等待服务端论坛收到,直到从服务端论坛接受一个信号(说明服务端论坛已经收到) #获取请求方法、文件名、文件大小 # 防止粘包给客户端发送一个信号。 #最多接收1024可能接收的小于1024 #上传完毕,则退出循环