TCP的分分合合(面试必问)
TCP连接与断开
前言
相信面试过的小伙伴对这个话题应该不陌生,算是面试必问了,三次握手,四次挥手,以及其中的一些衍生问题。
TCP/IP(Transmission Control protocol / Internet Protocol)-传输控制协议,当前热门流行的网络传输控制协议,作用在传输层,同时TCP协议是面向连接的,是可靠的;


握手
首先是握手连接图解,

一般回答的是也是分步骤来回答的;
1、将三步具体回答出来,每一步做的是什么
2、将标志位信息解释,同时还有序列号
3、注意总结为什么需要三次
客户首先发送一个特殊的TCP报文段,服务器用另一个特殊的TCP报文段来响应. 最后客户再用第三个特殊报文段作为响应, 前两个报文段不承载 “ 有效载荷" ,也就是不包含应用层数据; 而第三个报文段可以承载有效载荷,由于在这两台主机之间发送了3个报文段,所以这种连接建立过程常被称为三次握手。
--《计算机网络-自顶向下方法》
三次握手建立连接(****步骤)
1.在一开始的请求当中,先是客户端发送请求,同时将标志位SYN值为1,请求建立连接,并将seq值变为x发送
2.服务器接收到请求之后,表示同意建立请求,将ACK置1,并将seq变为x+1,同时发送一个数据位y过去
3.客户端收到请求确认之后,再将收到的心情返回给服务器FLAG-SYN、ACK、FIN(重点关注)
- SYN是Synchronize Sequence Numbers用来建立连接时所发送的同步信号
- ACK是Acknowledgement用于对收到的数据进行确认,确认的数据由确认序列号表示
- FIN是finish,常常在断开连接时候来使用,表明自己不会发送数据了,要断开连接了,但在这个标志位下,是可以接收数据的
为什么需要三次?
首先是也是比较重要的目的,确认信息对等。若只有两次握手,其中被请求建立连接的一方并不能确认自己的发报能力和对方的收报能力。因为在这里没有收到反馈,相当于第三次也算是个反馈,这样两者的发报和收报都是可以保证正常与否才建立连接。
第二是防止超时,假设只有两次请求,常常会有无效的请求被当作有效的,这时会建立了脏连接,此时像B一样,确认同意了建立连接,而A并不会理会。

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

步骤(很经典的一个实例)
- 男生:我们分手吧(FIN = 1,seq = x)
- 女生:好的,分吧,我收拾一下就走;等我收拾完告诉你(ACk = 1, seq = y, ack = x+1)
- 女生:我收拾完了,分吧,滚(说完这话,女生不能拥抱男生了)(FIN =1,ACk = 1,seq = w, ack = y+1)
- 男生:好的,再见(双方还约定了两个月的过渡时期,才可以分别找新的对象)(Ack = 1,seq = x+1,acl = w+1)
TCP连接时是同步的,但结束时是不同步的,当挥手第二次后宣告的了主动关闭方不会再主动发送数据,但仍然可以接收数据,此时处于半关闭状态。这样被动关闭方有足够的时间去处理以前没有处理完的数据,它可能还有一部分数据没发送出去需要处理,在此之后提出主动关闭连接。所以4次挥手的设计为连接双方都提供了一定的处理扫尾工作的时间,从而显的是必要的。 细比一下,这很人性化,连接不是你想关就关的,就仿佛,你说要停电就立马把电停了。这样让我处于一个窘境,提前为手机充满电的时间都没有。
关键状态的分析
MSL:Maximum Segment LifeTime报文最大存活时间
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连接。
CLOSE_WAIT:发生在被动关闭方收到关闭请求,并做出第一次应答后进入的状态,该状态是在等待关闭,并且通知各个程序线程发送剩余数据,处理后事,关掉一些资源。
最后
借鉴了计算机网络书中的知识,还有码出高效的内容,有什么错误请大家及时指出,感谢阅读!!
TCP的分分合合(面试必问)的更多相关文章
- linux驱动工程面试必问知识点
linux内核原理面试必问(由易到难) 简单型 1:linux中内核空间及用户空间的区别?用户空间与内核通信方式有哪些? 2:linux中内存划分及如何使用?虚拟地址及物理地址的概念及彼此之间的转化, ...
- 互联网公司面试必问的Redis题目
Redis是一个非常火的非关系型数据库,火到什么程度呢?只要是一个互联网公司都会使用到.Redis相关的问题可以说是面试必问的,下面我从个人当面试官的经验,总结几个必须要掌握的知识点. 介绍:Redi ...
- 【面试必问】python实例方法、类方法@classmethod、静态方法@staticmethod和属性方法@property区别
[面试必问]python实例方法.类方法@classmethod.静态方法@staticmethod和属性方法@property区别 1.#类方法@classmethod,只能访问类变量,不能访问实例 ...
- 互联网公司面试必问的mysql题目(下)
这是mysql系列的下篇,上篇文章地址我附在文末. 什么是数据库索引?索引有哪几种类型?什么是最左前缀原则?索引算法有哪些?有什么区别? 索引是对数据库表中一列或多列的值进行排序的一种结构.一个非常恰 ...
- 互联网公司面试必问的mysql题目(上)
又到了招聘的旺季,被要求准备些社招.校招的题库.(如果你是应届生,尤其是东北的某大学,绝对福利哦) 介绍:MySQL是一个关系型数据库管理系统,目前属于 Oracle 旗下产品.虽然单机性能比不上or ...
- 面试必问:JVM类加载机制详细解析
前言 在Java面试中,简历上有写JVM(Java虚拟机)相关的东西,JVM的类加载机制基本是面试必问的知识点. 类的加载和卸载 JVM是虚拟机的一种,它的指令集语言是字节码,字节码构成的文件是cla ...
- 一线大厂Java面试必问的2大类Tomcat调优
一.前言 最近整理了 Tomcat 调优这块,基本上面试必问,于是就花了点时间去搜集一下 Tomcat 调优都调了些什么,先记录一下调优手段,更多详细的原理和实现以后用到时候再来补充记录,下面就来介绍 ...
- python笔记39-unittest框架如何将上个接口的返回结果给下个接口适用(面试必问)
前言 面试必问:如何将上个接口的返回结果,作为下个接口的请求入参?使用unittest框架写用例时,如何将用例a的结果,给用例b使用. unittest框架的每个用例都是独立的,测试数据共享的话,需设 ...
- 高级测试工程师面试必问面试基础整理——python基础(一)(首发公众号:子安之路)
现在深圳市场行情,高级测试工程师因为都需要对编程语言有较高的要求,但是大部分又没有python笔试机试题,所以面试必问python基础,这里我整理一下python基本概念,陆续收集到面试中python ...
随机推荐
- MySQL学习(4)
一 视图 预先定义一种对应关系,如:temp_table <-----> select * from class where student_id >10,那么这种对应关系叫做视图. ...
- vue 2
目录 复习 今日 指令 条件指令 循环指令 评论案例 解决插值表达式符号冲突 总结 组件 局部组件 全局组件 组件间的交互:父传子 组件间的交互:子传父 复习 """ 1 ...
- 动态规划-TSP问题-最短超级串
2020-03-03 22:55:08 问题描述: 给定一个字符串数组 A,找到以 A 中每个字符串作为子字符串的最短字符串. 我们可以假设 A 中没有字符串是 A 中另一个字符串的子字符串. 示例 ...
- [单调栈]小A的柱状图
链接:https://ac.nowcoder.com/acm/problem/23619来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...
- RDD的Cache、Persist、Checkpoint的区别和StorageLevel存储级别划分
为了增强容错性和高可用,避免上游RDD被重复计算的大量时间开销,Spark RDD设计了包含多种存储级别的缓存和持久化机制,主要有三个概念:Cache.Persist.Checkout. 1.存储级别 ...
- 装numpy 环境:python3.4+ windows7 +64位系统
机器学习实战python 因为图像处理的原因,初步学习机器学习,选用语言python,参考书籍<机器学习实战> 环境:python3.4+ windows7 +64位系统 首先,今天解决的 ...
- 科普 | 生成对抗网络(GAN)的发展史
来源:https://en.wikipedia.org/wiki/Edmond_de_Belamy 五年前,Generative Adversarial Networks(GANs)在深度学习领域掀起 ...
- SpringCloud服务的注册发现--------Eureka实现高可用
1,Eureka作为注册中心,掌管者服务治理的功能,十分重要,如果注册中心的服务一旦宕机,所有的服务就会挂了,为此,实现注册中心的集群(高可用)就显得十分必要了 2,Eureka 搭建集群 实现原理就 ...
- 思考设计SQL优化方案
一.优化的哲学 注:优化有风险,涉足需谨慎 1.优化可能带来的问题? 优化不总是对一个单纯的环境进行,还很可能是一个复杂的已投产的系统: 优化手段本来就有很大的风险,只不过你没能力意识到和预见到: 任 ...
- 一夜搞懂 | JVM 字节码执行引擎
前言 本文已经收录到我的 Github 个人博客,欢迎大佬们光临寒舍: 我的 GIthub 博客 学习导图 一.为什么要学习字节码执行引擎? 代码编译的结果从本地机器码转变为字节码,是存储格式发展的一 ...