网络编程-TCP 协议的三次握手和四次挥手做了什么

news2024/11/13 12:24:16

TCP 协议概述

1. TCP 协议简介

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

TCP 协议提供可靠的通信服务,通过校验和、序列号、确认应答、重传等机制保证数据传输的完整性。

TCP 协议是一种端到端的协议,通信双方必须建立连接,然后才能通信。通信过程中,TCP 协议采用三次握手建立连接,四次挥手断开连接。

2. TCP 协议特点

  • 面向连接:TCP 协议是面向连接的协议,通信双方必须先建立连接,然后才能通信。
  • 可靠性:TCP 协议提供可靠的通信服务,通过校验和、序列号、确认应答、重传等机制保证数据传输的完整性。
  • 字节流:TCP 协议是基于字节流的协议,通信双方发送的数据可以是任意字节,不必事先知道对方发送的数据长度。
  • 超时重传:TCP 协议实现超时重传机制,保证数据传输的可靠性。
  • 流量控制:TCP 协议实现流量控制机制,可以对通信双方发送数据的速度进行限制。
  • 拥塞控制:TCP 协议实现拥塞控制机制,可以防止网络拥塞,减少网络拥塞对通信的影响。

在这里插入图片描述

tcp 数据包格式

在这里插入图片描述

端⼝号

  • TCP 源端⼝ (Source Port): 源计算机上的应⽤程序的端⼝号,占 16 位。
  • TCP ⽬的端⼝ (Destination Port): ⽬标计算机的应⽤程序端⼝号,占 16 位

序列号

  • 数据序号 (Sequence Number,seq) : 占 32 位;它表示本报⽂段所发送数据的第⼀个
    字节的编号。在 TCP 连接中,所传送的字节流的每⼀个字节都会按顺序编号。当
    SYN 标记不为 1 时,这是当前数据分段第⼀个字⺟的序列号;如果 SYN 的值是 1
    时,这个字段的值就是初始序列值(ISN),⽤于对序列号进⾏同步。这时,第⼀个字
    节的序列号⽐这个字段的值⼤ 1,也就是 ISN 加 1。
  • 确认序号 (Acknowledgment Number,ack) : 占 32bit, 它表示接收⽅期望收到发送
    ⽅下⼀个报⽂段的第⼀个字节数据的编号。其值是接收计算机即将接收到的下⼀个序
    列号,也就是下⼀个接收到的字节的序列号加 1。

数据偏移字段

  • TCP ⾸部⻓度(Header Length):数据偏移是指数据段中的 “数据” 部分起始处距
    离 TCP 数据段起始处的字节偏移量,占 4 位。其实这⾥的 “数据偏移” 也是在确定
    TCP 数据段头部分的⻓度,告诉接收端的应⽤程序,数据从何处开始。
  • 保留 (Reserved): 占 4 位;为 TCP 将来的发展预留空间,⽬前必须全部为 0

标志位字段

  • U——URG,表示本报⽂段中发送的数据是否包含紧急数据:URG=1 时表示有紧急数
    据。当 URG=1 时,后⾯的紧急指针字段才有效。
  • A——ACK,表示前⾯的确认号字段是否有效:ACK=1 时表示有效;只有当 ACK=1
    时,前⾯的确认号字段才有效;TCP 规定,连接建⽴后,ACK 必须为 1
  • P——PSH, 告诉对⽅收到该报⽂段后是否⽴即把数据推送给上层。如果值为 1,表示
    应当⽴即把数据提交给上层,⽽不是缓存起来
  • R——RST,表示是否重置连接:若 RST=1,说明 TCP 连接出现了严重错误(如主机
    崩溃),必须释放连接,然后再重新建⽴连接
  • S——SYN,在建⽴连接时使⽤,⽤来同步序号:当 SYN=1,ACK=0 时,表示这是⼀
    个请求建⽴连接的报⽂段;当 SYN=1,ACK=1 时,表示对⽅同意建⽴连接;SYN=1
    时,说明这是⼀个请求建⽴连接或同意建⽴连接的报⽂;只有在前两次握⼿中 SYN 才
    为 1
  • F——FIN,标记数据是否发送完毕:若 FIN=1,表示数据已经发送完成,可以释放连
    接.

窗⼝⼤⼩字段

  • 窗⼝⼤⼩ (Window Size): 占 16 位;它表示从 Ack Number 开始还可以接收多少字节的数据量,也表
    示当前接收端的接收窗⼝还有多少剩余空间。该字段可以⽤于 TCP 的流量控制。

校验和 (TCP Checksum): 占 16 位;它⽤于确认传输的数据是否有损坏。发送端基于数据内容校验⽣
成⼀个数值,接收端根据接收的数据校验⽣成⼀个值。两个值必须相同,才能证明数据是有效的。如果
两个值不同,则丢掉这个数据包。Checksum 是根据伪头 + TCP 头 + TCP 数据三部分进⾏计算的。

紧急指针 (Urgent Pointer): 仅当前⾯的 URG 控制位为 1 时才有意义。它指出本数据段中为紧急数据
的字节数,占 16 位;当所有紧急数据处理完后,TCP 就会告诉应⽤程序恢复到正常操作。即使当前窗
⼝⼤⼩为 0,也是可以发送紧急数据的,因为紧急数据⽆须缓存。

选项 (Option): ⻓度不定,但⻓度必须是 32bits 的整数倍;选项中的内容不确定,因此就必须使⽤⾸
部⻓度来区分选项具体的⻓度.

填充字段 (Fill): 这是为了使整个⾸部⻓度是 4 个字节的倍数。IP 数据报的⾸部也同样有这个字段,
也要 4 字节对⻬

三次握手概述

三次握手(Three-way Handshake) 其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包.
进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常,指定自己的初始化序列号为后续的
可靠性传输做准备,实际上就是服务器指定连接端口,建立TCP连接,并同步连接双方的序列号和确认号,
交换TCP窗口大小信息.

三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,并且进行交换TCP的信息
在socket编程中,客户端执行connect()时,将触发三次握手.

在这里插入图片描述

  1. 第一次握手,由客户端发送请求连接 即 SYN=1,TCP 规定 SYN=1 的时候,不能携带数据.
    但是需要消耗一个 seq 序号, 因此产生了一个序号 seq=x ;
  2. 第二次握手,然后B主机收到A主机发送的消息,向A主机发送确认,发送SYN=1,
    表示请求连接已经收到,然后发送确认ACK=1,把TCP包中ACK位置为1,在来发送一个新的序列
    号seq=y,确认号ack=x+1 ;
  3. 第三次握手,其实经过两次连接之后,双方的基本连接已经建立;但是A收到B的确认之后,还需要向B给出确认,
    说明自己已经收到确认包了,设置确认ACK=1,ack=y+1,而顺序号seq=x+1 ;
    双方建立稳定的连接,此时ACK报文可以携带数据;

四次挥手概述

TCP 数据建⽴连接的时候,需要使⽤ 3 次握⼿,但是断开连接的时候,只需要挥⼿四次。所谓四
次挥⼿(Four-Way Wavehand)即终⽌ TCP 连接,就是指断开⼀个 TCP 连接时,需要客户端和服
务端总共发送 4 个包以确认连接的断开。在 socket 编程中,这⼀过程由客户端或服务端任⼀⽅执⾏
close 来触发,整个流程如下图所示

在这里插入图片描述

  1. 第⼀次挥⼿:

客户端打算关闭连接,此时会发送⼀个 TCP ⾸部 FIN 标志位被置为 1 的报⽂,也即
FIN 报⽂,之后客户端进⼊ FIN_WAIT_1 状态。

  1. 第⼆次挥⼿:

    服务端收到该报⽂后,就向客户端发送 ACK 应答报⽂,接着服务端进⼊
    CLOSED_WAIT 状态。

  2. 第三次挥⼿:

    客户端收到服务端的 ACK 应答报⽂后,之后进⼊ FIN_WAIT_2 状态。但此时服务端
    可能还有⼀些数据未处理完。等待服务端处理完数据后,也向客户端发送 FIN 报⽂,
    之后服务端进⼊ LAST_ACK 状态。

  3. 第四次挥⼿:

    客户端收到服务端的 FIN 报⽂后,回⼀个 ACK 应答报⽂,之后进⼊ TIME_WAIT 状

    服务端收到了 ACK 应答报⽂后,就进⼊了 CLOSED 状态,⾄此服务端已经完成连接
    的关闭。

    客户端在经过 2MSL ⼀段时间后,⾃动进⼊ CLOSED 状态,⾄此客户端也完成连接
    的关闭。

    (经过 2MSL 后仍然没有回复,说明 Server 端已经正常关闭了。那么 Client 也可⽤关闭)

相关参数说明

ESTABLISHED : 代表当前 TCP 已经连接成功

MSL(Maximum Segment Lifetime), 指⼀个⽚段在⽹络中最⼤的存活时间。2MSL 就
是⼀个发送和⼀个回复所需的最⼤时间。

FIN_WAIT_1 : 等待对⽅的 FIN 报⽂。

FIN_WAIT_2 : 等待对⽅的 FIN 报⽂。

TIME_WAIT : 表示收到了对⽅的 FIN** 报⽂ **,并发送出了 ACK 报⽂,就等
2MSL 后即可回到 CLOSED 可⽤状态了

CLOSE_WAIT : 这种状态的含义其实是表示在等待关闭

LAST_ACK : 这个状态还是⽐较容易好理解的,它是被动关闭⼀⽅在发送 FIN 报⽂
后,最后等待对⽅的 ACK 报⽂。当收到 ACK 报⽂后,也即可以进⼊到 CLOSED 可
⽤状态了。

为什么 TCP 协议在建⽴连接的时候是握⼿三次,⽽断开链接的时候却要挥⼿四次?

TCP协议在建立连接时进行三次握手是为了确保双方都能够同步序列号和确认双方的通信能力。
第一次握手客户端发送连接请求,第二次握手服务器响应并确认连接请求,第三次握手客户端再次确认连接。
这样双方就可以确认彼此已准备就绪,可以安全地开始数据传输。

而在断开连接时,因为数据传输是双向的,需要进行四次挥手才能完成断开连接的过程。
第一次挥手一方发送关闭连接请求,第二次挥手另一方接收到请求,并且确认收到请求,但仍可以发送数据。
第三次挥手另一方发送自己的关闭请求,第四次挥手则是对方确认收到关闭请求,完成关闭连接的过程。
这样可以保证双方都能完成关闭连接的操作,确保数据传输的可靠性。

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

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

相关文章

Pytorch学习笔记day4——训练mnist数据集和初步研读

该来的还是来了hhhhhhhhhh,基本上机器学习的初学者都躲不开这个例子。开源,数据质量高,数据尺寸整齐,问题简单,实在太适合初学者食用了。 今天把代码跑通,趁着周末好好的琢磨一下里面的各种细节。 代码实…

C++内存管理(区别C语言)深度对比

欢迎来到我的Blog,点击关注哦💕 前言 前面已经介绍了类和对象,对C面向对象编程已经有了全面认识,接下来要学习对语言学习比较重要的是对内存的管理。 一、内存的分区 代码区:存放程序的机器指令,通常是可…

js实现数组的下标为n的对象后面新增一条对象

前言: js实现数组的下标为n的对象后面新增一条对象 实现方法: arr.splice(1, 0, obj); splice 参数1: 数组里面的第几个元素,你希望在第几个对象后面新增参数2: 0 表示不删除任何元素参数3: 插入的新对象 let arr [{},{},{},{}] let obj…

vue使用echarts开发大屏可视化(附echarts案例资源)

近年来,可视化在前端领域是越来越多。最近投入的一个项目就是关于大屏可视化,基本就是用到了echarts,所以项目结束后,我也来总结一下如何在Vue中去引入echarts并使用。 文章目录 一、echarts案例网站可视化社区(https://www.makea…

Zoho Mail企业邮箱好用吗?

企业在选择企业邮箱时需要考虑三大因素,一是安全隐私,二是功能易用,三是产品价格。作为国际排行前五的企业邮箱,Zoho邮箱好用吗?本文将为您详细介绍Zoho邮箱的功能、安全性和产品价格。 一、安全隐私 1、数据加密与安…

MySQL----初始数据类型

前言 一、tinyint 范围:-128-----127 在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。可以通过UNSIGNED来说明某个字段是无符号的。如果我们向mysqlt特定的类型中插入不合法的数据,Mysq一般会直接拦截&#xff0c…

【HarmonyOS学习】定位相关知识(Locationkit)

简介 LocationKit提供了定位服务、地理围栏、地理编码、逆地理编码和国家码等功能。 可以实现点击获取用户位置信息、持续获取位置信息和区域进出监控等多项功能。 需要注意,需要确定用户已经开启定位信息,一下的代码没有做这一步的操作,默…

p17面试题

品茗面试题 1.交换两个int变量的值&#xff0c;不能使用第三个变量&#xff0c;即a3,b5,交换后&#xff0c;a5,b3&#xff1b; #include<stdio.h> //int main(){ // //打印函数&#xff0c;引用头文件.stdio.h // printf("hello world\n");//打印函数 …

C++STL详解(二)——string类的模拟实现

首先&#xff0c;我们为了防止命名冲突&#xff0c;我们需要在自己的命名空间内实现string类。 一.string类基本结构 string类的基本结构和顺序表是相似的&#xff0c;结构如下&#xff1a; //.h namespace kuzi {class string{private:char* _str;//字符串size_t _size;//长…

算法基础之回溯法

本文将详细介绍回溯法的基本原理和适用条件&#xff0c;并通过经典例题辅助读者理解回溯法的思想、掌握回溯法的使用。本文给出的例题包括&#xff1a;N皇后问题、子集和问题。 算法原理 在问题的解空间树中&#xff0c;回溯法按照深度优先的搜索策略&#xff0c;从根结点出发…

LDR6020:重塑iPad一体式有线键盘体验的创新力量

在移动办公与娱乐日益融合的时代&#xff0c;iPad凭借其强大的性能和便携性&#xff0c;成为了众多用户不可或缺的生产力工具。然而&#xff0c;为了进一步提升iPad的使用体验&#xff0c;一款高效、便捷的键盘成为了不可或缺的配件。今天&#xff0c;我们要介绍的&#xff0c;…

TYPE-C接口PD取电快充协议芯片ECP5701:支持PD 2.0和PD 3.0(5V,9V,12V,15V,20V)

随着智能设备的普及&#xff0c;快充技术成为了越来越多用户的刚需。而TYPE-C接口作为新一代的USB接口&#xff0c;具有正反插、传输速度快、充电体验好等优点&#xff0c;已经成为了快充技术的主要接口形式。而TYPE-C接口的PD&#xff08;Power Delivery&#xff09;取电快充协…

【数据结构】线性结构——数组、链表、栈和队列

目录 前言 一、数组&#xff08;Array&#xff09; 1.1优点 1.2缺点 1.3适用场景 二、链表&#xff08;Linked List&#xff09; 2.1优点 2.2缺点 2.3适用场景 三、栈&#xff08;Stack&#xff09; 3.1优点 3.2缺点 3.3适用场景 四、队列&#xff08;Queue&#xff09; 4.1优点…

【python】Python高阶函数--reduce函数的高阶用法解析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Redis常用的5大数据类型

Reids字符串&#xff08;String&#xff09; 设置相同的key&#xff0c;之前内容会覆盖掉 Redis列表&#xff08;List&#xff09; 常用命令 从左往右放值 数据结构 Redis集合&#xff08;set&#xff09; sadd<key><value1><value2>...... 数据结构 Set数据…

前端组件化开发:以Vue自定义底部操作栏组件为例

摘要 随着前端技术的不断演进&#xff0c;组件化开发逐渐成为提升前端开发效率和代码可维护性的关键手段。本文将通过介绍一款Vue自定义的底部操作栏组件&#xff0c;探讨前端组件化开发的重要性、实践过程及其带来的优势。 一、引言 随着Web应用的日益复杂&#xff0c;传统的…

「豆包Marscode体验官」 | 云端 IDE 启动 Rust 体验

theme: cyanosis 我正在参加「豆包MarsCode初体验」征文活动 MarsCode 可以看作一个运行在服务端的远程 VSCode开发环境。 对于我这种想要学习体验某些语言&#xff0c;但不想在电脑里装环境的人来说非常友好。本文就来介绍一下在 MarsCode里&#xff0c;我的体验 rust 开发体验…

Games101学习笔记 Lecture22 Animation(cont.)

Lecture22 Animation(cont. 一、单个粒子模拟Ordinary Differential Equation ODE 常微分方程ODE求解方法——欧拉方法解决不稳定中点法改进欧拉方法自适应步长隐式欧拉方法 二、流体模拟基于位置的方法物质点方法 一、单个粒子模拟 想模拟粒子在场中的运动 Ordinary Differe…

Token Labeling(NeurIPS 2021, ByteDance)论文解读

paper&#xff1a;All Tokens Matter: Token Labeling for Training Better Vision Transformers official implementation&#xff1a;https://github.com/zihangJiang/TokenLabeling 出发点 ViTs的局限性&#xff1a;尽管ViTs在捕捉长距离依赖方面表现出色&#xff0c; 但…

代码随想录算法训练营第五十八天|108.冗余连接、109.冗余连接II

108.冗余连接 题目链接&#xff1a;108.冗余连接 文档讲解&#xff1a;代码随想录 状态&#xff1a;还行 思路&#xff1a; 并查集可以解决什么问题&#xff1a;两个节点是否在一个集合&#xff0c;也可以将两个节点添加到一个集合中。 题解&#xff1a; public class Main {p…