2023年打脸面试官之TCP知识点全方面梳理--边问边答

这篇具有很好参考价值的文章主要介绍了2023年打脸面试官之TCP知识点全方面梳理--边问边答。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.TCP 三次握手之为什么要三次呢?事不过三?



过程如下图:

2023年打脸面试官之TCP知识点全方面梳理--边问边答,java知识,面试题,tcp/ip,网络,php,后端,经验分享,面试

先来解释下上述的各个标志的含义

      序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。

     确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编号;因此当前报文段最后一个字节的编号+1即为确认号。

     确认ACK:占1位,仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效

     同步SYN:连接建立时用于同步序号。当SYN=1,ACK=0时表示:这是一个连接请求报文段。若同意连接,则在响应报文段中使得SYN=1,ACK=1。因此,SYN=1表示这是一个连接请求,或连接接受报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。

     终止FIN:用来释放一个连接。FIN=1表示:此报文段的发送方的数据已经发送完毕,并要求释放运输连接

     ACK、SYN和FIN这些大写的单词表示标志位,其值要么是1,要么是0;ack、seq小写的单词表示序号。

 

三次握手避免历史连接

当客户端连续发送多次建立连接的 SYN 报文,然后在网络拥堵的情况,就会发生客户端收到不正确的 ack 的情况。

具体过程如下:

       客户端先发送了 SYN(seq = 90) 报文,但是被网络阻塞了,服务端并没有收到,接着客户端又重新发送了 SYN(seq = 100) 报文,注意不是重传 SYN,重传的 SYN 的序列号是一样的。
旧 SYN 报文比最新的 SYN  报文早到达了服务端,那么此时服务端就会回一个 SYN + ACK 报文给客户端,此报文的确认号是 91(90+1)。
       客户端收到后,发行自己期望收到的确认号应该是 100+1,而不是 90 + 1,于是就会回 RST 文。
        服务端收到 RST 报文后,就会中止连接。后续最新的 SYN 抵达了服务端后,客户端与服务端就可以正常的完成三次握手了。
       上述中的旧 SYN 报文称为历史连接,TCP 使用三次握手建立连接的最主要原因就是防止历史连接初始化了连接。

       简单来说,三次握手的首要原因是为了防止旧的重复连接初始化造成混乱。

2.如果是两次握手连接,就无法阻止历史连接,那为什么 TCP 两次握手为什么无法阻止历史连接呢?

       因为在两次握手的情况下,被动发起方没有中间状态给主动发起方来阻止历史连接,导致被动发起方可能建立一个历史连接,造成资源浪费。

       两次握手的情况下,被动发起方在收到 SYN 报文后,就进入 ESTABLISHED 状态,意味着这时可以给对方发送数据给,但是主动发起方此时还没有进入 ESTABLISHED 状态,假设这次是历史连接,主动发起方判断到此次连接为历史连接,那么就会回 RST 报文来断开连接,而被动发起方在第一次握手的时候就进入 ESTABLISHED 状态,所以它可以发送数据的,但是它并不知道这个是历史连接,它只有在收到 RST 报文后,才会断开连接。

2023年打脸面试官之TCP知识点全方面梳理--边问边答,java知识,面试题,tcp/ip,网络,php,后端,经验分享,面试

 文章来源地址https://www.toymoban.com/news/detail-698190.html

两次握手无法阻止历史连接

       上面这种场景下,被动发起方在向主动发起方发送数据前,并没有阻止掉历史连接,导致被动发起方建立了一个历史连接,又白白发送了数据,妥妥地浪费了被动发起方的资源。

        因此,要解决这种现象,最好就是在被动发起方发送数据前,也就是建立连接之前,要阻止掉历史连接,这样就不会造成资源浪费,而要实现这个功能,就需要三次握手。

        客户端在 SYN_SENT 状态下,收到不正确的确认号的 syn+ack 报文会回 RST 报文。

3.TCP 三次握手中,客户端收到的第二次握手中 ack 确认号不是自己期望的,会发生什么?是直接丢弃 or 回 RST 报文?

回 RST 报文。

4.什么情况下会收到不正确的 ack(第二次握手中的 ack) 呢?

        当客户端发起多次 SYN 报文,然后网络拥堵的情况下,旧的 SYN 报文比新的 SYN 报文早抵达服务端,此时服务端就会按照收到的旧的 SYN 报文回复 syn+ack 报文,而此报文的确认号并不是客户端期望收到的,于是客户端就会回 RST 报文。

5.四次挥手

2023年打脸面试官之TCP知识点全方面梳理--边问边答,java知识,面试题,tcp/ip,网络,php,后端,经验分享,面试
        客户端发送FIN包询问服务器端是否能断开,客户端进入FIN_WAIT_1状态
        服务器端收到客户端发送的包并返回ACK包,服务器端进入CLOSE_WAIT状态
        服务器端准备好断开后,发送FIN包给客户端,服务器端进入LAST_ACK状态
        客户端收到服务器端发送的包后返回ACK包,客户端进入TIME_WAIT状态,服务器端收到包后进入CLOSED状态
        客户端状态:FIN_WAIT_1 FIN_WAIT_2 TIME_WAIT
        服务器端状态:CLOSE_WAIT LAST_ACKC LOSED

6.为什么A在TIME-WAIT状态必须等待2MSL(最大报文生存时间)的时间?


        首先保证A发送的最后一个ACK报文段能够到达B,保证A、B正常进入CLOSED状态。

        这个ACK报文段有可能丢失,使得处于LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认,B超时重传FIN+ACK报文段,A能2MSL时间内收到这个重传的FIN+ACK报文段,接着A重传一次确认,同时重启2MSL计数器,2MSL时间后A和B进入CLOSE状态,如果A在TIME-WAIT状态时接收到B的FIN+ACK报文段之后向B发出确认报文段,而不再确认B是否收到立即进入CLOSED状态,如若B并没有正常收到A 的确认报文段,则B无法正正常进入到CLOSED状态。

        其次防止“已经失效的连接请求报文段”出现在本连接中。

        A在发送完最后一个ACK报文段并经过2MSL,会使本次连接持续时间内所有产生的报文段消失,保证在下一次新连接中不会出现旧连接遗留的请求报文段。

 

到了这里,关于2023年打脸面试官之TCP知识点全方面梳理--边问边答的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【字节面试】Fail-fast知识点相关知识点

    字节面试,问到的一个小知识点,这里做一下总结,其实小编之前有一篇文章,已经对此有过涉及,不过这里知识专项针对于问题,把这个知识点拎出来说一下。 什么是Fail-fast机制? Hashmap是否拥有Fail-fast机制? ConcurrentModificationException异常原因和解决方法是什么? 哪些你常

    2024年01月22日
    浏览(45)
  • vue面试知识点

    Unsplash class 和 style 使用动态属性,使用驼峰式写法 v-if 和 v-show v-if 不渲染不满足判断条件的模块, v-show 渲染但不显示,使用场景:是否多次切换或频繁更新条件状态 keep-alive 缓存组件,使用场景:频繁切换,不需要重复渲染 v-for 中添加唯一的 key 为了高效的更新虚拟 DOM,

    2024年02月11日
    浏览(42)
  • Java 面试知识点

    基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的 语法,集合的语法,io 的语法,虚拟机方面的语法。 和都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为 true 时,整个运算结果才为 true,否

    2024年02月16日
    浏览(41)
  • 多线程面试相关知识点

    程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一

    2024年02月08日
    浏览(42)
  • java面试常见知识点

    JDK(Java Development Kit)是Java开发工具包,是整个JAVA的核心,包括了Java运行环境JRE(Java Runtime Envirnment)、一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。 JRE是运行基于Java语言编写的程序所不可缺少的运行环境。JRE中包含了JVM,runtime class libraries和Jav

    2024年02月11日
    浏览(52)
  • FPGA面试-常用知识点

    本贴记录一下自己找工作过程中顺下来的知识点,如有错误的,请不吝指出,共同进步!   a) FPGA FPGA 基于 LUT ,LUT本质上就是一个RAM,每一个LUT可以看成一个有4位地址线的16x1的RAM。这也是为什么FPGA需要外接一个rom来上电配置。 包括 CLBs , I/O 块, RAM 块和可编程连线 。 在

    2024年04月26日
    浏览(42)
  • 最全前端 HTML 面试知识点

    1.1.1 定义 超文本标记语言(英语:HyperTextMarkupLanguage,简称:HTML)是一种用于创建网页的标准标记语言 HTML元素是构建网站的基石 标记语言 (markup language ) 由无数个标记(标签、tag)组成 是对某些内容进行特殊的标记,以供其他解释器识别处理 使用标记的文本会被识别为“

    2024年02月20日
    浏览(43)
  • 面试常见知识点--树的遍历

    算法流程 : 1. 先申请一个栈,记为 stk 。 2 .然后将根节点压入 stk 中。 3 .每次从 stk 中弹出栈顶节点,记为 cur ,然后打印 cur 的值。如果 cur 的右子树不为空,将 cur 的右子树压入 stk 中。如果 cur 的左子树不为空,将 cur 的左子树压入 stk 中。不断重复次步骤直到 stk 为空循

    2024年02月01日
    浏览(42)
  • Java基础-知识点03(面试|学习)

    String 类是Java中用于表示字符串的类。在Java中,字符串是一系列字符的序列,用于表示文本数据。 String类的作用及特性 1、 创建字符串 : 可以通过字符串字面量或使用new来创建字符串对象。 2、 字符串长度 : 可以使用length()方法获取字符串的长度。 3、 字符串连接

    2024年04月15日
    浏览(54)
  • Java面试知识点(全)- Java面试基础部分一

    Java面试知识点(全)https://nanxiang.blog.csdn.net/article/details/130640392 语法基础 封装 利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联

    2024年02月05日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包