当前位置: 首页 > news >正文

【计算机网络—TCP相关】| 三次握手+四次挥手(面试不慌)

三次握手+四次挥手

      • 写在前面
      • 1. 三次握手
        • 1.1 作用: 为了在不可靠的信道上建立起可靠的连接;
        • 1.2 建立过程
        • 1.3 面试提问
      • 2. 四次挥手
        • 2.1 作用:为了在不可靠的网络信道中进行可靠的连接断开确认
        • 2.2 断开过程
        • 2.3 面试提问

写在前面

三次握手建立连接;四次挥手断开连接;

TCP协议里的标识:
SYNSynchronization(同步)
ACKAcknowledgment(确认)
FINFinish(结束)

1. 三次握手

1.1 作用: 为了在不可靠的信道上建立起可靠的连接;

1.2 建立过程

当客户端向服务端发起连接请求时候:

  1. 先发一包连接请求数据(SYN包)来询问能否与服务端建立连接,这包数据我们叫做SYN包:(想和你同步);
  2. 如果对端同意连接就会回复一包SYN+ACK包(确认同步);
  3. 客户端收到之后回复一包ACK包(确认)。

注:自己的序号用对方的确认号; 自己的确认号 用对方的序号+1
在这里插入图片描述

在这里插入图片描述

1.3 面试提问

问题1:为什么是三次握手而不是两次握手or四次握手
答:
目的:握手是为了确认双方的接收与发送能力是否正常

  • 第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的;

  • 第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常;

  • 第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常;

  • 如果是两次握手,服务端并不能确认客户端的接收能力是否正常;而且为了防止已经失效的请求报文,突然又传到服务器引起错误
  • 三次握手是两端建立连接的所需要的最小收发包的次数,所以四次握手就没有必要了

问题2:两次握手可能产生的问题?
答:假设采取两次握手,客户端向服务端发起一个报文SYN1,因为某些未知错误,并未到达服务器,在中间某个网络节点产生了滞留;而为了建立连接客户端会重新发送一个SYN包,我们称之为SYN2,这次正常送达服务端,并且回复SYN+ACK后建立连接;这时阻塞的网络节点突然恢复,把SYN1重新发给了服务端,服务端就会误认为是客户端发起了新的连接;

服务端认为是两个连接,客户端认为是一个连接,造成了状态不一致的问题;


2. 四次挥手

握手之后就建立连接­——连接建立好以后,客户端就可以发送http请求——然后服务端响应内容;

因为TCP协议是全双工的,所以两端都可以发送关闭请求;

2.1 作用:为了在不可靠的网络信道中进行可靠的连接断开确认

2.2 断开过程

  • 第一次挥手:客户端发送FIN+ACK(确认结束)
  • 第二次挥手:服务端回复ACK(确认)因为服务端可能还存在未发送完毕的数据所以还需要等待数据全部发送完以后回复确认结束,也就是第三次挥手;
  • 第三次挥手:服务端回复FIN+ACK(确认结束);
  • 第四次挥手:客户端回复ACK(确认);进入超时等待状态
    在这里插入图片描述

2.3 面试提问

问题1:为什么客户端在回复ACK包之后还需要等待超时时间?
答:
目的:为了在不可靠的网络信道中进行可靠的连接断开确认;

原因:因为如果客户端在发送完最后一包ACK包就释放了连接的话,一旦ACK包在网络中丢失,服务端就会一直停留在最后确认状态;若发送完最后一包ACK包,再等待一段时间,此时如果服务端没有收到ACK包,就会重发FIN包;客户端会响应这个FIN包,且重发ACK包,并刷新超时时间

相关文章:

  • c# 与modbus
  • Java Character.SubSet hashCode()方法具有什么功能呢?
  • 【办公类-06】python批量制作代班排班表
  • 【Linux】 - Linux中的重定向和管道符
  • 金额转大写查询易语言代码
  • Redis——事务,锁机制,秒杀案例 !!!!
  • ECO概念及理解
  • 金字塔思维
  • 青岛大学数据结构与算法——第4章
  • 波场与Valkyrie共同主持纳斯达克敲钟仪式 波场合规化再迎里程碑事件
  • 卷积神经网络的常用改进
  • (附源码)node.js知识分享网站 毕业设计 202038
  • css宽高自适应
  • 测试管理三要素
  • Linux Bond 以及Mode 6实验
  • 分享一款快速APP功能测试工具
  • ES6之路之模块详解
  • java概述
  • leetcode讲解--894. All Possible Full Binary Trees
  • MaxCompute访问TableStore(OTS) 数据
  • Swift 中的尾递归和蹦床
  • Vue官网教程学习过程中值得记录的一些事情
  • 阿里云应用高可用服务公测发布
  • 彻底搞懂浏览器Event-loop
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 浮动相关
  • 前端设计模式
  • 使用Gradle第一次构建Java程序
  • 网络应用优化——时延与带宽
  • 我的业余项目总结
  • 译自由幺半群
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #define,static,const,三种常量的区别
  • #图像处理
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (二)linux使用docker容器运行mysql
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (转)c++ std::pair 与 std::make
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • ..回顾17,展望18
  • .bashrc在哪里,alias妙用
  • .bat批处理(一):@echo off
  • .gitignore
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .net core开源商城系统源码,支持可视化布局小程序
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]
  • [android学习笔记]学习jni编程
  • [BUUCTF 2018]Online Tool
  • [BZOJ3223]文艺平衡树
  • [E单调栈] lc2487. 从链表中移除节点(单调栈+递归+反转链表+多思路)
  • [FUNC]判断窗口在哪一个屏幕上
  • [HNCTF 2022 WEEK2]easy_include 文件包含遇上nginx