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

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.mzph.cn/pingmian/47585.shtml

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

相关文章

MYSQL——库表操作

MYSQL——库表操作 1.1 SQL语句基础1.1.1. SQL简介1.1.2. SQL语句分类1.1.3. SQL语句的书写规范 1.2数据库的操作1.2.1 数据库的登录及退出1.2.2查看数据库 作业 1.1 SQL语句基础 1.1.1. SQL简介 SQL:结构化查询语言(Structured Query Language),在关系型数据库上…

【ffmpeg入门】安装CUDA并使用gpu加速

文章目录 前言CUDACUDA是什么CUDA 的主要组成部分CUDA 的优点CUDA 的基本编程模型安装CUDA ffmpeg使用gpu加速为什么需要使用gpu加速1. 提高处理速度2. 减少 CPU 负载3. 提高实时处理能力4. 支持高分辨率和复杂编码格式5. 提供更好的可扩展性6. 提高能效 ffmpeg使用gpu加速常用…

【CMU博士论文】结构化推理增强大语言模型(Part 0)

问题 :语言生成和推理领域的快速发展得益于围绕大型语言模型的用户友好库的普及。这些解决方案通常依赖于Seq2Seq范式,将所有问题视为文本到文本的转换。尽管这种方法方便,但在实际部署中存在局限性:处理复杂问题时的脆弱性、缺乏…

单片机主控的基本电路

论文 1.复位电路 2.启动模式设置接口 3.VBAT供电接口 4.MCU 基本电路 5.参考电压选择端口

python处理彩色图像通道拆分与合并

彩色图像通道拆分与合并 1. 使用 opencv2. 使用 numpy 待处理图像 ML.jpg 1. 使用 opencv import cv2 import matplotlib.pyplot as plt import numpy as np # 读取图像 # 读取图像 image cv2.imread(ML.jpg) plt.imshow(image) print(type(image)) # 输出&#xff1a;<…

Artix7系列FPGA实现SDI视频编解码+UDP以太网传输,基于GTP高速接口,提供工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本博已有的以太网方案本博已有的FPGA图像缩放方案本方案的缩放应用本方案在Xilinx--Kintex系列FPGA上的应用本方案在Xilinx--Zynq系列FPGA上的应用 3、详细设计方案设计原理框图SDI 输入设备Gv8601a 均衡…

【BUG】已解决: KeyboardInterrupt

已解决&#xff1a; KeyboardInterrupt 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发者社区主理人 擅长.net、C…

vue v-for展示元素分两栏 中间使用分割线

1.效果展示: 2.代码展示: <template><div class"container"><div class"column" v-for"(item, index) in items" :key"index"><div class"item">{{ item }}</div><div v-if"index %…

注册安全分析报告:东方航空

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

LeetCode 394, 61, 100

目录 394. 字符串解码题目链接标签思路代码 61. 旋转链表题目链接标签思路代码 100. 相同的树题目链接标签思路代码递归版前序遍历层序遍历 394. 字符串解码 题目链接 394. 字符串解码 标签 栈 递归 字符串 思路 本题可以使用两个栈来解决&#xff0c;一个栈 timesStack …

开源安全态势感知平台Security Onion

简介 Security Onion是一款由安全防御人员为安全防御人员构建的免费开放平台。它包括网络可见性、主机可见性、入侵检测蜜罐、日志管理和案例管理等功能。详细信息可以查看官网Security Onion Solutions 在网络可见性方面&#xff0c;Security Onion提供了基于签名的检测&…

JAVA:Filer过滤器+案例:请求IP访问限制和请求返回值修改

JAVA&#xff1a;Filer过滤器 介绍 Java中的Filter也被称为过滤器&#xff0c;它是Servlet技术的一部分&#xff0c;用于在web服务器上拦截请求和响应&#xff0c;以检查或转换其内容。 Filter的urlPatterns可以过滤特定地址http的请求&#xff0c;也可以利用Filter对访问请求…

Wireshark抓取HTTP

HTTP请求响应 使用wireshark抓取 本地机器是192.168.33.195&#xff0c;远程机器是192.168.32.129&#xff0c;远程HTTP服务端口是9005 TCP/IP实际共分为4层&#xff0c;抓包信息中可以看到各层的数据&#xff0c;最上面的数据帧包含了所有数据。 附&#xff1a;抓取本地H…

专题四:设计模式总览

前面三篇我们通过从一些零散的例子&#xff0c;和简单应用来模糊的感受了下设计模式在编程中的智慧&#xff0c;从现在开始正式进入设计模式介绍&#xff0c;本篇将从设计模式的7大原则、设计模式的三大类型、与23种设计模式的进行总结&#xff0c;和描述具体意义。 设计模式体…

Docker-compose单机容器集群编排

传统的容器管理&#xff1a;Dockerfile文件 -> 手动执行 docker build 一个个镜像的构建 -> 手动执行 docker run 一个个容器的创建和启动 容器编排管理&#xff1a;Dockerfile文件 -> 在docker-compose.yml配置模板文件里定义容器启动参数和依赖关系 -> 执行dock…

PlantUML-UML 绘图工具安装、Graphviz安装、本地使用/在线使用、语法、图示案例

文章目录 前言本地安装vscode安装插件下载安装Graphviz配置Graphviz环境变量测试 在线使用演示PlantUML语法总结活动图&#xff08;新语法&#xff09;时序图类图用例图其他图 更多相关内容可查看 前言 本篇提供两种使用方式分别为 在线使用地址1&#xff1a;https://www.pla…

在安卓手机上原生运行docker

前言 之前的文章(香橙派5plus上跑云手机方案一 redroid(带硬件加速))在Ubuntu的docker里运行安卓&#xff0c;这里说下怎么在安卓手机下运行docker&#xff0c;测试也可以跑Ubuntu。 想在手机上运行docker想的不是一天两天了&#xff0c;其实很久之前就有这个想法了&#xff…

Docker网络模式和Cgroup资源限制

目录 1、Docker网络 &#xff08;1&#xff09;Docker网络实现原理 查看容器的输出和日志信息 2、Docker 的网络模式 查看docker列表 &#xff08;1&#xff09;网络模式详解 1&#xff09;host模式 2&#xff09;container模式 3&#xff09;none模式 4&#xff09;br…

SpringCloud教程 | 第十篇: 读取Nacos的配置

1、nacos服务器选用 2、test.yaml这一个DataId配置如下&#xff1a; config:name: aabb222 spring:application:name: testdatasource:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/hmblogs?useUni…

MongoDB教程(十二):MongoDB数据库索引

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、MongoD…