下面整理下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. 【七侠传】冲刺阶段--Day6

    [七侠传]冲刺阶段--Day6 团队成员 20181221曾宇涛 20181202李祎铭 20181209沙桐 20181215薛胜瀚 20181216杨越麒 20181223何家豪 20181232 ...

  2. js基础篇--对象

    一.创建对象 对象直接量和 new Object (构造函数)与  Object.create 创建对象的区别 1.对象直接量和 new Object (构造函数)  原型都是Object 的 pro ...

  3. python基础篇 12-函数+文件读写+json练习作业

    需求: 写一个管理商品的程序,商品文件格式在a.json里面 提供商品的增删改查功能 choice = input('请输入你的选择:1.查看商品 2.新增商品 3.修改商品 4.删除商品') #1. ...

  4. 1903021126 申文骏 Java 第四周作业 Java分支语句学习

    项目 内容 课程班级博客链接 19级信计班(本) 作业要求链接 Java第四周作业 博客名称 1903021126  申文骏  Java 第四周作业 Java分支语句学习 要求 每道题要有题目,代码( ...

  5. AutoCAD2018_64bit

    「AutoCAD_2018_Simplified_...hinese_Win_64bit」https://www.aliyundrive.com/s/eiLscbxkMui 点击链接保存,或者复制本段 ...

  6. 【python】第二模块 步骤一 第二课、数据库表的相关操作

    第二课.数据库表的相关操作 一.课程介绍 1.1 课程介绍 学习目标 管理逻辑库和数据表 创建.删除.修改逻辑库和数据表 了解常用的数据类型和约束 字符串.整数.浮点数.精确数字.日期.枚举.主要约束 ...

  7. SpringIOC以及AOP注解开发

    和 XML 配置文件一样,注解本身并不能执行,注解本身仅仅只是做一个标记,具体的功能是框架检测到注解标记的位置,然后针对这个位置按照注解标记的功能来执行具体操作. 本质上:所有一切的操作都是 Java ...

  8. Spring RedisTemplate源码解读

    RedisTemplate类位于项目spring-data-redis-xxx的包org.springframework.data.redis.core下,是我们在Spring框架下操作Redis数据 ...

  9. 如何用虚拟机VMware Workstation安装CentOs-7

    因为我是先安装虚拟机的,再安装CentOs的.在此建议大家先安装CentOs-7再安装虚拟机,比较方便. 1.首先进入centos官方网站下载,网站如下:https://www.centos.org/ ...

  10. 第五天 pycharms 安装使用

    python全栈开发笔记第5天笔记pycharms使用 集成开发环境(IDE,Integratde Development Encironment ) VIM #linux下经典的文本编辑器 Emac ...