面试有关TCP常问的几个问题
在面试中网络问题是一定会考察的,而TCP协议则是考察网络知识的重点。经常会被问道的问题如下:
- 请讲一下TCP协议建立连接的过程
- 请介绍TCP协议中的三次握手和四次挥手是怎么样的
- 为什么TCP协议要三次握手来确立连接,而不是两次,也不是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常问的几个问题的更多相关文章
- 大厂面试官最常问的@Configuration+@Bean(JDKConfig编程方式)
大厂面试官最常问的@Configuration+@Bean(JDKConfig编程方式) 现在大部分的Spring项目都采用了基于注解的配置,采用了@Configuration 替换标签的做法.一 ...
- Java面试官最常问的volatile关键字
在Java相关的职位面试中,很多Java面试官都喜欢考察应聘者对Java并发的了解程度,以volatile关键字为切入点,往往会问到底,Java内存模型(JMM)和Java并发编程的一些特点都会被牵扯 ...
- 害...原来阿里面试Redis最常问的是它呀
一提到Redis缓存,我们不得不了解的三个问题就是:缓存雪崩.缓存击穿和缓存穿透.这三个问题一旦发生,会导致大量的请求直接请求到数据库层.如果并发压力大,就会导致数据库崩溃.那p0级的故障是没跑了. ...
- HTML5 面试中最常问到的 10 个问题
1. HTML5 新的 DocType 和 Charset 是什么?HTML5 现在已经不是 SGML 的子集,DocType 简化为: <!doctype h ...
- 手撕面试官系列(十一):BAT面试必备之常问85题
JVM专题 (面试题+答案领取方式见侧边栏) Java 类加载过程? 描述一下 JVM 加载 Class 文件的原理机制? Java 内存分配. GC 是什么? 为什么要有 GC? 简述 Java ...
- 手撕面试官系列(十):面试必备之常问Dubbo29题+MySQL55题
Dubbo专题 (面试题+答案领取方式见侧边栏) 1.Dubbo 支持哪些协议,每种协议的应用场景,优缺点?2.Dubbo 超时时间怎样设置?3.Dubbo 有些哪些注册中心?4.Dubbo 集群的负 ...
- JAVA面试-计算机网络-TCP三次握手
学习原因 这个是面试的一个常问热点,所以务必要掌握. 通俗示例 小红是人事部门的员工,现在正在招收IT人员,小明看到招聘信息和待遇,感觉很适合自己,所以准备和小红发消息了解具体情况.而简历在本故事中代 ...
- 找工作笔试面试那些事儿(8)---常问的CC++基础题
这一部分是C/C++程序员在面试的时候会被问到的一些题目的汇总.来源于基本笔试面试书籍,可能有一部分题比较老,但是这也算是基础中的基础,就归纳归纳放上来了.大牛们看到一笑而过就好,普通人看看要是能补上 ...
- 面试常问的几个排序和查找算法,PHP实现
冒泡,快排,二分查找,都是面试常问的几个算法题目,虽然简单,但是一段时间不用的话就很容易忘记,这里我用PHP实现了一下,温故而知新. 排序 冒泡排序 每一次冒出一个最大的值 function bubb ...
随机推荐
- Docker的架构
一.Docker引擎 docker引擎是一个c/s结构的应用,主要组件见下图: Server是一个常驻进程 REST API 实现了client和server间的交互协议 CLI 实现容器和镜像的管理 ...
- 01.从0实现一个JVM语言之架构总览
00.一个JVM语言的诞生过程 文章集合以及项目展望 源码github地址 这一篇将是架构总览, 将自顶向下地叙述自制编译器的要素; 文章目录 01.从0实现一个JVM语言之架构总览 架构总览目前完成 ...
- kali 将家目录下的中文文件名修改成英文
修改vim ~/.config/user-dirs.dirs 打开`文件,删除那些中文目录 在目录下创建英文目录 重启 参考 https://elementaryos.stackexchange.co ...
- Nginx解析漏洞复现以及哥斯拉连接Webshell实践
Nginx解析漏洞复现以及哥斯拉连接Webshell实践 目录 1. 环境 2. 过程 2.1 vulhub镜像拉取 2.2 漏洞利用 2.3 webshell上传 2.4 哥斯拉Webshell连接 ...
- iPhone去除input默认样式
/*<!---->去掉苹果短的样式*/ input[type="button"], input[type="submit"], input[type ...
- Android的Proxy/Delegate Application框架
转自:http://blogs.360.cn/360mobile/2013/11/25/proxydelegate-application/#comment-77 有的时候,为了实现一些特殊需求,如界 ...
- mysql中的基础查询 练习
#进阶1:基础查询 /* 语法: select 查询列表 from 表名; 类似于:System.out.println(打印东西); 特点: 1.查询列表可以是:表中的字段.常量值.表达式.函数 2 ...
- Python内置函数作用及解析
Python内置的函数及其用法.为了方便记忆,已经有很多开发者将这些内置函数进行了如下分类: 数学运算(7个) 类型转换(24个) 序列操作(8个) 对象操作(7个) 反射操作 ...
- 上万字详解Spark Core(建议收藏)
先来一个问题,也是面试中常问的: Spark为什么会流行? 原因1:优秀的数据模型和丰富计算抽象 Spark 产生之前,已经有MapReduce这类非常成熟的计算系统存在了,并提供了高层次的API(m ...
- 深入理解Java并发框架AQS系列(三):独占锁(Exclusive Lock)
一.前言 优秀的源码就在那里 经过了前面两章的铺垫,终于要切入正题了,本章也是整个AQS的核心之一 从本章开始,我们要精读AQS源码,在欣赏它的同时也要学会质疑它.当然本文不会带着大家逐行过源码(会有 ...