习题课 章阳 yangzhang@whut.edu.cn http://yzhang.org
1. 物理理地址 (MAC) 存在于 层,IP 地 址存在于 层, 可以将 IP 地址分为 和主机号 2
Segment 数据段 Packet 数据包 Frame 帧 Bit 比特 3
1. 物理理地址 (MAC) 存在于 层,IP 地 址存在于 层, 可以将 IP 地址分为 和主机号 ( 数据链路路, 网络, 网络号 ) 4
2. 要实现 网络服务的可靠性需要提供 : 超 时 重传和 分析 : 设计 一个 网络协议, 或 一种 网络服务的时候, 检错 - 超时 - 重传 - 序号, 各有什什么作 用? 5
6
2. 要实现 网络服务的可靠性需要提供 : 超 时 重传和 ( 检错, 序号 ) 7
3. 发起对等通信的应 用程序称为, 等待接收 客户通信请求的程序称为 ( 客户 / 客户端, 服务器器 ) 对等通信 (P2P,Peer-to-Peer) 8
4. 在 TCP/IP 使 用中, 的模式占有主导地位, 其动机来源于 问题 ( 客户 / 服务器器 通信汇聚点 ) 分析 : 汇聚点问题 (Rendezvous dilemma) 空间上的 : 公园 里里两 人互相寻找 时间上的 : 快慢通信节点 君 生我未 生, 我 生君已 老老, 君恨我 生迟, 我恨君 生早 9
5. 在 UNIX 系统中创建新进程, 需要调 用系统函数 fork() windows 下 CreateProcess() fork 的三种返回值,-1, 0, PID( 进程 ID) 10
6.TCP/IP 协议定义的端点地址包括 和 (IP 地址, 端 口号 ) :8080, :21 11
7. 不不保存任何状态信息的服务器器称为 服务器器, 反之则称为 服务器器 ( 无状态, 有状态 ) 分析 无状态服务器器 : 如 WEB 服务器器,HTTP 服务 有状态服务器器 : 如游戏服务器器 12
8. 是指真正的或表 面的同时计算, 一个单处理理机多 用户的计算机可以通过 机制实现表 面的同时计算, 而在多处理理机下可以实现真正的同时计算 ( 并发, 复 用 ) 13
9. TCP 提供 面向 的服务, 而 UDP 提供 的服务 ( 连接, 无连接 ) 分析 :TCP- 虚连接 ( 虚电路路 ),UDP- 尽 力力发送 14
15
判断题 : 1. 有些场合下只能使 用 UDP 协议进 行行 网络通信 提示 : 内 网 IM 通信 ;DNS 域名解析 ; VANET; 16
Copyright: wilddogbaas UDP 弱 UDP 不不 用握 手, 不不提供流控 拥塞等功能, 传输不不可靠, 因此有时更更简单有效 ( 奥卡姆剃 刀?) 随着 网络环境变好,UDP 其实也够了了?(<5% packet loss + retransmission by application layer, NDN ) UDP 协议简单, 冗余功能少, 提升空间 大 17
物联 网与 UDP 18
判断 : 2. 服务器器使 用并发处理理可以完全防 止死锁? 分析 : 产 生死锁的四个条件 : 互斥条件 : 一个资源被 一个进程使 用 请求与保持条件 : 不不放弃已获得资源 不不剥夺条件 : 不不强 行行剥夺已获得资源 循环等待条件 : 进程循环等待释放资源 19
2. 服务器器使 用并发处理理可以完全防 止死锁? 20
判断 : 3. 发起对等通信的应 用程序为服务器器 分析 : 客户端 21
判断 4. TCP/IP 标准规定了了通信双 方在什什么时间以及 用什什 么 方式交互 22
TCP/IP 包含了了什什么? IP: 在 网络层 数据传输单元和格式, 数据递交 方法和路路由 TCP: 在传输层 数据包检查 超时检测 处理理 面向连接的服务 UDP 无连接的服务 23
判断 : 5. 客户程序可以将服务器器的 IP 地址或域名说明为常量量 分析 : const string UNIV_HOMEPAGE_URL= http:// www.whut.edu.cn 24
判断 : 6. TCP 提供流量量控制和拥塞控制 分析 :TCP 有,UDP 没有 25
7. 并发的 面向连接的服务器器可以有 n 个不不同的进程 fork() 产 生相同进程 26
8. 只能在 TCP 通信时使 用 connect 系统调 用 分析 :TCP 和 UDP 均调 用 connect() 建 立连接 区 别是? 27
TCP 与 UDP 调 用 connect() 的区别 TCP 调 用 connect - 已知 UDP 调 用 connect: 只记录对 方 IP 和端 口, 只探测调 用时连接错误 UDP 不不再 用 sendto, 而直接 用 send write - 一个 已连接的 无连接 UDP 可以多次调 用 connect 用于重新连接新的 IP 和端 口,TCP 不不 行行 28
判断 9. TCP/IP 地址族可以表示为 PF_INET? 分析 : 在头 文件 netinet/in.h,berkeley 规范 PF=Protocol Family (BSD 里里 =AF) AF=Address Family AF_INET, AF_INET6, PF_INET(incl. TCP, UDP), PF_INET6 29
10. 面向连接的服务易易于编程? 分析 : 更更加复杂还是更更加简单? 需要保持连接 有额外控制开销, 如差错控制 流量量控制 保证投递 ; 按序提交 30
问答 : 1. 请给出并发的 面向连接服务器器 ( 多进程 ) 设计算 法, 图示出进程结构, 并说明这种类型的服务器器的优 缺点 31
面向连接的服务器器在多个连接之间实现并发 ( 不不是在各个请求之间 ) 主 1 创建套接字并将其绑定到所提供服务的熟知地址上 让该套接字保持为 面向连接 主 2 将该端 口设置为被动模式 主 3 反复调 用accept 以便便接收来 自客户的下 一个连接请求, 并创建新的从线程或者进程来处理理响应 从 1 由主线程传递来的连接请求开始 从 2 用该连接与客户进 行行交互; 读取请求并发回响应 从 3 关闭连接并退出 32
优点 : 一个时刻可以处理理多个请求, 性能好 缺点 : 实现复杂, 难以构建和设计 33
2. 试分析 面向连接的服务器器和 无连接的服务器器各 自 的优缺点 34
回顾 : 面向连接和 无连接 面向连接 : 是电话系统服务模式的抽象, 即每 一次 完整的数据传输都要经过建 立连接 使 用连接 终 止连接的过程 无连接 : 是邮政系统服务的抽象, 每个分组都携带 完整的 目的地址, 各分组在系统中独 立传送 35
试分析 面向连接的服务器器和 无连接的服务器器各 自的优缺点 面向连接的服务的优点 : 1. 易易于编程 2. 自动处理理分组丢失, 分组失序 3. 自动验证数据差错, 处理理连接状态 面向连接的服务的缺点 : 1. 对每个连接都有 一个单独的套接字, 耗费更更多的资源, 维护开销 大 2. 在空闲的连接上不不发送任何分组 3. 始终运 行行的服务器器会因为客户的崩溃, 导致 无 用套接字的过多 而耗尽资 源 无连接服务器器优点 : 没有资源耗尽问题 缺点 : 需要 自 己完成可靠通信问题, 必要时, 需要 一种 自适应重传的复杂技术, 需要程序员具有相当的专业知识 对于可靠通信的场合, 尽量量使 用 TCP 36
3. 将 一组 大程序分解为 一系列列的 子程序 / 过程的好处是什什么? 试分析, 在客户程序的设计实现时, 为什什么为什什么要先抽象为 connecttcp(machine, service) 和 connectudp(machine, service) 两个模块, 而这两个模块 又具有共同的底层模块 connectsock? 37
将 一组 大程序分解为 一系列列的 子程序 / 过程的好处是什什么? 一个模块化的程序 比 一个等价的单个程序容易易理理解 排错和修改 如果程序员认真的设计了了过程, 还可以在其他程序中重新使 用这些过程 另外, 仔细选择过程可以使程序更更容易易移植 过程通过将细节隐藏起来, 提 高了了程序员所 用语 言的级别 构造客户和服务器器的时候, 使 用 网络服务的程序包括了了 一 大堆枯燥的细节,( 如端点地址等 ) 使 用过程来隐藏细节将减少出错的机会 使 用过程 ( 以及它所提供的较 高级的的操作 ) 可以避免重复, 使 用者可以在许多程序中使 用他们, 不不需要再考虑实现的细节 38
试分析, 在客户程序的设计实现时, 为什什么为什什么要先抽象为 connecttcp(machine, service) 和 connectudp(machine, service) 两个模块, 而这两个模块 又具有共同的底层模块 connectsock? 多数代码需要分配套接字 绑定地址并构成 网络连接, 这些重复出现因 而可以重 用 ;TCP/IP 网络是异种 网互联, 代码需要运 行行在不不同机器器的体系结构上, 因 而便便于移植 客户端应 用程序请求服务只能通过传输层, 而传输层有两种协议 TCP 和 UDP, 因此抽象的时候可分为两种情况 连接需要指明服务器器的 IP 地址和服务类型 ( 端 口号 ) 客户端采 用 TCP 和 UDP 共同的步骤都是获得套接字 ID, 因此可以考虑将获得套接字 ID 的过程合并, 仅仅采 用参数来标明到底采 用何种传输层协议 同时仍然需要传递的参数为服务器器的 IP 地址和服务类型 ( 端 口号 ), 所以将底层共 用 一个过程 connectsock 39
4. 在 I/O 复 用模型的关键是熟练掌握 select 函数, 该 函数的原型是 int select(int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout); 1 请详细解释 select 函数的参数的意义, 以及执 行行结 果 2 如何利利 用 select 函数构造 一个最简单的多协议服务器器, 同时提供 TCP 和 UDP 服务? 画出进程结构图 40
int select(int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout); select 函数功能 : 非阻塞 ( 与 recv,recvfrom 区别 ) 对套接 口集合扫描 (fd 文件描述字 file descriptor) 若扫描有消息, 则阻塞处理理, 反之则返回 41
int select(int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout); maxfd 参数是所以监视的描述字中最 大的描述字加 1 中间三个参数分别表示监视的不不同条件的描述字集合 : readset 为读描述字集合,writeset 为写描述字集合, execptset 为异常描述字集合 timeout 参数为 select 函数最 长等待时间 42
int select(int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout); Select 函数有三种执 行行情况 : 永远等待下去 : 仅在有 一个或以上描述字准备好 i/o 才返 回, 为此, 我们将 timeout 设置为空指针 等待固定时间 : 在有 一个描述字准备好时返回, 但不不超过 由 timeout 参数指定的秒数和微秒数 根本不不等待, 检查描述字后 立即返回, 这称为轮询 这种情况下,timeout 必须指向结构 timeval, 且定时器器的值必须为 0 43
int select(int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout); select 执 行行结果 ( 返回值 ) 如果在指定超时值到达之前有 一个或多个描述字满 足 条件, 则函数返回值 大于零 ; 如果超时时间到时, 没有描述字满 足条件, 函数返回 值为 0; 如果 select 函数阻塞过程中, 发 生错误, 函数返回值 为 -1; 44
如何利利 用 select 函数构造 一个最简单的多协议服务器器, 同 时提供 TCP 和 UDP 服务? 画出进程结构图 要点 : 多协议服务器器可以由 一个执 行行线程构成, 该线程既可以在 TCP 也可以在 UDP 上使 用异步 IO 来处理理通信 服务器器最初打开两个套接字, 一个使 用 无连接的传输, 一个使 用 面向连接的传输, 使 用异步 IO 等待两个套接字之 一就绪 45