详解TCP的三次握手和四次挥手

文章目录

      • 1. TCP报文的头部结构
      • 2. 三次握手的原理与过程
        • 三次握手
        • 连接建立过程解析
      • 3. 四次挥手的原理与过程
        • 四次挥手
        • 连接关闭过程的解析
      • 4. 常见面试题


深入理解TCP连接:三次握手和四次挥手

在网络通信中,TCP(传输控制协议)扮演着重要的角色。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,它在发送数据前,通信双方必须在彼此间建立一条连接。本文将深入探讨TCP连接的建立和断开过程,着重关注三次握手和四次挥手的原理和过程。

1. TCP报文的头部结构

在了解TCP连接之前,先来了解一下TCP报文的头部结构。TCP报文头部包含了多个字段,其中包括序号、确认序号、标志位等。这些字段在TCP连接的建立和断开过程中起着重要作用。
在这里插入图片描述

  • 序号(Seq Number):占32位,用于标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
  • 确认序号(Ack Number):占32位,只有ACK标志位为1时,确认序号字段才有效。确认序号通常等于对方发送的序号加一,表示已经成功接收到了这个序号之前的所有数据。
  • 标志位:共6个,包括:
    • ACK:确认序号有效。
    • FIN:释放一个连接。
    • PSH:接收方应该尽快将这个报文交给应用层。
    • RST:重置连接。
    • SYN:发起一个新连接。
    • URG:紧急指针(urgent pointer)有效。

2. 三次握手的原理与过程

三次握手的本质是确认通信双方收发数据的能力首先,我让信使运输一份信件给对方,对方收到了,那么他就知道了我的发件能力和他的收件能力是可以的。一个TCP连接由一个4元组构成,分别是两个IP地址和两个端口号。TCP连接通常分为三个阶段:连接、数据传输、退出(关闭)。连接阶段通过三次握手建立,退出阶段通过四次挥手来关闭。

三次握手

举个栗子先吧

想象一下,有两位朋友,小明和小红,他们之间需要通过写信来进行交流。这个过程就像是建立TCP连接的三次握手。

  1. 第一次握手:小明发出邀请

    小明向小红写了一封信,表达了与她建立联系的意愿,并附上了自己的联系方式。这相当于客户端向服务器发送连接请求报文,带有一个序列号和请求信息,并携带了 SYN 标志。

  2. 第二次握手:小红确认邀

    小红收到了小明的信后,理解了他想要与她通信的意图,并写了回信给小明,确认了自己的联系方式,并附上了自己的联系方式。这封回信相当于服务器对客户端的回应,其中包含了确认信息和服务器的序列号,并带有 SYN 和 ACK 标志。

  3. 第三次握手:小明回复确认

    小明收到了小红的回信后,确认了小红的联系方式,并回复了一封信给小红,表明自己已经收到了小红的回信,并准备好开始正式的通信。这封回复信相当于客户端对服务器的确认,其中包含了确认信息,并带有 ACK 标志。

通过这样的三次交流,小明和小红建立了可靠的通信连接,并可以开始进行进一步的交流。

连接建立过程解析

img

在TCP连接建立的过程中,这三次握手实际上包含了以下步骤:

  1. 第一次握手:客户端发送连接请求

    客户端向服务器发送一个带有SYN标志的连接请求报文,其中包含了一个随机生成的序列号。

  2. 第二次握手:服务器确认连接请求

    服务器收到连接请求后,发送一个带有SYN和ACK标志的确认报文,其中包含了确认号(客户端序列号+1)和服务器自己的随机生成的序列号。

  3. 第三次握手:客户端确认连接

    客户端收到服务器的确认后,发送一个带有ACK标志的确认报文,其中包含了确认号(服务器序列号+1)。

通过这三次握手,客户端和服务器建立了可靠的通信连接,可以开始进行数据传输。

3. 四次挥手的原理与过程

在TCP(Transmission Control Protocol)连接中,四次挥手是用于关闭连接的过程。尽管这个过程相对于三次握手来说更为复杂,但通过详细的解析,我们可以更好地理解其中的每个步骤和顺序。

四次挥手

为了更好地理解TCP四次挥手的过程,我们可以用一个简单的比喻来解释:

想象一下,有两位朋友,小明和小红,他们之间通过书信往来进行交流。这个过程就像是TCP连接的四次挥手。

  1. 第一次挥手:小明发出告别

    当小明觉得与小红的交流结束时,他首先向小红发送一封告别信,表明自己不再需要继续通信。这封信中包含了一个**FIN**标志位,表示告知对方已经不会再发送数据了,以及一个序列号,表示最后一个已发送的数据的序列号。

  2. 第二次挥手:小红确认告别

    小红收到了小明的告别信后,确认了小明不再需要继续通信,并向小明回复了一封确认信,表示自己已经知道了小明的意图。这封确认信中包含了一个**ACK**标志位和一个确认号,确认了小明的序列号,并且也包含了小红自己的序列号。

  3. 第三次挥手:小红告别

    小红在确认了小明的告别后,也觉得不再需要继续通信,于是她向小明发送了一封告别信,表示自己不会再发送数据了。这封信中包含了一个**FIN**标志位和一个序列号,表示告知小明自己不会再发送数据了。

  4. 第四次挥手:小明确认告别

    小明收到小红的告别信后,确认了小红的意图,并向小红回复了一封确认信,表示自己已经知道了小红不再发送数据的意图。这封确认信中包含了一个**ACK**标志位和一个确认号,确认了小红的序列号,并且表示自己不会再发送数据了。

通过这四次挥手,小明和小红完成了通信的结束,彼此知道对方不再发送数据,并且关闭了连接。

连接关闭过程的解析

img

接下来,我们来详细分析每个步骤中的具体内容和顺序:

  1. 第一次挥手:客户端发送连接释放报文

    客户端在确定不再发送数据后,向服务器发送一个带有**FIN**标志的连接释放报文,其中包含了一个序列号,表示客户端最后一个已发送的数据的序列号。

  2. 第二次挥手:服务器确认连接释放报文

    服务器收到客户端发送的连接释放报文后,回复一个带有**ACK**和确认号的确认报文,表示已经收到了客户端的连接释放请求,并且确认了客户端的序列号。

  3. 第三次挥手:服务器发送连接释放报文

    服务器在确定不再发送数据后,向客户端发送一个带有**FIN**标志的连接释放报文,其中包含了一个序列号,表示服务器最后一个已发送的数据的序列号。

  4. 第四次挥手:客户端确认连接释放报文

    客户端收到服务器发送的连接释放报文后,回复一个带有**ACK**和确认号的确认报文,表示已经收到了服务器的连接释放请求,并且确认了服务器的序列号。

通过这四次挥手,客户端和服务器完成了连接的关闭,彼此确认不再发送数据,并且释放了连接资源。

4. 常见面试题

为什么TCP连接的时候是3次?2次不可以吗?

  • 因为需要考虑连接时丢包的问题,如果只握手2次,第二次握手时如果服务端发给客户端的确认报文段丢失,此时服务端已经准备好了收发数(可以理解服务端已经连接成功)据,而客户端一直没收到服务端的确认报文,所以客户端就不知道服务端是否已经准备好了(可以理解为客户端未连接成功),这种情况下客户端不会给服务端发数据,也会忽略服务端发过来的数据。如果是三次握手,即便发生丢包也不会有问题,比如如果第三次握手客户端发的确认ack报文丢失,服务端在一段时间内没有收到确认ack报文的话就会重新进行第二次握手,也就是服务端会重发SYN报文段,客户端收到重发的报文段后会再次给服务端发送确认ack报文。

为什么TCP连接的时候是3次,关闭的时候却是4次?

  • 因为只有在客户端和服务端都没有数据要发送的时候才能断开TCP。而客户端发出FIN报文时只能保证客户端没有数据发了,服务端还有没有数据发客户端是不知道的。而服务端收到客户端的FIN报文后只能先回复客户端一个确认报文来告诉客户端我服务端已经收到你的FIN报文了,但我服务端还有一些数据没发完,等这些数据发完了服务端才能给客户端发FIN报文(所以不能一次性将确认报文和FIN报文发给客户端,就是这里多出来了一次)。

为什么客户端发出第四次挥手的确认报文后要等2MSL的时间才能释放TCP连接?

  • 这里同样是要考虑丢包的问题,如果第四次挥手的报文丢失,服务端没收到确认ack报文就会重发第三次挥手的报文,这样报文一去一回最长时间就是2MSL,所以需要等这么长时间来确认服务端确实已经收到了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/779363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux-进程控制

🌎进程控制【上】 文章目录: 进程控制 为什么要有地址空间和页表 程序的内存       程序申请内存使用问题 写时拷贝与缺页中断 父子进程代码共享       为什么需要写时拷贝       页表的权限位       缺页中断 退出码和错误码…

WindowManager工具类

WindowManager提供三个方法&#xff1a; addView()、updateLayout()、removeView()。分别对应是添加view、更新view、移除view。 <!--悬浮窗权限--><uses-permission android:name"android.permission.SYSTEM_ALERT_WINDOW"/> WindowManagerUtil pack…

【ENSP】交换机和交换机之间实现静态路由

1.概念 三层交换机只能在Vlanif逻辑口配置iP地址 2.实现方法 交换机允许对应vlan通行&#xff0c;配置vlanif的ip地址&#xff0c;做静态路由 3.静态路由配置方法 ip route-static 目的网段 子网掩码 下一跳设备 LSW1三层交换机配置 u t m sys vlan batch 10 20 …

JavaEE初阶之线程状态

题外话 今天连更两篇 正题 线程的六种状态及含义 1.NEW 安排了工作,还未开始行动 只是创建了Tread对象和要完成的代码,但并没有启动线程 2.RUNNABLE 可工作的.又可以分成正在工作中和即将开始工作 正在执行线程中 3.BLOCKED:这几个都表示排队等着其他事情 4.WAITING:这…

HarmonyOS 应用开发之UIAbility组件生命周期

概述 当用户打开、切换和返回到对应应用时&#xff0c;应用中的UIAbility实例会在其生命周期的不同状态之间转换。UIAbility类提供了一系列回调&#xff0c;通过这些回调可以知道当前UIAbility实例的某个状态发生改变&#xff0c;会经过UIAbility实例的创建和销毁&#xff0c;…

每日一题:C语言经典例题之鸡兔同笼

题目描述 鸡兔同笼&#xff0c;共有n个头&#xff0c;m条腿&#xff0c;求鸡和兔子各有多少只。 输入 输入头数和腿数。 输出 鸡和兔子的只数。 样例输入 35 94 样例输出 23 12 代码&#xff1a; #include <stdio.h> int main() {int n, m,x,y;scanf("%d %d"…

LeetCode_1.两数之和

一、题目描述 二、方法 1.方法1&#xff08;暴力枚举法&#xff09; 利用两个for循环&#xff0c;对数组进行逐一的遍历&#xff0c;直到找到两个数的和为目标值时返回这两个数的下标。以下为c实现的完整代码。 # include<iostream> using namespace std; #include<…

【Linux】nmcli命令详解(文末送书)

目录 一、概述 二、常用参数使用 2.1 nmcli networking 1.显示NM是否接管网络 2.查看网络连接状态 3.开/关网络连接 2.2 general ​编辑 1.显示系统网络状态 2.显示主机名 3.更改主机名 2.3 nmcli connection ​编辑1.显示所有网络连接 2.显示某个网卡的详细信息…

Linux文件IO(2):使用标准IO进行文件的打开、关闭、读写、流定位等相关操作

目录 前言 文件的打开和关闭的概念 文件的打开 文件的打开函数 文件打开的模式 文件的关闭 文件的关闭函数 注意事项 字符的输入&#xff08;读单个字符&#xff09; 字符输入的函数 注意事项 字符的输出&#xff08;写单个字符&#xff09; 字符输出的函数 注意…

探索海外应用加速的作用与优势

随着互联网的快速发展&#xff0c;海外应用加速作为一种提高网络连接速度和性能的技术手段越来越受到关注。那么&#xff0c;海外应用加速究竟有什么作用呢&#xff1f;以下是这种加速技术的主要作用&#xff1a; 降低延迟&#xff1a; 海外应用加速在降低数据传输延迟方面发挥…

Android 动态申请允许访问所有文件权限、动态申请允许应用安装

目录 动态申请允许访问所有文件权限动态申请允许应用安装 动态申请允许访问所有文件权限 在Android平台上&#xff0c;如果你想要动态申请访问所有文件的权限&#xff0c;你需要使用ActivityCompat.requestPermissions方法来请求Manifest.permission.READ_EXTERNAL_STORAGE权限…

项目模块—实现抑郁测评(小程序)

script <script setup> import { ref } from "vue";//控制轮播图页码 let current ref(0);//答题逻辑 const add (value) > {if (current.value < 9) {current.value current.value 1;} else {uni.switchTab({url: "/pages/my/my",});} }…

双端队列deque和vector以及list的优缺点比较

参考:https://blog.csdn.net/TWRenHao/article/details/123483085 一、vector vector具体用法详情点这里 优点&#xff1a; 支持随机访问 CPU高速环缓存命中率很高 缺点&#xff1a; 空间不够&#xff0c;便需要增容。而增容代价很大&#xff0c;还存在一定的空间浪费。 头部…

redis在docker安装并启动流程

1、启动server docker run -d -p 6379:6379 --name redis01 redis:7.2.4以上命令&#xff0c;每次启动新的Redis容器&#xff0c;数据会丢失。 我们需要挂载数据文件&#xff0c;在宿主机上面&#xff0c;这样就可以持久化数据. 2、挂载数据文件&#xff08;可根据需求选择…

解决MySQL日期格式差异引发的查询bug:精确匹配与按日期截断比较

前言 在开发过程中&#xff0c;我们常常会遇到由于日期格式不匹配而导致的数据查询异常问题。今天&#xff0c;我就碰到了这样一个场景&#xff1a;在使用MyBatis Plus的Lambda表达式进行时间范围查询时&#xff0c;由于数据库中createTime字段的格式与前端传来的查询参数格式…

leetcode 1997.访问完所有房间的第一天

思路&#xff1a;动态规划前缀和 这道题还是很难的&#xff0c;因为你如果需要推出状态方程是很难想的。 在题中我们其实可以发现&#xff0c;这里在访问nextVisit数组的过程中&#xff0c;其实就是对于当前访问的房子之前的房子进行了回访。 怎么说呢&#xff1f;比如你现在…

Git相关命令(一)

一、简介 Git 是一个开源的分布式版本控制系统。 当然&#xff0c; git 不会傻傻的把你的每一个版本完整的存储下来&#xff0c;他仅仅会存储每次修改的位置和内容&#xff08;可持久化&#xff09;&#xff0c;每一次 commit 可以理解为产生一个版本&#xff0c;接下来的版本…

vivado 生成比特流或器件镜像

在生成比特流或器件镜像之前 &#xff0c; 请复查其设置 &#xff0c; 确保这些设置对于您的设计都正确无误 &#xff0c; 这一点至关重要。 Vivado IDE 中的比特流和器件镜像设置分为 2 种类型 &#xff1a; 1. 比特流或器件镜像文件格式设置。 2. 器件配置设置。 在 V…

Gradio——语音对话demo

import gradio as gr import os import random import json import requests import timefrom openai import AzureOpenAI# audio to text here def audio_to_text(audio_path):"""audio to text here&#xff0c;目前是openai whisperParameters:audio_path: …

数据结构刷题篇 之 【力扣二叉树基础OJ】详细讲解(含每道题链接及递归图解)

有没有一起拼用银行卡的&#xff0c;取钱的时候我用&#xff0c;存钱的时候你用 1、相同的树 难度等级&#xff1a;⭐ 直达链接&#xff1a;相同的树 2、单值二叉树 难度等级&#xff1a;⭐ 直达链接&#xff1a;单值二叉树 3、对称二叉树 难度等级&#xff1a;⭐⭐ 直达…