面试必备:”三次握手与四次挥手

2023-05-16

【TCP是如何建立连接与断开?如何提高可靠性?又是如何提高性能的?】

一、TCP的连接与断开

这里写图片描述
1.连接前的准备
服务端:
分配文件描述符–>绑定–>监听–>阻塞等待客户端连接。
客户端:
分配文件描述符–>发起连接请求–>阻塞等待服务器应答。
2.三次握手
第一次握手:主机A发送同步报文段(SYN)请求建立连接。

第二次握手:主机B听到连接请求,就将该连接放入内核等待队列当中,并向主机A发送针对SYN的确认ACK,同时主机B也发送自己的请求建立连接(SYN)。

第三次握手:主机A针对**主机B**SYN的确认应答ACK。

3.四次挥手
第一次挥手:当主机A发送数据完毕后,发送FIN结束报文段。

第二次挥手:主机B收到FIN报文段后,向主机A发送一个确认序号ACK(为了防止在这段时间内,对方重传FIN报文段)。

第三次挥手:主机B准备关闭连接,向主机A发送一个FIN结束报文段。

第四次挥手:主机A收到FIN结束报文段后,进入TIME_WAIT状态。并向主机B发送一个ACK表示连接彻底释放。

二、面试细节

1.为什么是三次握手?
如果是2次
①当客户端发出一个请求报文段并没有丢失,而是滞留在了某个网络节点,过了好长时间才发送到服务端,此时服务端建立连接。但是由于现在客户端并没有发出连接请求,因此不会理睬服务端的确认,而服务端以为新的连接产生,服务端的好多资源被白白浪费。
②当确认应答ACK总是丢失时,客户端以为服务端没有连接,它将会不断地重新请求连接,而服务端会连接大量的无效连接,给服务器增加维护成本,服务器很容易受到SYN洪水攻击。
如果是3次
就算客户端发送的ACK丢失,也不影响服务端,客户端不断重发,总会连接成功。三次握手相当于将安全问题抛给了客户端,对服务端影响很小。
如果是4次
3次已经很好的解决了,没有必要4次,况且4次也会造成2次握手的问题。

2.为什么是四次挥手?
TCP是面向连接的,属于全双工,断开连接是双方的事情。所以是四次。
当客户端发送FIN结束报文段时,服务端并不会立即关闭SOCKET,所以只能先发送一个ACK。因为有可能此时服务端还没有发送完报文。

3.什么是TIME_WAIT状态?
1)主动断开连接的一方,会进入TIME_WAIT状态,并没有直接进入CLOSED状态。
2)进入TIME_WAIT状态的一方,会等待2倍MSL(最大报文生存时间)的时间。

4.为什么客户端在TIME_WAIT状态必须等待2MSL时间?
重发可能丢失的ACK报文。因为客户端在收到服务端真正的关闭连接请求后,会进入TIME_WAIT状态,等待2MSL时间,相当于一个报文一来一回的时间,也就是说,如果客户端的确认应答丢失,算上这个丢失报文的时间,再加上服务端重传FIN的时间(重传后客户端重新启动2MSL计时器),2MSL的时间足够使客户端收到重传的FIN报文段。所以客户端不能立即进入CLOSED状态。
这里写图片描述

三、TCP可靠性机制。

1.检验和
典型的有CRC校验法。在要传输的k比特数据D后添加(n-k)比特冗余位。
2.序列号
通过序列号,可以去重、超时重传、数据有序到达。
3.确认应答
可以确认ACK之前的数据肯定到达了,保证了可靠性。
4.超时重传
发送的数据有可能因为网络拥堵,没有及时到达,发送端没有收到确认,就会进行重发。
接收端有可能收到许多重复文件,通过序列号可以去重。
累计到一定次数,TCP认为网络或者接收端出现异常,强制关闭连接。
5.连接管理
通过三次握手四次挥手,也可提高可靠性。
6.流量控制
接收端处理数据的速度是有限的,如果发送端发的太快,接收端缓冲区容易满,会造成丢包以及引起丢包重传。

1.接收端将自己可以接收的缓冲区大小放入报头窗口大小中,通知发送端。
2.窗口大小越大,说明网络的吞吐量越高。
3.接收端如果发现自己的缓冲区快满了,就会将自己的窗口大小调低,发送端收到后会降低自己
的发送速度。
4.如果接收端满了,将自己的窗口大小设置为零,发送不在发送数据,但是会定期发送一个窗口
大小探测数据段。

7.拥塞控制
发送数据的时候,不能刚开始就发送大量的数据,所以在不清楚网络状况的情况下,不能贸然发送大量的数据,有可能加重网络负担,TCP会使用慢启动机制,探探路,所以刚开始的时候,将拥塞窗口设为1,以后是指数增长,当达到阈值的时候,按照线性增长,到达拥塞窗口的最大值后,拥塞窗口重回1。

拥塞窗口:网络的接收能力。
慢启动机制:初始时慢,但是增长速度非常快。
慢启动阈值:当拥塞窗口超过这个阈值的时候,按照线性方式增长。
          当TCP开始启动的时候,慢启动的阈值等于窗口最大值。
          在每次超时重传时,慢启动阈值变为原来窗口最大值得一半,同时拥塞窗口设置为1。

少量的丢包:触发超时重传。
大量的丢包:我们认为是网络拥堵。
TCP通信开始后,网络吞吐量会逐渐上升,当网络拥堵,情况相反。

四、提高性能

1.滑动窗口
当每发一个段就进行一次确认,这种方式性能太差。所以我们可以一次多发送几个,然后进行确认。当收到一个ACK后,滑动窗口向后移动,继续发送第五个段的数据。操作系统为了维护这个滑动窗口,需要开辟缓冲区(记录当前哪些数据没有应答),发送了的数据才能从缓冲区中删除。
这里写图片描述

窗口大小:指无需等待确认应答而可以继续发送数据的最大值。窗口越大,网络的吞吐量越高。
2.快速重传
高速重发控制也叫做快重传。当某一报文段丢失后,发送端会一直收到丢失段的确认应答,在窗口较大时,会出现报文段丢失的情况,同一个序号的确认应答将会被重复不断的返回,如果发送端主机连续三次收到同一个确认应答(因为三次才会触发重发机制)就会将对应的数据进行重发。
这里写图片描述
3.延迟应答
假如接收端的缓冲区的大小为1M,一次收到的数据为500K,如果立刻应答,那么返回窗口就是500K,倘若接收端接收能力特别强,500K的数据早就接收完毕,那么当接收端稍微迟一点应答,它马上处理完500K的数据,那么它就可以返回窗口的大小为1M,提高了网络的吞吐量。
但是延迟应答也有数量限制和时间限制,不可能一直不应答。
4.捎带应答
可以提高效率,客户端与服务端在一发一收(互发数据),ACK可以搭顺风车。TCP的确认应答和回执数据可以通过一个包发送。

五、其他概念

1.面向字节流
专业指:不包含边界数据的连续流。
UDP的读和写需要一一匹配,对数据包不拆分,是多大,就一次发送多大。
TCP的读和写不需要一一匹配,可以一次发送几个字节(随意),这种叫做面向字节流。
2.粘包问题
虽然在传输层,这些报文是一个一个发送的,按照序号排放在缓冲区中,但对应用程序来说,是一连串连续的字节数据,像包子一样粘住了。所以我们应该明确两个包之间的边界。
1)对于定长的包,每次按固定大小来读。
2)对于变长的包,在包头位置约定一个包总长度的大小。
3)利用分隔符(保证分隔符与正文数据不起冲突)。
注:UDP不存在粘包问题。因为UDP每次发送一个完整的数据包。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试必备:”三次握手与四次挥手 的相关文章

  • PC 配置jenkins自动打包

    文章目录 一 下载jenkins运行环境二 下载jenkins三 安装 qt 5 12 2 和 VS 2017四 安装git并配置gitlab五 jenkins配置git 一 下载jenkins运行环境 java jdk 11 镜像下载地址
  • 心系Flyme

    我来自陕西省神木县 xff0c 大学我考入了陕西科技大学 xff0c 成为了一名信息与计算科学专业的学生 xff0c 希望在以后的道路中 xff0c 通过我自己的努力 xff0c 提升自己的价值 在大二大三学习编程 xff0c 希望自己可以
  • C语言的编译链接过程

    编写的一个C程序 xff08 源程序 xff09 xff0c 转换成可以在硬件上运行的程序 xff08 可执行程序 xff09 xff0c 需要进行翻译环境和运行环境 翻译环境则包括两大过程编译和链接 xff0c 经过编译和链接过程便可形成
  • 函数的调用过程(栈帧的创建和销毁)

    为了更好地认识函数的调用过程 xff0c 我们可以用反汇编代码去理解学习 一 基本概念 1 栈帧 xff08 过程活动记录 xff09 xff1a 是编译器用来实现函数调用的一种数据结构 xff0c 每个栈帧对应一个未运行完的函数 xff0
  • 树莓派pico刚买来怎么用?

    第一次使用 xff0c 首先按住主板上的白色按钮 xff0c 然后另一只手把数据线插在主板上 xff0c 直到你的电脑提示有新设备输入 xff0c 提示可以是声音 xff0c 可以是设备管理器多了一个U盘 要想得到提示 xff0c 你要打开
  • C语言动态顺序表

    顺序表是将表中的节点依次存放在计算机内存中一组地址连续的存储单元中 xff0c 表可以动态增长 xff0c 尾插元素 xff0c 尾删元素 xff0c 头插元素 xff0c 头删元素 xff0c 打印元素 xff0c 查找元素 xff0c
  • C语言笔记1

    假定程序运行环境为VC6 0 xff0c 缺省为四字节对齐 xff0c CPU xff08 32小字节序处理器 xff09 1 char x 61 34 ab0defg 34 char y 61 39 a 39 39 b 39 39 0 3
  • 【C++三大特性】继承

    如有疑问 xff0c 欢迎讨论 xff0c QQ xff1a 1140004920 一 继承的概念 1 原有的类为基类 xff0c 又称父类 xff0c 对基类进行扩展产生的新类称为派生类 xff0c 又称子类 xff0c 继承可以使代码复
  • C++实现顺序表及双向链表

    顺序表 include lt iostream gt include lt assert h gt using namespace std typedef int DataType class SeqList public 默认的构造函数
  • 二叉树

    一 二叉树 是结点的一个有限集合 xff0c 每个根结点最多只有两颗子树 xff0c 二叉树有左右之分 xff0c 子树的次序不能颠倒 二 二叉树的种类 1 满二叉树 xff1a 每个结点都有左右子树 xff0c 且叶结点都在同一层 2 完
  • 进程间通信----管道、消息队列、共享内存、信号量

    一 进程间通信 xff08 Inter Process Communication xff09 1 目的 1 数据传输 2 资源共享 3 通知事件 4 进程控制 注 xff1a 每个进程都有各自不同的用户地址空间 xff0c 进程之间要交换

随机推荐

  • 进程基本概念、进程地址空间

    强调内容今天来谈一谈进程的一些基本概念 xff0c 认识一些进程状态 xff0c 重新认识一下程序地址空间 xff08 进程地址空间 xff09 xff0c 进程调度算法 xff0c 环境变量等属性 一 进程 1 什么是进程 xff1f 程
  • 何为缓存?

    一 缓存 xff08 cache xff09 1 概念 xff1a 数据交换的缓冲区 xff08 称作Cache xff09 缓存是一块内存芯片 xff0c 具有极快的存取速率 xff0c 它是硬盘内部存储和外界接口之间的缓冲器 xff0c
  • 计算机的组成

    一 冯诺依曼系统 1 计算机硬件 由运算器 控制器 存储器 输入设备 输出设备组成 2 计算机内部采用二进制表示指令和数据 3 注 xff1a 1 输入设备 xff1a 键盘和鼠标等 2 输出设备 xff1a 显示屏 xff0c 打印机等
  • fd与FILE以及fork缓冲问题

    一 文件描述符 fd 1 文件描述符其实就是一个非负的小整数 是文件指针数组的下标 2 让我们看一看0 xff0c 1 xff0c 2 xff0c 代表什么 xff1f span class hljs preprocessor includ
  • Kali Linux使用体验简述

    在以前的版本里Kali Linux默认用户是root用户 xff0c 这样设计的目的是避免每次都要输入root密码 xff0c 而如今需要root密码的程序明显少于从前 xff0c Kali Linux也做出了相应的改革 xff0c 默认用
  • 随身WiFi410的板子刷Debian安装青龙面板+狗东脚本最详细教程

    前几天 xff0c 我发布了一个410刷入debian的教程 很多老哥可能觉得刷入debian没有什么用 xff0c 今天我就教大家如何安装青龙面板 xff0c 并且安装脚本实现自动白嫖狗东的豆子 青龙面板 43 狗东脚本 自动领豆子红包
  • inode以及软硬链接

    一 inode 使用ls l查看文件元数据 xff0c 用来描述数据属性 模式 硬链接数 文件所有组 组 大小 最后修改时间 文件名 使用stat查看 xff0c 查看文件信息 span class hljs comment Access
  • 静态库与动态库

    一 库 由于版权原因 xff0c 库函数的源代码一般是不可见的 xff0c 但在暴露的头文件中你可以看到它对外的接口 库函数简介 xff0c 使用的时候 xff0c 直接引入头文件 include lt gt 即可 二 静态库 1 概念 程
  • 【进程控制上】创建、终止、等待、程序替换

    进程的创建 终止 等待 程序替换 以及popen system与fork之间的区别 一 进程的创建 init进程将系统启动后 xff0c init将成为此后所有进程的祖先 xff0c 此后的进程都是直接或间接从init进程 复制 而来 完成
  • 【进程控制下】实现一个简易的shell

    1 shell原理 运用程序替换的原理来实现的 xff0c shell自己就是一个进程 span class hljs number 1 span 获取命令行 span class hljs number 2 span 解析命令行 span
  • VIM的基本使用

    一 VIM 1 概念 是一款文本编辑器 xff0c 和Emacs并列成为类Unix系统用户最喜欢的文本编辑器 2 优点 可以完成复杂的编辑与格式化功能 3 模式 其模式共有十二种 xff0c 基本模式有六种 span class hljs
  • 进程信号

    一 信号概念 1 一个信号产生及处理实例 1 在shell下 xff0c 启动一个进程 2 按下Ctrl 43 c xff0c 键盘输入产生一个硬件中断 3 如果CPU正在运行这个进程则代码暂停执行 xff0c CPU从用户态返回到内核态
  • 进程间关系和守护进程

    一 进程间关系 1 进程组 xff08 Process Group xff09 1 xff09 是一个或多个进程的集合 xff0c 通常 xff0c 这个集合与同一个作业相关联 xff0c 可以接受同一终端的各种信号 2 xff09 每一个
  • 多线程死锁

    一 死锁 1 xff09 提出 多线程与多进程提高了系统资源的利用率 xff0c 然而并发执行也会带来一些问题 xff0c 如死锁 2 xff09 概念 死锁是指两个或两个以上的进程在执行过程中 xff0c 由于竞争资源或者由于彼此通信而造
  • Proxy-Server

    一 摘录 二 背景 由于某些原因 xff0c 在我们国内无法访问google facebook等外国网站 xff0c 如果你想使用外网来学习 xff0c 聊天 xff0c 那么就可以使用一些翻墙代理 三 原理 1 要想翻墙 xff0c 首先
  • 【线程】概念与控制

    线程概念与控制 线程分离 一 线程的概念 1 概念 在一个程序里的一个执行流就叫做线程 xff0c 是一个进程内部的控制序列 线程是调度的基本单位 xff0c 在Linux下 xff0c 线程称为轻量级进程 2 线程与进程之间的区别 1 x
  • 使用Linux能显著降低家用电脑或服务器的功耗?

    就那我家里的电费举例子吧 xff08 心疼 xff09 xff0c 我家上个月电费比平时多了50元 xff08 你能想到50元是都少度电吧 xff1f xff09 xff0c 原因就是就我使用了一个月Linux 这么说Linux能增加电费开
  • 【线程同步与互斥】卖票问题(互斥锁)

    一 简述 1 共享变量 很多变量有时候需要在线程间共享 xff0c 可以通过数据的共享 xff0c 从而完成线程之间的交互 如果变量是只读的 xff0c 多个线程同时读取该变量不会有一致性的问题 xff0c 但是当一个线程可以修改的变量 x
  • 【网络基础】基本协议

    一 协议 1 概念 计算机与计算机之间通过网络实现通信时事先达成的一种约定 两台计算机只要遵循相同的协议就能够实现通信 网络也属于进程间通信 xff0c 公共资源是网络 xff0c 其本质是两个进程通过网络进行收发数据 2 多任务调度 操作
  • 面试必备:”三次握手与四次挥手

    TCP是如何建立连接与断开 xff1f 如何提高可靠性 xff1f 又是如何提高性能的 xff1f 一 TCP的连接与断开 1 连接前的准备 服务端 xff1a 分配文件描述符 gt 绑定 gt 监听 gt 阻塞等待客户端连接 客户端 xf