下面整理下TCP握手和挥手的几个问题,参考资料小林图解计算机网络

1、什么是三次握手?

  • Client端向Server端发送SYN为1的报文段,携带一个初始序列号x,client端进入SYN_SENT状态
  • Server端收到报文段后,向Client端发送ACK为1,SYN=1的报文段,携带确认号ack为x+1,初始序列号y,Server端进入SYN_RECIVD状态
  • Client收到Server回答的报文段后,还会向Server发送一个ACK为1,携带确认号y+1的报文段,这次握手可以携带数据,Client,Server进入ESTABLISHED状态

2、 为什么不能是两次或者多次

倘若只有两次握手的话,Server端就在收到Client端的连接请求报文后就进入了ESTABLISHED状态,如果Client端发送了两个建立连接的请求,如一个旧的SYN报文由于网络问题堵塞,再发送了一个新的SYN报文,旧的SYN先送到Server端,Server没有给Client机会纠错,这样导致Server端浪费资源建立了一个错误的历史链接,只有给客户端发送消息,客户端判断是错误连接,发送RST报文来断开连接,Server端浪费了资源和数据,这是使用三次握手的主要原因,避免建立历史链接,避免资源浪费,除此之外,如果只有两次握手,只有Client端将自己的初始序列号同步到Server端,Server端不能保证自己的初始序列号被对方成功接收

总结不使用二次握手的原因就是一是避免建立历史链接造成资源浪费,二是二次握手不能保证双方初始序列号同步成功

而不使用多次连接就更简单了,完全可靠的通信协议是不存在的,经过三次握手之后,Client端和Server端已经确认了通信状况,就没必要增加握手次数了

3、Client端什么情况下会收到错误的ack,如何解决的

如果Client先发送了一个旧的SYN报文段,但是由于网络堵塞的原因,Client又发送了新的SYN报文段,这时候旧的SYN报文段送到了Server端,Server端发回一个SYN+ACK的报文段,确认号ack为旧的SYN+1,Client就收到了一个错误的ack了,这时候Client会发送一个RST为1的报文段给Server端,断开连接

4、什么是四次挥手

  • Client端向Server端发送FIN为1的报文段,携带序列号u,Client端进入FIN-WAIT-1阶段
  • Server端接收到报文段后,返回一个ACK为1,确认号为u+1的报文段,携带序列号v,Server端进入CLOSE-WAIT状态,Client收到报文段后进入FIN-WAIT-2状态,这时候TCP处于半连接状态
  • 等到Server端没有数据发送回Client端后,Server会发送一个请求断开连接的报文段,FIN-ACK为1,携带序列号w,确认号为u+1,Server端进入LAST-ACK状态
  • Client端收到报文段后,会发送一个ACK为1的报文段,携带序列号为u+1,确认号ack为w+1,进入TIME-WAIT状态,Server端收到后进入CLOSE状态,Client端等待2个最长报文生命周期时间后进入CLOSE状态

5、TCP四次挥手可以变成三次吗,能不能把第二个ack报文段放到第三次FIN报文段中一起发送?

答案是有时候是可以的,但是控制权并不在内核,而是在Server端的应用进程,如果Server端没有数据要发送,也是可以合并为一次挥手的

6、Client为什么要经过TIME-WAIT2个最长报文周期的长度才进入Close阶段?

一是因为要保证Client发给Server端的ACK报文段被成功接收,倘若最后的ACK报文段丢失了,那么Server端就会超时重新发送FIN-ACK报文段給Client端,Client就会发送ACK报文段,直到Server端收到ACK报文段,如果没有这2个最长报文生命周期等待时间直接进入Close端,那么Server一旦收不到ACK报文段,就一直处于LAST-ACK阶段,不能正常CLOSE。

TCP三次握手一二三问的更多相关文章

  1. 硬不硬你说了算!35 张图解被问千百遍的 TCP 三次握手和四次挥手面试题

    每日一句英语学习,每天进步一点点: 前言 不管面试 Java .C/C++.Python 等开发岗位, TCP 的知识点可以说是的必问的了. 任 TCP 虐我千百遍,我仍待 TCP 如初恋. 遥想小林 ...

  2. 阿里二面,面试官居然把 TCP 三次握手问的这么细致

    TCP 的三次握手和四次挥手,可以说是老生常谈的经典问题了,通常也作为各大公司常见的面试考题,具有一定的水平区分度.看似是简单的面试问题,如果你的回答不符合面试官期待的水准,有可能就直接凉凉了. 本文 ...

  3. 面试官问我TCP三次握手和四次挥手,我真的是

    候选者:面试官你好,请问面试可以开始了吗 面试官:嗯,开始吧 面试官:今天来聊聊TCP吧,TCP的各个状态还有印象吗? 候选者:还有些许印象的,要不我就来简单说下TCP的三次握手和四次挥手的流程吧 候 ...

  4. TCP三次握手四次挥手详解

    转载 http://www.cnblogs.com/zmlctt/p/3690998.html 相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需 ...

  5. TCP三次握手及四次挥手详细图解

    TCP三次握手及四次挥手详细图解 Andrew Huangbluedrum@163.com    相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不 ...

  6. TCP三次握手四次断开

    今天被问到三次握手了,当时只是脑子里有印象,却忘了一些SYN细节,手动微笑. 这么下去还怎么混...赶紧复习个... 三次握手是什么? TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双 ...

  7. TCP三次握手的过程

    三次握手 下图就是wireshark抓包工具抓获的TCP连接建立的三次握手过程: http://www.cnblogs.com/hnrainll/archive/2011/10/14/2212415. ...

  8. TCP三次握手那些事

    临近5月,春招和实习招聘逐渐进入尾声.本文主要讨论面试中经常提问的TCP连接的机制,附带一些扩展知识. 参加面试的时候,过半的面试官都会问TCP相关问题,而最常见的问题就是:讲一下TCP三次握手(四次 ...

  9. 脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手

    .引言 网络编程中TCP协议的三次握手和四次挥手的问题,在面试中是最为常见的知识点之一.很多读者都知道“三次”和“四次”,但是如果问深入一点,他们往往都无法作出准确回答. 本篇文章尝试使用动画图片的方 ...

  10. [转帖]脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手

    脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手   http://www.52im.net/thread-1729-1-1.html     1.引言 网络编程中TCP协议的三次握手和 ...

随机推荐

  1. defer和async区别

    浏览器会立即加载JS文件并执行指定的脚本,"立即"指的是在渲染该 script 标签之下的文档元素之前,也就是说不等待后续载入的文档元素,读到就加载并执行 加上async属性,加载 ...

  2. php后端遇到的问题

    1.用文件记录日志,会有并发问题

  3. scottrade 手机应用中英文翻译

    Dashboard       Watch List 自选股 MARKET & NEWS 市场 & 新闻 ALERTS 警告 MONEY MOVEMENT   BRANCH LOCAT ...

  4. 20200925--矩阵加法(奥赛一本通P93 6 多维数组)

    输入两个n行m列的矩阵A和B,输出它们的和A+B 输入: 第1行包含两个整数n和m(1<=n<=100,1<=m<=100),表示矩阵的行数和列数. 接下来n行,每行m个整数, ...

  5. 上分准备 VP Codeforces Round #762 (Div. 3) 4题ABCE

    +00:02 +00:16 +01:08   +02:07 VP 情况  4/8 ABCE ,赛时排名可以到823,什么时候我可以上个青 B 本想写个map的二分的,发现自己不会,写了个普普通通的二分 ...

  6. MyBatis面试题汇总

    1.什么是Mybatis? Mybatis是对象关系映射一个框架,它内部封装了JDBC,开发的时候只要关注SQL语句本身,可以严格控制sql的执行性能,灵活,其二可以通过XML或者注解来配置映射信息 ...

  7. 《视觉SLAM十四讲》visual studio 19 + PCL点云创建图像与现实

    SLCM真是博大精深.之前简单的学习了OpenCV,主要是是使用python语言,现在学习SLAM需要使用C++,略难,但比起SLAM本身,不值一提. <视觉SLAM十四讲>里面的环境主要 ...

  8. Linux系列(8)-添加用户并设置密码

    #添加用户[root@iZm5ehnt0e8indgne1hibuZ ~]# useradd -m linsiyu #设置用户密码[root@iZm5ehnt0e8indgne1hibuZ ~]# p ...

  9. 几个Python线程坑,和连接池的坑

    urlretrieve 没有超时,需要通过socket来设置 socket.setdefaulttimeout(10) 而且还需要为他设置连接池,所以直接改用requests来下载文件 def dow ...

  10. Visual Studio 2019 专业版许可证过期解决办法

    Visual Studio 2019 许可证过期,登录微软账户也不行,一直提示点击更新许可证,"无法下载许可证,请检查你的网络连接或代理设置" 解决方案:找到VS2019安装目录, ...