TCP连接与断开

前言

相信面试过的小伙伴对这个话题应该不陌生,算是面试必问了,三次握手,四次挥手,以及其中的一些衍生问题。

TCP/IP(Transmission Control protocol / Internet Protocol)-传输控制协议,当前热门流行的网络传输控制协议,作用在传输层,同时TCP协议是面向连接的,是可靠的

握手

首先是握手连接图解,

一般回答的是也是分步骤来回答的;

1、将三步具体回答出来,每一步做的是什么
2、将标志位信息解释,同时还有序列号
3、注意总结为什么需要三次

客户首先发送一个特殊的TCP报文段,服务器用另一个特殊的TCP报文段来响应. 最后客户再用第三个特殊报文段作为响应, 前两个报文段不承载 “ 有效载荷" ,也就是不包含应用层数据; 而第三个报文段可以承载有效载荷,由于在这两台主机之间发送了3个报文段,所以这种连接建立过程常被称为三次握手。

​ --《计算机网络-自顶向下方法》

  1. 三次握手建立连接(****步骤)

    1.在一开始的请求当中,先是客户端发送请求,同时将标志位SYN值为1,请求建立连接,并将seq值变为x发送

    2.服务器接收到请求之后,表示同意建立请求,将ACK置1,并将seq变为x+1,同时发送一个数据位y过去

    3.客户端收到请求确认之后,再将收到的心情返回给服务器

  2. FLAG-SYN、ACK、FIN(重点关注

    1. SYN是Synchronize Sequence Numbers用来建立连接时所发送的同步信号
    2. ACK是Acknowledgement用于对收到的数据进行确认,确认的数据由确认序列号表示
    3. FIN是finish,常常在断开连接时候来使用,表明自己不会发送数据了,要断开连接了,但在这个标志位下,是可以接收数据的
  3. 为什么需要三次?

    1. 首先是也是比较重要的目的,确认信息对等。若只有两次握手,其中被请求建立连接的一方并不能确认自己的发报能力和对方的收报能力。因为在这里没有收到反馈,相当于第三次也算是个反馈,这样两者的发报和收报都是可以保证正常与否才建立连接。

    2. 第二是防止超时,假设只有两次请求,常常会有无效的请求被当作有效的,这时会建立了脏连接,此时像B一样,确认同意了建立连接,而A并不会理会。

挥手

其次是挥手的图解,和上面一样也是有步骤和注意事项的

  1. 步骤(很经典的一个实例)

    1. 男生:我们分手吧(FIN = 1,seq = x)
    2. 女生:好的,分吧,我收拾一下就走;等我收拾完告诉你(ACk = 1, seq = y, ack = x+1)
    3. 女生:我收拾完了,分吧,滚(说完这话,女生不能拥抱男生了)(FIN =1,ACk = 1,seq = w, ack = y+1)
    4. 男生:好的,再见(双方还约定了两个月的过渡时期,才可以分别找新的对象)(Ack = 1,seq = x+1,acl = w+1)
  2. TCP连接时是同步的,但结束时是不同步的,当挥手第二次后宣告的了主动关闭方不会再主动发送数据,但仍然可以接收数据,此时处于半关闭状态。这样被动关闭方有足够的时间去处理以前没有处理完的数据,它可能还有一部分数据没发送出去需要处理,在此之后提出主动关闭连接。所以4次挥手的设计为连接双方都提供了一定的处理扫尾工作的时间,从而显的是必要的。 细比一下,这很人性化,连接不是你想关就关的,就仿佛,你说要停电就立马把电停了。这样让我处于一个窘境,提前为手机充满电的时间都没有。

  3. 关键状态的分析

    1. MSL:Maximum Segment LifeTime报文最大存活时间

    2. TIME_WAIT:在客户端最后一次发送ack报文后,就会进入这个阶段,等待2MSL之后进入closed状态;2MSL是报文在网文上生存的最长时间,在超过这个值就会被丢弃。常常面试会问道,为什么需要这个阶段?不是很浪费资源吗?

      1、可靠的终止TCP连接-确认被动关闭方能够顺利进入closed状态;常常有最后一个ack由于网络没法到达对方,和下面的2MSL问题回答相似
      2、保证让迟来的TCP报文段有足够的时间被识别并丢弃

      为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

      虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
    3. CLOSE_WAIT:发生在被动关闭方收到关闭请求,并做出第一次应答后进入的状态,该状态是在等待关闭,并且通知各个程序线程发送剩余数据,处理后事,关掉一些资源。

最后

借鉴了计算机网络书中的知识,还有码出高效的内容,有什么错误请大家及时指出,感谢阅读!!

TCP的分分合合(面试必问)的更多相关文章

  1. linux驱动工程面试必问知识点

    linux内核原理面试必问(由易到难) 简单型 1:linux中内核空间及用户空间的区别?用户空间与内核通信方式有哪些? 2:linux中内存划分及如何使用?虚拟地址及物理地址的概念及彼此之间的转化, ...

  2. 互联网公司面试必问的Redis题目

    Redis是一个非常火的非关系型数据库,火到什么程度呢?只要是一个互联网公司都会使用到.Redis相关的问题可以说是面试必问的,下面我从个人当面试官的经验,总结几个必须要掌握的知识点. 介绍:Redi ...

  3. 【面试必问】python实例方法、类方法@classmethod、静态方法@staticmethod和属性方法@property区别

    [面试必问]python实例方法.类方法@classmethod.静态方法@staticmethod和属性方法@property区别 1.#类方法@classmethod,只能访问类变量,不能访问实例 ...

  4. 互联网公司面试必问的mysql题目(下)

    这是mysql系列的下篇,上篇文章地址我附在文末. 什么是数据库索引?索引有哪几种类型?什么是最左前缀原则?索引算法有哪些?有什么区别? 索引是对数据库表中一列或多列的值进行排序的一种结构.一个非常恰 ...

  5. 互联网公司面试必问的mysql题目(上)

    又到了招聘的旺季,被要求准备些社招.校招的题库.(如果你是应届生,尤其是东北的某大学,绝对福利哦) 介绍:MySQL是一个关系型数据库管理系统,目前属于 Oracle 旗下产品.虽然单机性能比不上or ...

  6. 面试必问:JVM类加载机制详细解析

    前言 在Java面试中,简历上有写JVM(Java虚拟机)相关的东西,JVM的类加载机制基本是面试必问的知识点. 类的加载和卸载 JVM是虚拟机的一种,它的指令集语言是字节码,字节码构成的文件是cla ...

  7. 一线大厂Java面试必问的2大类Tomcat调优

    一.前言 最近整理了 Tomcat 调优这块,基本上面试必问,于是就花了点时间去搜集一下 Tomcat 调优都调了些什么,先记录一下调优手段,更多详细的原理和实现以后用到时候再来补充记录,下面就来介绍 ...

  8. python笔记39-unittest框架如何将上个接口的返回结果给下个接口适用(面试必问)

    前言 面试必问:如何将上个接口的返回结果,作为下个接口的请求入参?使用unittest框架写用例时,如何将用例a的结果,给用例b使用. unittest框架的每个用例都是独立的,测试数据共享的话,需设 ...

  9. 高级测试工程师面试必问面试基础整理——python基础(一)(首发公众号:子安之路)

    现在深圳市场行情,高级测试工程师因为都需要对编程语言有较高的要求,但是大部分又没有python笔试机试题,所以面试必问python基础,这里我整理一下python基本概念,陆续收集到面试中python ...

随机推荐

  1. windows10删除用户头像

    点击开始菜单,然后这里我们点击最上方的用户,弹出的界面,点击这里的更改帐户设置,大家如图进行操作,点击这里即可.   这里我们通过浏览可以修改自己的账户头像,问题是怎么删除这里使用过的账户头像呢?这里 ...

  2. MySQL逻辑分层介绍

    上一篇文章主要介绍了MySQL在Ubuntu18.04系统上的安装,以及安装过程中可能会遇到的一些问题的解决方案. 在这篇文章里,开始介绍MySQL数据库的逻辑分层.通过本文的介绍,可以大致了解到My ...

  3. 基于海龟编辑器python少儿编程

    Python 少儿教程 为什么要学习编程 扫地机器人.物流机器人.自动泊车系统.无人超市.3D打印.微信.支付宝等等,随着人工智能时代的到来,越来越多的岗位将被机器人所替代. 所以,学习编程的最终目的 ...

  4. Linux下MySQL的数据库安装

    centos7 + mysql5.7 tar包解压安装 先执行wget https://dev.mysql.com//Downloads/MySQL-5.7/mysql-5.7.18-linux-gl ...

  5. 最便捷的神经网络可视化工具之一--Flashtorch

    前言 几周前,我在AnitaB.org组织的Hopperx1 London上发表了演讲作为伦敦科技周的一部分. 在演讲结束后,我收到了热烈的反馈,所以我决定写一个稍微长一点的演讲版本来介绍FlashT ...

  6. 一个完整的机器学习项目在Python中的演练(二)

    大家往往会选择一本数据科学相关书籍或者完成一门在线课程来学习和掌握机器学习.但是,实际情况往往是,学完之后反而并不清楚这些技术怎样才能被用在实际的项目流程中.就像你的脑海中已经有了一块块"拼 ...

  7. 怎样设计最优的卷积神经网络架构?| NAS原理剖析

    虽然,深度学习在近几年发展迅速.但是,关于如何才能设计出最优的卷积神经网络架构这个问题仍在处于探索阶段. 其中一大部分原因是因为当前那些取得成功的神经网络的架构设计原理仍然是一个黑盒.虽然我们有着关于 ...

  8. BZOJ 4472 salesman 题解

    题目 某售货员小T要到若干城镇去推销商品,由于该地区是交通不便的山区,任意两个城镇之间都只有唯一的可能经过其它城镇的路线.小T可以准确地估计出在每个城镇停留的净收益.这些净收益可能是负数,即推销商品的 ...

  9. LVS的部署、案例、以及常见问题

    LVS的部署.案例.以及常见问题 原创chenhuyang 最后发布于2018-06-03 16:18:25 阅读数 1560 收藏 展开 一.LVS的部署 LVS现在已经集成在linux内核模块中, ...

  10. golang--安装golang并安装grpc-grpcgateway环境

    安装goland环境 下载golang安装包,国内环境打开https://studygolang.com/dl,国外环境打开https://golang.google.cn/dl/下载对应系统的安装包 ...