网络协议:TCP三次握手与四次挥手

news2025/7/5 19:02:29

本篇内容包括:TCP/IP 传输协议(TCP/IP 传输协议简介,IP 协议,UDP 协议,TCP 协议介绍),TCP 的三次握手、TCP 的四次挥手 以及 TCP 协议是怎么保证有效传输等内容。

一、TCP/IP 传输协议

1、TCP/IP 传输协议简介

TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP 协议不仅仅指的是 TCP 和 IP 两个协议,而是指一个由 FTP、SMTP、TCP、UDP、IP 等协议构成的协议簇, 只是因为在 TCP/IP 协议中 TCP 协议和 IP 协议最具代表性,所以被称为 TCP/IP 协议。

TCP/IP 传输协议是严格来说是一个四层的体系结构,应用层、传输层、网络层和数据链路层都包含其中。

2、关于 IP 协议

IP 协议也就是我们所说的网络层协议,它的主要目的就是将一个 IP 地址的数据发送到另外一个 IP 地址所代表的设备,这两个 IP 地址有可能是隶属于同一个网段,也有可能隶属于不同的网段

IP 协议,制定了一套新地址,使得我们能够区分两台主机是否同属一个网络,这套地址就是网络地址,也就是所谓的 IP 地址。IP 协议将这个 32 位的地址分为两部分,前面部分代表网络地址,后面部分表示该主机在局域网中的地址。如果两个 IP 地址在同一个子网内,则网络地址一定相同。为了判断 IP 地址中的网络地址,IP 协议还引入了子网掩码,IP 地址和子网掩码通过按位与运算后就可以得到网络地址。

3、关于 UDP 协议是什么

UDP 即用户数据报协议,UDP 协议定义了端口,同一个主机上的每个应用程序都需要指定唯一的端口号,并且规定网络中传输的数据包必须加上端口信息,当数据包到达主机以后,就可以根据端口号找到对应的应用程序了。UDP 协议比较简单,实现容易,但它没有确认机制,数据包一旦发出,无法知道对方是否收到,因此可靠性较差,为了解决这个问题,提高网络可靠性,TCP 协议就诞生了。

4、关于 TCP 协议是什么

TCP 即传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议,简单来说 TCP 就是有确认机制的 UDP 协议。TCP 数据包和 UDP 一样,都是由首部和数据两部分组成,唯一不同的是,TCP 数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常 TCP 数据包的长度不会超过 IP 数据包的长度,以确保单个 TCP 数据包不必再分割。 当一个连接被建立或被终止时,交换的报文段只包含 TCP 头部,而没有数据。

一个 TCP 连接由一个 4 元组构成,分别是两个 IP 地址和两个端口号。一个 TCP 连接通常分为三个阶段:连接、数据传输、退出(关闭)。通过三次握手建立一个连接,通过四次挥手来关闭一个连接。

在这里插入图片描述

TCP协议头最少 20 个字节,包括以下的区域:

  • TCP 源端口(Source Port):16 位的源端口其中包含初始化通信的端口。源端口和源IP地址的作用是标示报问的返回地址;
  • TCP 目的端口(Destination port):16 位的目的端口域定义传输的目的。这个端口指明报文接收计算机上的应用程序地址接口;
  • TCP 序列号(序列码,Sequence Number):32位 的 seq 序列号由接收端计算机使用,重新分段的报文成最初形式。当 SYN 出现,序列码实际上是初始序列码(ISN),而第一个数据字节是 ISN+1。这个序列号(序列码)是可以补偿传输中的不一致;
  • TCP 确认序号(Acknowledgment Number):32 位的序列号由接收端计算机使用,重组分段的报文成最初形式,如果设置了 ACK 控制位,这个值表示一个准备接收的包的序列码;
  • 头长度(Header Length):表示 TCP 头的四字节数,如果转化为字节个数需要乘以 4(如果没有任何选项字段,TCP 头部长度为 20 字节;最多可以有 60 字节的 TCP 头部);
  • 标志位:共 6 个,即 URG、ACK、PSH、RST、SYN、FIN
    • URG:紧急指针(urgent pointer)有效,0 为不使用,1 为使用;
    • ACK:确认序号有效,确认序号 ack 与标志位中的 ACK 不同,确认方 ack = 发起方 seq+1,两端配对,0 为请求,1 为应答;
    • PSH:接收方应该尽快将这个报文交给应用层;
    • RST:重置连接(连线复位,首先断开连接,然后重建);
    • SYN:发起一个新连接(同步连线序号,用来建立连线);
    • FIN:结束/释放一个连接(如果 FIN 为 0 是结束连线请求,FIN 为 1 表示结束连线);
  • 窗口大小(Window):目的机使用 16 位的域告诉源主机,它想收到的每个 TCP 数据段大小;
  • 校验和(Check Sum):这个校验和和IP的校验和有所不同,不仅对头数据进行校验还对封包内容校验;
  • 紧急指针(Urgent Pointer):当 URG 为 1 的时候才有效。TCP 的紧急方式是发送紧急数据的一种方式。

二、TCP 的三次握手

1、TCP 三次握手概述

三次握手的本质是确认通信双方收发数据的能力。

  • 首先,我让信使运输一份信件给对方,对方收到了,那么他就知道了「我的发件能力」和「他的收件能力」是可以的
  • 然后,他给我回信,我若收到了,我便知「我的发件能力」和「他的收件能力」是可以的,并且「他的发件能力」和「我的收件能力」是可以。
  • 最后,我回馈一次,他若收到了,他便清楚了「他的发件能力」和「我的收件能力」是可以的
次数我的发件能力可以我的收件能力可以他的发件能力可以他的收件能力可以
第一次他知道他知道
第二次我知道我知道我知道我知道
第三次他知道他知道

2、TCP 三次握手的详细过程

三次握手详细过程:

  1. 第一次握手,客户端向服务端发起连接请求:
    • 首先,客户端会生成一个随机起始序列号 ISN(比如是100),
    • 然后客户端向服务端发送报文,此时报文段包含 SYN 标志位(也就是 SYN=1),序列号 seq=100;
  2. 第二次握手,服务端收到客户端发来的报文:
    • 首先,服务端发现 SYN=1,确定这是一个连接请求,于是服务端将客户端的起始序列号 100 存起来,并且随机生成一个服务端的起始序列号(比如是200)
    • 然后,服务端给客户端回复一段报文,回复报文包含 SYN 和 ACK 标志(也就是SYN=1,ACK=1)、序列号 seq=200、确认号 ack=101(客户端发过来的序列号+1);
  3. 第三次握手,客户端收到服务端的回复报文:
    • 首先:客户端发现 ACK=1 并且 ack=101,于是知道服务端已经收到了序列号为 100 的那段报文;
    • 同时,客户端发现 SYN=1,知道了服务端同意了这次连接,于是就将服务端的序列号 200 给存下来;
    • 然后,客户端再回复一段报文给服务端,报文包含 ACK 标志位(ACK=1)、ack=301(服务端序列号+1)、seq=101(第一次握手时发送报文是占据一个序列号的,所以这次 seq 就从 101 开始,需要注意的是不携带数据的 ACK 报文是不占据序列号的,所以后面第一次正式发送数据时 seq 还是 101);
    • 最后,当服务端收到报文后发现 ACK=1 并且 ack=201,就知道客户端收到序列号为 200 的报文了,就这样客户端和服务端通过 TCP 建立了连接。

三、TCP 的四次挥手

四次挥手的目的是关闭一个连接

比如客户端初始化的序列号 ISA=100,服务端初始化的序列号 ISA=200。TCP 连接成功后客户端总共发送了 1000 个字节的数据,服务端在客户端发 FIN 报文前总共回复了 2000 个字节的数据:

  1. 第一次挥手:当客户端的数据都传输完毕后,客户端向服务端发出连接释放报文,报文包含 FIN 标志位(FIN=1)、序列号 seq=1101(100+1+1000,其中的,100 时初始序列号 ISA,1000 是目前总共发送了 1000 个字节的数据, 1 是建立连接时占的一个序列号)Ps:客户端发出 FIN 报文段后只是不能发数据了,但是还可以正常收数据;另外 FIN 报文段即使不携带数据也要占据一个序列号;
  2. 第二次挥手:服务端收到客户端发的 FIN 报文后给客户端回复确认报文,确认报文包含 ACK 标志位(ACK=1)、确认号 ack=1102(客户端 FIN 报文序列号 1101+1)、序列号 seq=2200(200+2000)。此时服务端处于关闭等待状态,而不是立马给客户端发 FIN 报文,这个状态还要持续一段时间,因为服务端可能还有数据没发完;
  3. 第三次挥手:务端将最后数据(比如50个字节)发送完毕后就向客户端发出连接释放报文,报文包含 FIN 和 ACK 标志位(FIN=1,ACK=1)、确认号和第二次挥手一样 ack=1102、序列号 seq=2350(2300+50);
  4. 第四次挥手:客户端收到服务端发的 FIN 报文后,向服务端发出确认报文,确认报文包含 ACK 标志位(ACK=1)、确认号 ack=2351、序列号 seq=1102。Ps:客户端发出确认报文后不是立马释放 TCP 连接,而是要经过 2MSL(最长报文段寿命的 2 倍时长)后才释放 TCP 连接。而服务端一旦收到客户端发出的确认报文就会立马释放 TCP 连接,所以服务端结束 TCP 连接的时间要比客户端早一些。

四、TCP 协议是怎么保证有效传输

1、TCP 协议是怎么保证有效传输的?

TCP 是通过序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输的。

  • 确认应答:TCP 实现可靠传输的方式之一,是通过序列号与确认应答。

  • 连接管理:三次握手、四次挥手

  • 重传机制:但在复杂的网络环境下,并不一定能正常的数据传输,万一数据在传输过程中丢失了呢?所以 TCP 针对数据包丢失的情况,会用重传机制解决。

    • 超时重传:如果发送方发送数据一段时间后没有收到 ACK,那么就重发数据。
    • 此外还有:快速重传、SACK、D-SACK;
  • 滑动窗口:我们都知道 TCP 是每发送一个数据,都要进行一次确认应答。当上一个数据包收到了应答了, 再发送下一个。这个模式就有点像我和你面对面聊天,你一句我一句。这样的传输方式有一个缺点:数据包的往返时间越长,通信的效率就越低。

    为解决这个问题,TCP 引入了窗口这个概念。即使在往返时间较长的情况下,它也不会降低网络通信的效率。那么有了窗口,就可以指定窗口大小,窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值。窗口的实现实际上是操作系统开辟的一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除。

  • 流量控制:发送方不能无脑的发数据给接收方,要考虑接收方处理能力。如果一直无脑的发数据给对方,但对方处理不过来,那么就会导致触发重发机制,从而导致网络流量的无端的浪费。为了解决这种现象发生,TCP 提供一种机制可以让「发送方」根据「接收方」的实际接收能力控制发送的数据量,这就是所谓的流量控制。

    接收方会在返回 ACK 时同时把自己的即时窗口填入,发送方就根据报文中窗口的大小控制发送速度。

  • 拥塞控制:前面的流量控制是避免「发送方」的数据填满「接收方」的缓存,但是并不知道网络的中发生了什么。一般来说,计算机网络都处在一个共享的环境。因此也有可能会因为其他主机之间的通信使得网络拥堵。在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,这时 TCP 就会重传数据,但是一重传就会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这个情况就会进入恶性循环被不断地放大…

    所以,TCP 不能忽略网络上发生的事,它被设计成一个无私的协议,当网络发送拥塞时,TCP 会自我牺牲,降低发送的数据量。于是,就有了拥塞控制,控制的目的就是避免「发送方」的数据填满整个网络。

    拥塞窗口 cwnd 是发送方维护的一个的状态变量,它会根据网络的拥塞程度动态变化的。其实只要「发送方」没有在规定时间内接收到 ACK 应答报文,也就是发生了超时重传,就会认为网络出现了用拥塞。

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

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

相关文章

【仿牛客网笔记】 Redis,一站式高性能存储方案——Redis入门

Redis可以开发对性能要求较高的功能。还可以利用Redis重构我们现有的功能。 NoSQL关系型数据库之外的统称。 快照有称为RDB 以快照的形式 不适合实时的去做,适合一段时间做一次。 日志又称AOF 以日志的形式每执行一次就存入到硬盘中,可以做到实时的存储以…

JAVA外卖订餐系统毕业设计 开题报告

本文给出的java毕业设计开题报告,仅供参考!(具体模板和要求按照自己学校给的要求修改) 选题目的和意义 目的:本课题主要目标是设计并能够实现一个基于java的外卖点菜系统,管理员通过后台添加菜品&#xf…

卷积神经网络CNN

卷积神经网络CNN CNN通常用于影像处理 为什么需要CNN 为什么需要CNN,我用普通的fully connected的反向传播网络进行图像训练会怎样 需要过多参数 假设一张彩色的图为100100的,那么像素点就是1001003,那么输入层为三万维 假设下一层隐含层有…

移动Web:Less 预处理及Koala工具

css 预处理器,后缀名为 .less。 less 代码无法被浏览器识别,实际开发需要转换成 css,使用 liink 标签引入 css 文件。 插件工具 Easy Less VS Code 内置插件(less 文件保存自动生成 css 文件) 更改编译后 css 存储路径…

华清远见11.7

系统移植开发阶段部署 1.准备文件,由于内核只支持安全的启动模式,要准备u-boot镜像文件u-boot-stm32mp157a-fsmp1a-trusted.stm32 TF-A镜像文件tf-a-stm32mp157a-fsmp1a-trusted.stm32 linux内核镜像文件uImage和stm32mp157a-fsmp1a.dtb 根文件系统r…

QT 中多线程实现方法总结

第一: 用QtConcurrentRun类,适合在另一个线程中运行一个函数。不用继承类,很方便 第二:用QRunnable和QThreadPool结合。继承QRunnable,重写run函数,然后用QThreadPool运行这个线程。缺点是不能使用信号和槽…

html5 -- canvas使用(1)

canvas 设置canvas标签 添加宽高 默认单位为px <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport&…

荧光标记氨基酸:荧光标记DL-天门冬氨酸,荧光标记甘氨酸-DL-天冬氨酸,DL aspartic acid labeled

产品名称&#xff1a;荧光标记甘氨酸-DL-天冬氨酸&#xff0c;DL aspartic acid labeled 甘氨酸-DL-天冬氨酸是一种化学物质&#xff0c;化学式是C6H10N2O5&#xff0c;分子量是208.17。 DL-天门冬氨酸(DL-Asp)在医药方面有着重要的用途,可用于合成DL-天门冬氨酸钾镁盐(脉安定…

云原生之K8s—yaml文件

目录 一、K8S支持的文件格式 1、yaml和json的主要区别 二、YAML 2.1、查看API资源版本标签 2.2、编写资源配置清单 编写nginx-test.yaml资源配置清单 创建资源对象 查看创建的pod资源 创建资源对象 网页访问一下 K8S中的port概述 创建yaml文件模板 查看生成yaml格式…

【python的静态方法,classmethod方法和__call___魔法方法】

classmethod魔法方法和staticmethodstaticmethod&#xff0c;静态方法classmethod&#xff0c;绑定类方法__call__&#xff0c;可调用类类方法staticmethod&#xff0c;静态方法 在python中&#xff0c;使用静态方法可以实现不需要实例化对象的绑定就可以直接调用的函数&#…

Linux系统编程·进程概念

你好&#xff0c;我是安然无虞。 文章目录自学网站上文回顾进程控制块—PCB查看进程初识系统调用初始fork函数练习题自学网站 推荐给老铁们两款学习网站&#xff1a; 面试利器&算法学习&#xff1a;牛客网 风趣幽默的学人工智能&#xff1a;人工智能学习 首个付费专栏&…

添加滚动彩色提醒通知公告代码

分享一个动态的滚动多样化的彩色提醒通知公告&#xff0c;代码是自适应的&#xff0c;放在很多地方都可以用&#xff0c;在wordpress、emlog等建站cms中&#xff0c;都可以在自定义侧边栏中&#xff0c;用来网站、博客的美化也是非常不错的选择。 使用说明: wordpress&#xff…

网络编程04-UDP的广播、组播

目录 一、UDP广播通信 1、什么是广播 2、特点 3、广播地址 4、实现广播的过程&#xff08;一定是使用UDP协议&#xff09; 广播发送端 广播接收方 练习1&#xff1a; 把广播通信进行实现 发送端 接收端 二、UDP组播&#xff08;群聊&#xff09; 1、概念 2、组播特…

(最新版2022版)剑指offer之动态规划题解

&#xff08;最新版2022版&#xff09;剑指offer之动态规划题解[剑指 Offer 42. 连续子数组的最大和][剑指 Offer 47. 礼物的最大价值][剑指 Offer 46. 把数字翻译成字符串][剑指 Offer 48. 最长不含重复字符的子字符][剑指 Offer 48. 矩形覆盖][剑指 Offer 买卖股票的最好时机…

小侃设计模式(五)-建造者模式与模板方法模式

1.概述 建造者模式&#xff08;Builder Pattern&#xff09;又叫生成器模式&#xff0c;是一种对象构建模式&#xff0c;它可以将复杂对象的建造过程抽象出来&#xff08;抽象类别&#xff09;&#xff0c;这个抽象过程的不同实现方法可以构造出不同表现&#xff08;属性&…

家庭主妇问题

一 问题描述 X 村的人们住在美丽的小屋里。若两个小屋通过双向道路连接&#xff0c;则可以说这两个小屋直接相连。X 村非常特别&#xff0c;可以从任意小屋到达任意其他小屋&#xff0c;每两个小屋之间的路线都是唯一的。温迪的孩子喜欢去找其他孩子玩&#xff0c;然后打电话给…

C++中TCP socket传输文件

在两个文件中都定义文件头和用到的宏&#xff1a; #define MAX_SIZE 10 #define ONE_PAGE 4096 struct FileHead {char str[260];int size; }; 在客户端发送接收阶段&#xff1a; //1.发送文件头char path[260] {0};cout<<"请输入文件路径"<<endl;cin…

数字图像处理MATLAB

数字图像处理MATLAB 基&#xff08;本&#xff09;操&#xff08;作&#xff09; 图片读取 Aimread(test.bmp); imshow(A);2. 图像写入 Aimread(test.bmp); imwrite(A,test-bak.bmp); Bimread(test-bak.bmp); imshow(B);3. 图像文件信息查询 infoimfinfo(test.bmp);4. 显示…

【创建型】生成器模式(Builder)

目录生成器模式(Builder)适用场景生成器模式实例代码&#xff08;Java&#xff09;生成器模式(Builder) 将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 适用场景 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方…

【SpringBoot笔记22】SpringBoot框架集成Redis数据库

这篇文章&#xff0c;主要介绍SpringBoot框架如何集成Redis数据库。 目录 一、SpringBoot集成Redis 1.1、引入依赖 1.2、配置redis连接信息 1.3、添加RedisTemplate配置类 1.4、编写测试类 1.5、运行测试 一、SpringBoot集成Redis Redis是一个非关系型数据库&#xff0c…