TCP

1. TCP定义

  • ⽤于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括Socket、序列号和窗⼝⼤⼩称为连接。

2. 唯一确定一个TCP连接

  • TCP 四元组可以唯⼀的确定⼀个连接

3. TCP和UDP的区别

  • 连接
  • 服务对象
  • 可靠性
  • 拥塞控制、流量控制
  • 首部开销
  • 传输方式
  • 分片不同

4. 序列号

  • 在建⽴连接时由计算机⽣成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送⼀次数据,就「累加」⼀次该「数据字节数」的⼤⼩。 ⽤来解决⽹络包乱序问题

5. 为什么客户端和服务端的lsn不同?

  • 可以避免在网络中残留的历史报文又到达,产生数据错乱
  • 保证各自的数据能够正常传输。收发是不同的

6. IP层会分片,那么为什么TCP层还要MSS呢?

  • 认识MTU和MSS

MTU:⼀个⽹络包的最⼤⻓度,以太⽹中⼀般为 1500 字节;

MSS :除去 IP 和 TCP 头部之后,⼀个⽹络包所能容纳的 TCP 数据的最⼤⻓度

  • TCP报文在IP层分片:会造成如果一个IP分片丢失,整个报文都要重传,因为没有序列号做保证。
  • 而TCP在建立连接的时候,会规定MSS值,当数据包超过该值,会自动进行分片,这样失序、丢失都只要传对应分片即可

7. 避免SYN攻击

  • 服务端会有一个SYN接收队列(半连接),SYN攻击会占满该队列,导致服务器不可用
  • 修改 Linux 内核参数 :控制队列⼤⼩和当队列满时应做什么处理。
  • 服务端应用程序过慢,处理响应慢,会造成accept队列满;全是半连接,导致accept队列空:SYN队列满了,可以不放入SYN队列,直接计算一个cookie值,返回给客户端,客户端验证了,返回可以直接放到accept队列

8. 四次挥手中,主动断开连接的一方才有TIME_WAIT状态,一般是客户端

9. 为什么TIME_WAIT 等待的时间是 2MSL?

  • MSL 是 Maximum Segment Lifetime, 报⽂最⼤⽣存时间,超过这个时间自动丢弃
  • TCP 报⽂基于是 IP 协议的,⽽ IP 头中有⼀个 TTL 字段,是 IP 数据报可以经过的最⼤路由数,每经过⼀个处理他的路由器此值就减 1,当此值为 0 则数据报将被丢弃,同时发送 ICMP 报⽂通知源主机
  • MSL 与 TTL 的区别

MSL 的单位是时间,⽽ TTL 是经过路由跳数。所以 MSL 应该要⼤于等于 TTL 消耗为 0 的时间,以确保报⽂已被⾃然消亡

  • TIME_WAIT 等待 2 倍的 MSL,⽐较合理的解释是: 就是主动断开连接放发送收到FIN后发送ACK,到收到确认包需要两个最大报文生产时间
  • 2MSL 的时间是从客户端接收到 FIN 后发送 ACK 开始计时的。如果服务端在自己周期过后认为超时,会重发 FIN 报⽂,那么 2MSL 时间将重新计时

10. 为什么需要TIME_WAIT?

  • 防止旧连接的数据包:如果客户端不等待,直接断开,迟到的数据包在新的连接中会被当成新连接数据,造成数据混乱
  • 保证连接正确关闭,确保服务端正常关闭,因为报文可能消失在网络中

11. 为什么是三次握手?不是两次,四次?

  • 原因一:避免历史连接

⾸要原因是为了防⽌旧的重复连接初始化造成混乱

异常情况:「旧 SYN 报⽂」⽐「最新的 SYN 」 报⽂早到达了服务端

如果是两次握⼿连接,就不能判断当前连接是否是历史连接

如果是历史连接(序列号过期或超时),则第三次握⼿发送的报⽂是 RST 报⽂(客户端发送),终止连接

  • 原因二:同步双⽅初始序列号

TCP 协议的通信双⽅, 都必须维护⼀个「序列号」, 序列号是可靠传输的⼀个关键因素

接收⽅可以去除重复的数据

接收⽅可以根据数据包的序列号按序接收

可以标识发送出去的数据包中, 哪些是已经被对⽅收到的

  • 原因三:避免资源浪费

如果客户端的 SYN 阻塞了,重复发送多次 SYN 报⽂,那么服务器在收到请求后就会建⽴多个冗余的⽆效链接,造成必要的资源浪费。因为服务端不知道客户端是否连接

四次握⼿其实也能够可靠的同步双⽅的初始化序号,但由于第⼆步和第三步可以优化成⼀步,所以就成了「三次握⼿」

⽽两次握⼿只保证了⼀⽅的初始序列号能被对⽅成功接收,没办法保证双⽅的初始序列号都能被确认接收

12. 为什么四次挥手?需要四次?

  • 因为三次握手的时候,没有半连接状态,第二次握手,服务端把ACK和SYN一起发送给了客户端

13. accept发生在哪一步?

  • 从三次握手角度,第二次握手表示客户端到服务端单向连接成功,而第三次握手代表两端都连接成功,此时才正式连接成功,从SYN队列取出,放到accept队列
  • 从Reactor模型中分析:

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

后端开发面试高频八股+算法 文章被收录于专栏

涵盖各大厂考官最爱问知识点,22年最新整理!

全部评论

相关推荐

04-25 19:29
已编辑
宁波大学 运营
被普调的六边形战士很高大:你我美牛孩
点赞 评论 收藏
分享
05-03 12:45
西南大学 Java
sdgfdv:你这项目写的内容太多了,说实话都是在给自己挖坑,就算简历过了,后面面试也难受
点赞 评论 收藏
分享
评论
3
8
分享

创作者周榜

更多
牛客网
牛客企业服务