1. TIME_WAIT状态后为什么要等2MSL才能返回?

确保服务端收到了客户端发送的ACK报文,如果服务端因为超时未收到ACK报文,重发FIN,TIME_WAIT状态是用来重发可能丢失的ACK报文

2. TIME_WAIT等2MSL才CLOSED会发生什么问题?

多个连接可能会导致占用大量端口号,也会使用大量的内存资源
通过调整内核参数,简短2MSL的时间来解决

3. TCP的最大连接数能达到多少

客户端的最大TCP连接数为65535
服务端的最大TCP连接数 = 客户端的IP数 客户端的port数
2**32
216 = 248
但会有以下限制:

  • 其实每个TCP连接都是一个文件描述符,可以设置系统及、用户级、进程级的最大fd数
  • 内存限制:太多的TCP连接会导致OOM

    4. 三次握手可以携带数据嘛?

    只有第三次客户端向服务端回复ACK时,可以携带应用数据

    5. 为什么TCP是三次握手?两次可以吗?四次呢?

    low答案:因为三次握手,每个端设备一收一发,保证了双发都有接受和发送的能力
    高级回答:
    TCP连接是用于保存可靠性和流量控制维护的某些状态信息,包括Socket、序列号、窗口大小。
    首先:三次握手可以避免历史连接;
    其次:三次握手可以初始序列号
    然后:可以避免不必要的资源开销。因为由于超时可能建立多个连接

    6. 序列号随机初始化有什么好处?

  1. 可以防止历史报文被下一个相同四元组的连接接收。
  2. 为了安全性,防止黑客伪造相同序列的TCP序列号

    7. 既然IP层有MTU,为什么TCP层还需要MSS

    如果没有MSS,那么切片的工作全部交予IP层。当一个IP分片丢失,那么整个IP报文都得重传。
    所以,为了达到最佳的传输效能 TCP 协议在建立连接的时候通常要协商双方的 MSS 值,当 TCP 层发现数据超过 MSS 时,则就先会进行分片,当然由它形成的 IP 包的长度也就不会大于 MTU ,自然也就不用 IP 分片
    UDP 的数据⼤⼩如果⼤于 MTU ⼤⼩,则会在 IP 层进⾏分⽚,⽬标主机收到后,在 IP 层组装完数据,接着再传给传输层,但是如果中途丢了⼀个分⽚,在实现可靠传输的 UDP 时则就需要重传所有的数据包,这样传输 效率⾮常差,所以通常 UDP 的报⽂应该⼩于 MTU。

    8. 阐述三次握手丢失时,分别会发生什么?

第三次握手:
注意,ACK 报文是不会有重传的,当 ACK 丢失了,就由对方重传对应的报文

9. TCP和HTTP的keep-alive