# 网络：复习题

> 原文：<https://github.com/angrave/SystemProgramming/wiki/Networking%3A-Review-Questions>

*   [Wiki w / Interactive MC Questions](http://angrave.github.io/SystemProgramming/networkingreviewquestions.html)
*   见[编码问题](#coding-questions)
*   见[简答题](#short-answer-questions)
*   参见 [MP Wearables](https://courses.engr.illinois.edu/cs241/mps/mp7/) Food For Thought 问题

## 简答题

## Q1

什么是插座？

## Q2

在端口 1000 和端口 2000 上侦听有什么特别之处？

*   端口 2000 的速度是端口 1000 的两倍
*   端口 2000 的速度是端口 1000 的两倍
*   端口 1000 需要 root 权限
*   没有

## Q3

描述 IPv4 和 IPv6 之间的一个重要区别

## Q4

你何时以及为什么要使用 ntohs？

## Q5

如果主机地址是 32 位，我最有可能使用哪种 IP 方案？ 128 位？

## Q6

哪种常见的网络协议是基于数据包的，可能无法成功传送数据？

## Q7

哪种常见协议是基于流的，如果数据包丢失会重新发送数据？

## Q8

什么是 SYN ACK ACK-SYN 握手？

## Q9

以下哪一项不是 TCP 的功能？

*   数据包重新排序
*   流量控制
*   数据包重传
*   简单的错误检测
*   加密

## Q10

什么协议使用序列号？他们的初始价值是多少？为什么？

## Q11

构建 TCP 服务器需要的最小网络调用是多少？他们的正确顺序是什么？

## Q12

构建 TCP 客户端需要的最小网络调用是多少？他们的正确顺序是什么？

## Q13

你何时会在 TCP 客户端上调用 bind？

## Q14

socket bind listen accept 的目的是什么？

## Q15

以上哪个调用可以阻塞，等待新客户端连接？

## Q16

什么是 DNS？它对你有什么用？哪个 CS241 网络电话会使用它？

## Q17

对于 getaddrinfo，如何指定服务器套接字？

## Q18

为什么 getaddrinfo 会生成网络数据包？

## Q19

哪个网络调用指定允许的积压的大小？

## Q20

哪个网络调用返回一个新的文件描述符？

## Q21

何时使用被动插座？

## Q22

epoll 什么时候比选择更好？何时选择比 epoll 更好的选择？

## Q23

`write(fd, data, 5000)`总是会发送 5000 字节的数据吗？什么时候会失败？

## Q24

网络地址转换（NAT）如何工作？

## Q25

@MCQ 假设网络在客户端和服务器之间有 20ms 的传输时间，建立 TCP 连接需要多长时间？ 20 ms 40 ms 100 ms 60 ms @ANS 3 Way Handshake @EXP @END

## Q26

HTTP 1.0 和 HTTP 1.1 之间有什么区别？如果网络传输时间为 20 毫秒，将 3 个文件从服务器传输到客户端需要多少 ms？ HTTP 1.0 和 HTTP 1.1 之间的时间差异如何？

## 编码问题

## 问 2.1

写入网络套接字可能不会发送所有字节，并且可能会因信号而中断。检查`write`的返回值以实现`write_all`，该 COD1 将使用任何剩余数据重复调用`write`。如果`write`返回-1，则立即返回-1，除非`errno`为`EINTR` - 在这种情况下重复最后一次`write`尝试。您将需要使用指针算法。

```c
// Returns -1 if write fails (unless EINTR in which case it recalls write
// Repeated calls write until all of the buffer is written.
ssize_t write_all(int fd, const char *buf, size_t nbyte) {
  ssize_t nb = write(fd, buf, nbyte);
  return nb;
}
```

## 问 2.2

实现一个侦听端口 2000 的多线程 TCP 服务器。每个线程应从客户端文件描述符中读取 128 个字节，并在关闭连接并结束线程之前将其回送给客户端。

## 问 2.3

实现侦听端口 2000 的 UDP 服务器。保留 200 字节的缓冲区。听取到达的数据包。有效数据包为 200 字节或更少，以 4 字节 0x65 0x66 0x67 0x68 开头。忽略无效的数据包。对于有效数据包，将第五个字节的值作为无符号值添加到运行总计中，并打印到目前为止的总数。如果运行总计大于 255，则退出。