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 ...
随机推荐
- 《闲扯Redis一》五种数据类型之String型
一.前言 Redis 提供了5种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),理解每种数据类型的特点对于redis的开发和运维非常重要. ...
- [STL] Codeforces 69E Subsegments
Subsegments time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...
- 2020年PHP 面试问题(二)
一.什么是 CGI?什么是 FastCGI?php-fpm,FastCGI,Nginx 之间是什么关系? CGI,通用网关接口,用于WEB服务器和应用程序间的交互,定义输入输出规范,用户的请求通过WE ...
- 将Windows项目发布到Ubuntu服务器详细教程(Windows编程,Ubuntu服务器做解释器)
前期准备 (1)专业版Pycharm(社区版没有deployment功能),学生,教师可申请免费专业版,详情可看我的博客. (2)可通过SSH连接Ubuntu服务器,并且服务器安装了Python解释器 ...
- Thinking in Java学习杂记(第7章)
将一个方法调用同一个方法主体连接到一起就称为"绑定"(Binding).若在程序运行以前执行绑定,就叫做"早期绑定".而Java中绑定的所有方法都采用后期绑定技 ...
- vue组件中的style scoped中遇到的问题
在uve组件中我们我们经常需要给style添加scoped来使得当前样式只作用于当前组件的节点.添加scoped之后,实际上vue在背后做的工作是将当前组件的节点添加一个像data-v-1233这样唯 ...
- Activiti网关--排他网关
排他网关 1.什么是排他网关 排他网关(也叫异或(XOR)网关,或叫基于数据的排他网关),用来在流程中实现决策. 当流程执行到这个网关,所有分支都会判断条件是否为true,如果为 true 则执行该分 ...
- 使用 Visual Studio 开发、测试和部署 Azure Functions(二)测试,部署
1,引言 上一篇介绍了使用使用 Visual Studio 开发 "Azure Functions" 函数,此篇介绍 “Azure Functions” 的测试以及直接从 Vist ...
- G - 土耳其冰淇凌 Gym - 101194D(二分答案 + 贪心检验)
熊猫先生非常喜欢冰淇淋,尤其是冰淇淋塔.一个冰淇淋塔由K个冰淇淋球堆叠成一个塔.为了使塔稳定,下面的冰淇淋球至少要有它上面的两倍大.换句话说,如果冰淇淋球从上到下的尺寸是A0, A1, A2,···, ...
- JAVA设计模式——(2)策略模式
定义 定义一种算法,将每个算法都封装起来,并且使它们之间可以互换.是一种行为类模式. 举例 为了通俗易懂,我们拿各国的税率计算来举例子: 假设当前我们的程序只能支持计算中国和美国的税率: public ...