网络程序设计(C)复习笔记

本文详细介绍了网络编程基础知识,包括OSI模型和TCP/IP模型的关系、数据传输方式、C/S与B/S模型的优缺点、UDP的应用场景以及无状态与有状态服务器的概念。接着探讨了并发处理的概念,如进程、线程、阻塞与非阻塞、同步与异步,以及Linux下五种I/O模型。此外,还涵盖了服务器设计的多种算法,如循环服务器、并发服务器的实现,并讨论了线程的优缺点。最后讲解了套接字编程、TCP客服-服务器模型实现流程,以及服务器并发性的管理和优化策略。
摘要由CSDN通过智能技术生成

[TOC]

第一章 引言和网络编程基础知识

1.1 分别简述OSI参考模型和TCP/IP模型,并阐述他们之间的对应关系

11129189-40304bb799e1f6bb.png
image

1.2 简述数据传输的三种方式及其优缺点

优点 缺点
电路交换 双方可以随时通信,实时性强. 双方通信时按发送顺序传送数据,不存在失序问题. 电路交换的平均连接建立时间较长. 信道利用低.
报文交换 不需要为通信双方预先建立一条专用的通信线路。 通信双方不是固定占有一条通信线路,提高了通信线路的利用率. 经历存储、转发这一过程,从而引起转发时延. 要求网络中每个结点有较大的缓冲区
分组交换 加速了数据在网络中的传输 简化了存储管理 减少了出错机率和重发数据量 每个分组都要加上源、目的地址和分组编号等信息,使传送的信息量大 可能出现失序、丢失或重复分组

1.3 简述C/S,B/S模型并分析他们的优缺点

C/S架构

C/S 架构是一种典型的两层架构,其全称是Client/Server,即客户端、服务器端架构,其客户端包含一个或多个在用户的电脑上运行的程序,而服务器端有两种,一种是数据库服务器端,客户端通过数据库连接访问服务器端的数据;另一种是Socket服务器端,服务器端的程序通过Socket与客户端的程序通信。

C/S 架构也可以看做是胖客户端架构。因为客户端需要实现绝大多数的业务逻辑和界面展示。

C/S优点和缺点
优点:

  1. C/S架构的界面和操作可以很丰富。
  2. 安全性能可以很容易保证,实现多层认证也不难。
  3. 由于只有一层交互,因此响应速度较快。

缺点:

  1. 用户群固定。由于程序需要安装才可使用,因此不适合面向一些不可知的用户。
  2. 维护成本高,发生一次升级,则所有客户端的程序都需要改变。

B/S架构

B/S架构的全称为Browser/Server,即浏览器/服务器结构。主要事务逻辑在服务器端实现,B/S架构的系统无须特别安装,只有Web浏览器即可。因此也被成为瘦客户端。

必须强调的是C/S和B/S并没有本质的区别:B/S是基于特定通信协议(HTTP)的C/S架构,也就是说B/S包含在C/S中,是特殊的C/S架构。

B/S优点和缺点

优点:

  1. 客户端无需安装,有Web浏览器即可。
  2. B/S架构可以直接放在广域网上,通过一定的权限控制实现多客户访问的目的,交互性较强。
  3. B/S架构无需升级多个客户端,升级服务器即可。

缺点:

  1. 在跨浏览器上,B/S架构不尽如人意。
  2. 表现要达到C/S程序的程度需要花费不少精力。
  3. 在速度和安全性上需要花费巨大的设计成本,这是B/S架构的最大问题。
  4. 客户端服务器端的交互是请求-响应模式,通常需要刷新页面,这并不是客户乐意看到的。

1.4 应用程序在什么情况下建议使用UDP

UDP: 无连接交互

  • 没有可靠保证
  • 依赖下层系统保证
  • 程序中应该有相应保障措施

TCP: 面向连接的交互

  • 提供传输可靠性
  • 程序要求简单

应用程序只在以下情况使用UDP:

  1. 应用程序指明必须使用UDP;
  2. 应用程序协议要依靠硬件进行广播或组播
  3. 应用协议在可靠的环境中运行,不需要额外的可靠性处理。

1.5 请阐述无状态服务器和有状态服务器概念及其特点,并介绍其优缺点。

服务器所维护的与客户交互的信息成为状态信息。不保存任何状态信息的服务器成为无状态服务器,反之成为有状态服务器。

有状态服务器

有状态服务器在服务器中保存少量信息,可减少客户端与服务器端交换报文的大小,保存了客户之前有过的请求,允许服务器快速的相应请求。

特点

  • 保存客户请求的数据(状态)
  • 服务端容易对客户状态进行管理
  • 服务端并不要求每次客户请求都携带额外的状态数据

优点

  • 由于服务器可以区分各个客户,并保留每个客户以前的请求信息,报文中不必包含所有字段信息。

缺点

  • 通常情况下报文丢失、重复或交付失序,或者客户端程序崩溃都会使服务器的状态信息不正确,此时就可能产生不正确的响应。

无状态服务器

无状态服务器的动机是协议的不可靠性。客户请求报文必须指定操作类型、文件名、传输数据在文件中的位置和传输字节数、要写入的文件数据等。

特点:

  • 并不保存客户请求的数据(状态)
  • 客户在请求时需要携带额外的状态数据
  • 无状态服务器更加健壮,重启服务器不会丢失状态信息,这使得维护和扩容更加简单

优点

无状态服务器则不会因为报文丢失,失序等问题导致状态信息出错,出现问题。

缺点

每次都要携带额外的状态信息,产生额外的数据。

第二章 客户服务器软件中的并发处理

2.1 并发、并行的概念及其区别

并发

当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间
段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。这种方式我们称之为并发(Concurrent)。

并行

当系统有一个以上CPU时,
当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。

区别:

  • 并行是指两个或者多个事件在同一时刻发生;

  • 并发是指两个或多个事件在同一时间间隔内发生。是指在一段时间内宏观上有多个程序在同时运行,在单处理机系统中,每一时刻却仅能有一道程序执行,故微观上这些程序只能是分时地交替执行。

2.2 进程、线程的概念及其联系和区别

进程的概念

进程是表示资源分配的基本单位。它是一个执行某一个特定程序的实体,它拥有独立的地址空间、执行堆栈、文件描述符等。

线程的概念

有时被称为轻量级进程,线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位。

进程和线程的联系

  • 一个进程至少拥有一个线程——主线程,也可以拥有多个线程;一个线程必须有一个父进程。

  • 多个进程可以并发执行;一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。

进程与线程的区别:

  1. 调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位

  2. 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行

  3. 拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.

  4. 系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

2.3 阻塞、非阻塞、同步和异步的概念

同步/异步调用:

同步:
所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事。

异步:
异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。

阻塞/非阻塞:

阻塞:

是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回。

阻塞调用和同步调用实际上是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。

非阻塞:

非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

2.4 介绍linux fork实现的原理

fork相当于复制了一个进程的执行版本。以当前进程作为父进程创建出一个新的子进程,并且将父进程的所有资源拷贝给子进程,这样子进程作为父进程的一个副本存在。父子进程几乎时完全相同的,但也有不同的如父子进程pid不同。

fork后,父子进程具有相同的数据空间、代码空间、堆栈、所有的文件描述字;但相互之间互不影响。

fork函数有三个返回值

  • 该进程为父进程时,返回子进程的pid
  • 该进程为子进程时,返回0
  • fork执行失败,返回-1

那么fork函数为什么是一次调用,却返回了两次呢?

  • 当程序执行到下面的语句: pid=fork();

  • 由于在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。因此fork函数会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的。

2.5 exec函数的使用

系统调用execl执行另一个程序。调用execl并不创建新进程,所以前后的进程ID并未改变,execl只是用另一个新程序替换了当前进程的正文、数据、堆栈;

#include <unistd.h>
int execl(const char *path, const char *arg, ...);
  • path 是要执行的二进制文件或脚本的完整路径。

  • arg是要传给程序的完整参数列表,包括arg[0],一般是执行程序的名字。

  • 最后一个参数可为NULL

exec函数一共有六个,其中execve为内核级系统调用,其他(execl,execle,execlp,execv,execvp)都是调用execve的库函数。fork是分身术,exec变身术。

2.6 Linux 下五种I/O模型

  1. 阻塞I/O

    进程会一直阻塞,直到数据拷贝完成

  2. 非阻塞I/O

    非阻塞IO通过进程反复调用IO函数(多次系统调用,并马上返回);在数据拷贝的过程中,进程是阻塞的;

  3. I/O复用(select 和poll)

    可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。

    11129189-2f3c61c0a1521d11.png
    image
  4. 信号驱动I/O<

一共包括10个以上的聊天程序版本!绝对物有所值! 为感谢大家长期的支持,我将下载所需的资源分下调为2。网络聊天程序设计(可选)  实验要求 1、分析典型网络聊天应用软件(如QQ、MSN等)的实现原理,模拟设计一套网络聊天应用程序,必须实现以下功能: ①按照C/S结构分别设计服务端程序和客户端程序; ②服务端通过图形用户界面实现对服务器的控制,负责维护用户帐户和用户群,并维护用户信息、维持客户端之间的端对端通信和群聊通信、适时维护用户在线信息,并能够发送广播消息。 2、增加尽可能多的功能,用户界面友好,操作简便,代码设计遵从程序设计规范,易读性强,对关键过程和代码进行标注说明。 3、程序设计过程遵从软件工程规范,有需求分析、系统设计和详细设计过程,有相应的规范化说明文档。  实验提示 1、客户端之间的通信是通过服务器进行转发的,对于两个客户端,服务器需要创建两个套接字分别维持与客户端之间的连接。当客户端需要向另一个客户发送消息时,它首先将消息发送到服务器,由服务器根据目标用户帐户转发到目标主机。 2、群聊是采用多播技术实现的,也可以采用单播技术实现,但是服务器开销会增加。具体说来,若采用组播技术,当服务端收到来自一个客户端的消息后,向预先分配的该组组播地址转发该消息。若采用单播技术,服务端需要向该组内的所有客户端一一转发该消息。 3、广播消息通过广播方式发送由服务端创建的消息。 4、服务端根据客户的连接和断开情况,实时向其它客户端发送用户在线信息。 实验题目二:自选网络通信程序设计(可选)  实验要求 可以自选与网络通信相关的设计题目,要求如下: 1、在确定实验题目、设计内容以及设计功能指标要求后,向实验指导教师提交书面申请,由实验指导教师根据所选实验题目的难度和工作量确定立题后方能开始实验。 2、选择的实验题目必须具有一定综合性,并能够利用网络通信原理加以解决,同时需要具备一定的工作量。 3、设计的结果要求用户界面友好,操作简便,代码设计遵从程序设计规范,易读性强,对关键过程和代码进行标注说明。 4、程序设计过程遵从软件工程规范,有需求分析、系统设计和详细设计过程,有相应的规范化说明文档。 5、严禁抄袭别人成果,但可以部分借鉴。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值