在面试中网络问题是一定会考察的,而TCP协议则是考察网络知识的重点。经常会被问道的问题如下:

  1. 请讲一下TCP协议建立连接的过程
  2. 请介绍TCP协议中的三次握手和四次挥手是怎么样的
  3. 为什么TCP协议要三次握手来确立连接,而不是两次,也不是4次
  4. TCP连接发起是的syn序号为什么不能从同一个序号开始,比如说1

三次握手过程

首先需要服务器监听特定的端口,等待客户端来请求连接。当客户端需要建立连接时,客户端会先向服务器发送syn报文,将报文中syn置为随机生成的序号n(这里假设序号为1000)。服务器收到同步报文后,会回复一个ack报文,把ACK位置位n+1(这里的序号应该为1001),同时设置syn为y(这里假设为2000)。客户端收到服务器发送的ack报文后,会回复一个ACK报文给服务器,其中ACK位置为y+1(这里即为2001)。当服务器收到ACK消息后,即认为连接进入稳定状态。看下图:

上图中的每一个箭头都代表着一次 TCP数据包的发送需要注意的是,

  上图中出现的 ACK = x +1 的写法很容易让人误以为数据包中的 ACK 域的数据值被填成了 y+1 。 ACK = x+1 的实际含义是:

  • TCP 包的 ACK 标志位(1 bit) 被置成了 1
  • TCP 包的确认号(acknowledgement number ) 的值为 x+1

  类似的, TCP 数据包中的 SYN 标志位, 也容易与序号(sequence number) 混淆, 这点需要读者注意

四次挥手过程

当client从app接收到关闭指令后,client会给server发送FIN消息(表明client不会再给server发送数据),client进入finish-wait-1状态。server收到finish消息后,回复确认消息ack给client,自身进入close-wait状态。client接收到ack消息后,进入到FIN-WAIT-2状态。并且在此状态等待服务器发送finish消息。当server接收到app的关闭指令后,server给client发送FIN消息。服务器进入到LAST-ACK状态。客户端收到FIN消息后,会回复ACK消息,同时进入到TIME-WAIT状态,来等待server收到ack消息,客户端会在接下来的2MSL(maximum segment lifetime)的时间内保持TIME-WAIT状态。为什么是2MSL时间呢,一是为了server有足够的时间收到ACK消息,并在消息丢失时重发。二是为了在此连接结束后的后续连接提供缓冲期。如果不是2倍MSL的话,就可能混合来自不同连接的数据包,造成消息混乱。

为什么TCP协议要三次握手来确立连接,而不是两次,也不是4次

首先呢,根本不存在可靠的连接,tcp只是提供相对可靠的连接。三次握手的主要目的是交换通信需要的参数,主要是server与client的syn序号,这个序号是用于收发数据的。如果只有两次握手的话,当服务器发送ack+syn消息后,就会认为建立了稳定连接,这个时候如果ack+syn丢失了,client并没有收到这个消息,那么客户端就会认为连接建立不成功,而直接进入close状态。这样就会造成,server一直在哪傻等,永远不会有client来发送数据,这就会造成服务器资源的浪费。至于为什么不是四次握手,是因为握手三次成功以后,就可以认定当前连接是可靠的了,不然的话还需要client与server互相之间发送ack消息,这样就无休无止了。

TCP连接发起是的syn序号为什么不能从同一个序号开始,比如说1

因为现实中的网络状况不可预知,比如说客户端在第一次连接时,使用序号为1为初始序号进行数据发送,发送了1到30的数据片段,这个时候因为网络问题断开了连接。然后客户端是syn为1重新建立了新的连接,这个时候服务器收到了之前发送的30个字节的数据,服务器就会以为这30个字节的数据是新发的,这就会导致数据混乱。

面试有关TCP常问的几个问题的更多相关文章

  1. 大厂面试官最常问的@Configuration+@Bean(JDKConfig编程方式)

    大厂面试官最常问的@Configuration+@Bean(JDKConfig编程方式)   现在大部分的Spring项目都采用了基于注解的配置,采用了@Configuration 替换标签的做法.一 ...

  2. Java面试官最常问的volatile关键字

    在Java相关的职位面试中,很多Java面试官都喜欢考察应聘者对Java并发的了解程度,以volatile关键字为切入点,往往会问到底,Java内存模型(JMM)和Java并发编程的一些特点都会被牵扯 ...

  3. 害...原来阿里面试Redis最常问的是它呀

    一提到Redis缓存,我们不得不了解的三个问题就是:缓存雪崩.缓存击穿和缓存穿透.这三个问题一旦发生,会导致大量的请求直接请求到数据库层.如果并发压力大,就会导致数据库崩溃.那p0级的故障是没跑了. ...

  4. HTML5 面试中最常问到的 10 个问题

    1. HTML5 新的 DocType 和 Charset 是什么?HTML5 现在已经不是 SGML 的子集,DocType 简化为:                  <!doctype h ...

  5. 手撕面试官系列(十一):BAT面试必备之常问85题

    JVM专题 (面试题+答案领取方式见侧边栏)  Java 类加载过程? 描述一下 JVM 加载 Class 文件的原理机制? Java 内存分配. GC 是什么? 为什么要有 GC? 简述 Java ...

  6. 手撕面试官系列(十):面试必备之常问Dubbo29题+MySQL55题

    Dubbo专题 (面试题+答案领取方式见侧边栏) 1.Dubbo 支持哪些协议,每种协议的应用场景,优缺点?2.Dubbo 超时时间怎样设置?3.Dubbo 有些哪些注册中心?4.Dubbo 集群的负 ...

  7. JAVA面试-计算机网络-TCP三次握手

    学习原因 这个是面试的一个常问热点,所以务必要掌握. 通俗示例 小红是人事部门的员工,现在正在招收IT人员,小明看到招聘信息和待遇,感觉很适合自己,所以准备和小红发消息了解具体情况.而简历在本故事中代 ...

  8. 找工作笔试面试那些事儿(8)---常问的CC++基础题

    这一部分是C/C++程序员在面试的时候会被问到的一些题目的汇总.来源于基本笔试面试书籍,可能有一部分题比较老,但是这也算是基础中的基础,就归纳归纳放上来了.大牛们看到一笑而过就好,普通人看看要是能补上 ...

  9. 面试常问的几个排序和查找算法,PHP实现

    冒泡,快排,二分查找,都是面试常问的几个算法题目,虽然简单,但是一段时间不用的话就很容易忘记,这里我用PHP实现了一下,温故而知新. 排序 冒泡排序 每一次冒出一个最大的值 function bubb ...

随机推荐

  1. JS驼峰与下划线互转

    1.下划线转驼峰 function underlineToHump(s){ var a = s.split("_"); var result = a[0]; for(var i=1 ...

  2. Ajax的基本用法

    1.介绍 2.基本用法 2.1原生写法 $.ajax({ url: url, //是否是异步请求,默认是 // async: false, //请求方式,默认是get //type:'get', // ...

  3. pwn篇:攻防世界进阶welpwn,LibcSearcher使用

    攻防世界welpwn (搬运一篇自己在CSDN写的帖子) 链接:https://blog.csdn.net/weixin_44644249/article/details/113781356 这题主要 ...

  4. 第46天学习打卡(四大函数式接口 Stream流式计算 ForkJoin 异步回调 JMM Volatile)

    小结与扩展 池的最大的大小如何去设置! 了解:IO密集型,CPU密集型:(调优)  //1.CPU密集型 几核就是几个线程 可以保持效率最高 //2.IO密集型判断你的程序中十分耗IO的线程,只要大于 ...

  5. 摄像机+LookAt矩阵+视角移动+欧拉角

    一: 摄像机 OpenGL本身没有摄像机(Camera)的概念,但我们可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机,产生一种我们在移动的感觉,而不是场景在移动. 以摄像机的视角作为场景 ...

  6. 【转载】java类加载时机与过程

    1  开门见山 以前曾经看到过一个java的面试题,当时觉得此题很简单,可是自己把代码运行起来,可是结果并不是自己想象的那样.题目如下: class SingleTon { private stati ...

  7. URL 地址解析

    //虚拟目录的路径 Response.Write("<strong>Request.ApplicationPath:</strong>" + Request ...

  8. Java流程控制:用户交互Scanner

    java.util.Scanner工具类获取用户输入语法:Scanner scanner = new Scanner(System.in);通过Scanner类的next()与nextLine()方法 ...

  9. Selenium 4.0beta:读源码学习新功能

    Selenium 4 源码分析 这一篇文章我们来分析Selenium 4 python版源码. 除非你对Selenium 3的源码烂熟于心,否则通过对比工具分析更容易看出Selenium 4更新了哪些 ...

  10. arcgis10.2 的安装与离线发布地图

    一.ArcGIS for Desktop安装 ArcGIS安装 方法/步骤1:LicenseManager安装 1.首先要下载Arcgis 10.2软件,很大大约有4个多G.下载后可以用虚拟光驱,DA ...