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-690741.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模板网!

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

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

相关文章

  • 面试被打脸,数据结构底层都不知道么--回去等通知吧

    数据结构之常见的8种数据结构: -数组Array -链表 Linked List -堆 heap -栈 stack -队列 Queue -树 Tree -散列表 Hash -图 Graph 数据结构-链表篇 Linklist定义: -是一种线性表,并不会按线性的顺序存储数据,即逻辑上相邻,物理上不一定相邻的元素。通过指针域来寻找对应的元素。 Linkli

    2024年02月10日
    浏览(31)
  • 2023面试知识点一

    默认的,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ),即:新生代 ( Young ) = 1/3 的堆空间大小。老年代 ( Old ) = 2/3 的堆空间大小。其中,新生代 ( Young ) 被细分为 Eden 和 两个 Survivor 区域,这两个 Survivor 区域分别被命名为 from 和 t

    2024年02月07日
    浏览(28)
  • 2023-JavaWeb最新整理面试题-TCP、Tomcat、Servlet、JSP等

    1、1xx(临时响应) 2、2xx(成功) 3、3xx(重定向):表示要完成请求需要进一步操作 4、4xx(错误):表示请求可能出错,妨碍了服务器的处理 5、5xx(服务器错误):表示服务器在尝试处理请求时发生内部错误 举例: 200:成功,Web服务器成功处理了客户端的请求。 301:永

    2024年02月16日
    浏览(39)
  • 【软考网络管理员】2023年软考网管初级常见知识考点(11)-TCP和UDP详解

    传输控制协议TCP是什么,三次握手的概念理解,用户数据报协议UDP是什么,软考网络管理员常考知识点,软考网络管理员网络安全,网络管理员考点汇总。 原创于:CSDN博主-《拄杖盲学轻声码》,更多考点汇总可以去他主页查看 更多考试总结可关注CSDN博主-《拄杖盲学轻声码

    2024年02月11日
    浏览(32)
  • 这套【阿里-服务端开发与面试知识手册】2023年了不会还有人没看过吧

    整篇 128362字 ,300+页的笔记涵盖**【Java体系】和【架构能力】 两大部分 包含 网络和操作系统基础、JVM、多线程、Spring、Netty主流框架 等重点知识,以及 结合实践给出各类难点问题和解决方案**等,不管你是正在学习Java还是已经工作了都是对你的技术提升有非常大的好处,不

    2024年02月05日
    浏览(49)
  • 【C/C++】结构体内存对齐 ----- 面试必考(超详细解析,小白一看就懂!!!)

    【C/C++】结构体内存对齐 ----- 面试必考(超详细解析,小白一看就懂!!!),C++,C语言超详细解析,c语言,c++,面试,linux,算法

    2024年03月09日
    浏览(36)
  • 【面试】Java高频面试题(2023最新整理)

    JDK(Java Development Kit),Java开发工具包 JRE(Java Runtime Environment),Java运行环境 JDK中包含JRE,JDK中有一个名为jre的目录,里面包含两个文件夹bin和lib,bin就是JVM,lib 就是JVM工作所需要的类库。 对于基本类型,== 比较的是值; 对于引用类型,==比较的是地址; equals不能用于基

    2023年04月08日
    浏览(36)
  • 【面试】Java高频面试题(2023最新版)

    JDK(Java Development Kit),Java开发工具包 JRE(Java Runtime Environment),Java运行环境 JDK中包含JRE,JDK中有一个名为jre的目录,里面包含两个文件夹bin和lib,bin就是JVM,lib 就是JVM工作所需要的类库。 对于基本类型,== 比较的是值; 对于引用类型,==比较的是地址; equals不能用于基

    2023年04月26日
    浏览(38)
  • java经典面试题—2023

    1、和的区别? 是位运算符,表示按位与运算,是逻辑运算符,表示逻辑与(and)。 2、final, finally, finalize的区别? final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个

    2024年02月11日
    浏览(32)
  • Java 面试题2023

    3、如何确定当前对象是个垃圾 4、GCrooot 包括哪些? 5、JVM对象头包含哪些部分 6、GC算法有哪些 7、JVM中类的加载机制 8、分代收集算法 9、JDK1.8 和 1.7做了哪些优化 10、内存泄漏和内存溢出有什么区别 11、JVM中栈上分配和内存逃逸解释 12、如何定位CPU100%占用 13、在程序中如何

    2024年02月14日
    浏览(30)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包