Skip to content

39 作业题和思考题解析

这篇文章是前面习题的解析,题目来自各个大厂的笔试题和《TCP/IP》详解,还在不停的完善中,目前以有的如下:

收到 IP 数据包解析以后,它怎么知道这个分组应该投递到上层的哪一个协议(UDP 或 TCP)

解析:IP 头里有一个 "协议" 字段,指出在上层使用的协议,比如值为 6 表示数据交给 TCP、值为 17 表示数据交给 UDP


TCP 提供了一种字节流服务,而收发双方都不保持记录的边界,应用程序应该如何提供他们自己的记录标识呢?

解析:应用程序使用自己约定的规则来表示消息的边界,比如有一些使用回车 + 换行("\r\n"),比如 Redis 的通信协议(RESP protocol)


A B 两个主机之间建立了一个 TCP 连接,A 主机发给 B 主机两个 TCP 报文,大小分别是 500 和 300,第一个报文的序列号是 200,那么 B 主机接收两个报文后,返回的确认号是()

  • A、200
  • B、700
  • C、800
  • D、1000

答案:D,500+300+200


客户端的使用 ISN=2000 打开一个连接,服务器端使用 ISN=3000 打开一个连接,经过 3 次握手建立连接。连接建立起来以后,假定客户端向服务器发送一段数据 Welcome the server!(长度 20 Bytes),而服务器的回答数据 Thank you!(长度 10 Bytes),试画出三次握手和数据传输阶段报文段序列号、确认号的情况。

答案:较简单,我先偷懒不画


TCP/IP 协议中,MSS 和 MTU 分别工作在哪一层?

参考:MSS-> 传输层,MTU:链路层


在 MTU=1500 字节的以太网中,TCP 报文的最大载荷为多少字节?

参考:1500(MTU) - 20(IP 头大小) - 20(TCP 头大小)= 1460


小于()的 TCP/UDP 端口号已保留与现有服务一一对应,此数字以上的端口号可自由分配?

  • A、80
  • B、1024
  • C、8080
  • D、65525

参考:B,保留端口号


下列 TCP 端口号中不属于熟知端口号的是()

  • A、21
  • B、23
  • C、80
  • D、3210

参考:D,小于 1024 的端口号是熟知端口号


关于网络端口号,以下哪个说法是正确的()

  • A、通过 netstat 命令,可以查看进程监听端口的情况
  • B、https 协议默认端口号是 8081
  • C、ssh 默认端口号是 80
  • D、一般认为,0-80 之间的端口号为周知端口号 (Well Known Ports)

参考:A


TCP 协议三次握手建立一个连接,第二次握手的时候服务器所处的状态是()

  • A、SYN_RECV
  • B、ESTABLISHED
  • C、SYN-SENT
  • D、LAST_ACK

参考:A,收到了 SYN,发送 SYN+ACK 以后的状态,完整转换图见文章


下面关于三次握手与 connect() 函数的关系说法错误的是()

  • A、客户端发送 SYN 给服务器
  • B、服务器只发送 SYN 给客户端
  • C、客户端收到服务器回应后发送 ACK 给服务器
  • D、connect() 函数在三次握手的第二次返回

参考:B,服务端发送 SYN+ACK


HTTP 传输完成,断开进行四次挥手,第二次挥手的时候客户端所处的状态是:

  • A、CLOSE_WAIT
  • B、LAST_ACK
  • C、FIN_WAIT2
  • D、TIME_WAIT

参考:C,详细的状态切换图看文章


正常的 TCP 三次握手和四次挥手过程(客户端建连、断连)中,以下状态分别处于服务端和客户端描述正确的是

  • A、服务端:SYN-SEND,TIME-WAIT 客户端:SYN-RCVD,CLOSE-WAIT
  • B、服务端:SYN-SEND,CLOSE-WAIT 客户端:SYN-RCVD,TIME-WAIT
  • C、服务端:SYN-RCVD,CLOSE-WAIT 客户端:SYN-SEND,TIME-WAIT
  • D、服务端:SYN-RCVD,TIME-WAIT 客户端:SYN-SEND,CLOSE-WAIT

参考:C,SYN-RCVD 出现在被动打开方服务端,排除 A、B,TIME-WAIT 出现在主动断开方客户端,排除 D


下列 TCP 连接建立过程描述正确的是:

  • A、服务端收到客户端的 SYN 包后等待 2*MSL 时间后就会进入 SYN_SENT 状态
  • B、服务端收到客户端的 ACK 包后会进入 SYN_RCVD 状态
  • C、当客户端处于 ESTABLISHED 状态时,服务端可能仍然处于 SYN_RCVD 状态
  • D、服务端未收到客户端确认包,等待 2*MSL 时间后会直接关闭连接

参考:C,建连与 2*ML 没有关系,排除 A、D,服务端在收到 SYN 包且发出去 SYN+ACK 以后 进入 SYN_RCVD 状态,排除 B。如果客户端给服务端的 ACK 丢失,客户端进入 ESTABLISHED 状态时,服务端仍然处于 SYN_RCVD 状态。


TCP 连接关闭,可能有经历哪几种状态:

  • A、LISTEN
  • B、TIME-WAIT
  • C、LAST-ACK
  • D、SYN-RECEIVED

参考:B、C 参考四次挥手的内容


TCP 状态变迁中,存在 TIME_WAIT 状态,请问以下正确的描述是?

  • A、TIME_WAIT 状态可以帮助 TCP 的全双工连接可靠释放
  • B、TIME_WAIT 状态是 TCP 是三次握手过程中的状态
  • C、TIME_WAIT 状态是为了保证重新生成的 socket 不受之前延迟报文的影响
  • D、TIME_WAIT 状态是为了让旧数据包消失在网络中

参考:B 明显错误,TIME_WAIT 不是挥手阶段的状态。A、C、D 都正确


假设 MSL 是 60s,请问系统能够初始化一个新连接然后主动关闭的最大速率是多少?(忽略 1~1024 区间的端口)

  • 参考:系统可用端口号的范围:65536 - 1024 = 64512,主动关闭方会保持 TIME_WAIT 时间 2*MSL = 120s,那最大的速率是:64512 / 120 = 537.6

设 TCP 的 ssthresh(慢开始门限)的初始值为 8(单位为报文段)。当拥塞窗口上升到 12 时网络发生了超时,TCP 使用慢开始和拥塞避免。试分别求出第 1 次到第 15 次传输的各拥塞窗口大小。

  • 参考:过程如下表所示。
次数拥塞窗口描述备注
11慢开始,指数增加
22慢开始,指数增加
34慢开始,指数增加
48慢开始,指数增加
59拥塞避免,线性增加
610拥塞避免,线性增加
711拥塞避免,线性增加
812拥塞避免,线性增加ssthresh 减半变为 6,拥塞窗口降为 1
91慢开始
102慢开始
114慢开始
126拥塞避免,线性增加
137拥塞避免,线性增加
148拥塞避免,线性增加
159拥塞避免,线性增加