网络(六)传输层协议介绍

目录

一、TCP协议介绍

1. 定义

2. 特性

二、TCP报文格式 

1. 图示

2. 报文选项注释

三、TCP三次握手

1. 定义

2. 图示

3. 过程 

四、TCP四次挥手

1. 定义

2. 图示

3. 过程

五、UDP协议介绍

六、TCP/UDP协议区别

七、TCP的三次握手中为什么不是两次、四次?


一、TCP协议介绍

1. 定义

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,提供全双工服务,即数据可在同一时间双向传输,但是速度较慢。

2. 特性

·工作在传输层
·面向连接协议
·全双工协议
·半关闭,断开
·错误检查(校验)
·将数据打包成段,排序(给数据排序)
·确认机制,对面每发一个包,会告诉对方已收到
·数据恢复,重传
·流量控制,滑动窗口,第一次握手后服务端会返回最最大可传输数量,在客户端进行及时调整

二、TCP报文格式 

1. 图示

2. 报文选项注释

 ① 源端口、目标端口:计算机上进程之间通信是要通过计算机端口,每个进程在一定时间段内随机占用一个唯一端口,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用16位表示的,源端口个数和目标端口个数均为2^16个,即 65536 (0-65535)

② 序列号:表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每2^32个字节,就会出现序列号回绕,再次从0 开始无限循环

③ 确认号:(ack)表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。即ack=x+1

④ 首部长度/数据偏移:表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长。数据偏移指 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。该字段的单位是32位(即4个字节为计算单位),4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节

⑤ 保留:目前没有实际意义

⑥ 控制位:描述客户端和服务端两台设备目前的状态

·URG(紧急位):表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当URG=1时才有效                                                                     

·ACK(确认位):表示是否前面确认号字段是否有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段         

·PSH(急切位):提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中 

·RST(重置位):如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,带RST标志的TCP报文段称为复位报文段

·SYN(同步位):在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段              

·FIN(断开位):表通知对方本端要关闭连接,标记数据是否发送完毕。如果FIN=1,传输完毕可断开连接,带FIN标志的TCP报文段称为结束报文段

⑦ 窗口大小:表示现在允许对方发送的数据量,从本报文段的确认号开始允许对方发送的数据量的峰值,需要ACK确认后才能再继续传送后面数据

⑧ 校验和:提供额外的可靠性紧急指针:标记紧急数据在数据字段中的位置

⑨ 紧急指针:指出本报文段中的紧急数据的字节数;

⑩ 选项:其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,选项部分最长为:(2^4-1)*4-20=40字节

三、TCP三次握手

1. 定义

在TCP协议中,通信双方将通过三次TCP报文实现对以上信息的了解,并在此基础上建立一个TCP连接,而通信双方的三次TCP报文段的交换过程,也就是通常所说的TCP连接建立实现的三次握手(Three-Way Handshake)过程。

2. 图示

注:seq序号,ack确认号,SYN同步位,ACK确认位 

3. 过程 

① 客户端主动发起请求报文,报文序号是随机产生的seq=x,并且报文中的控制位同步位SYN=1,代表请求建立连接

② 当服务端收到请求建立连接的报文会回复一个报文,其中会产生随机序号seq=y,生成一个确认号,值为客户端请求报文的序号+1,即ack=x+1,并且要求对方按照此序号进行确认回复。然后控制位同步位SYN=1,确认位ACK=1,表示同意建立连接

③ 当客户端收到同意建立连接的报文时会回复一个确认报文,会按照服务端要求产生的序号 x+1(seq=x+1), 再生成一个确认号,值为对方报文的序号+1 (ack=y+1),最后控制位确认位ACK=1,代表收到对方同意连接的请求

四、TCP四次挥手

1. 定义

TCP的四次挥手是为了结束已建立的连接,确保双方都能正确地关闭连接并释放资源。

2. 图示

3. 过程

(第一次挥手)客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1(表示连接释放的请求),其序列号为seq=u(u-1是客户端发送的最后一个字节的序号)。此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
(第二次挥手)服务器收到连接释放报文,发出确认报文,报文头包含:确认位ACK=1,确认号ack=u+1,序号seq=v(v-1是服务端向用户端发送最后一个字节的序号)。此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器会通知高层的应用,告知客户端到服务端这个方向的连接已经释放,这时候处于半关闭状态,数据依然可以传输到客户端,防止数据没有传输完毕。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间。
③客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文,即最后数据。
(第三次挥手)服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,断开位FIN=1,确认号ack=u+1。由于在半关闭状态,服务器很可能又发送了一些数据,发送完毕后序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认回应。
(第四次挥手)客户端收到服务器的连接释放报文后,必须发出确认,确认位ACK=1,确认号ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
⑥服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

五、UDP协议介绍

UDP中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP协议传输速度快,但是不够稳定,没有重发机制。

六、TCP/UDP协议区别

协议区别
TCP面向连接稳定速度慢
UDP无连接不稳定速度快

七、TCP的三次握手中为什么不是两次、四次?

如果只有两次握手,至多只有客户端的起始序列号能被确认, 服务端选择的序列号则得不到确认。例如,客户端发送了一个建立连接的请求,但由于网络延迟或其他原因,该请求在传输过程中被延迟到达服务器。服务器此时会误认为客户端要建立连接,于是发送确认响应。然而,客户端近期实际并未发送过请求,因此不会回复确认。这样就会导致服务器一直等待客户端的回复,周期性重传,浪费资源。
通过引入第三次握手,可以解决上述问题。在第一次握手时,客户端发出建立连接的请求,服务器接收到后进行响应。并且生成指定序号要求客户端回应,即第二次握手。客户端按照服务端指定序号,再生成确认号,ACK=1,代表收到同意。
至于为什么不是四次握手,主要是因为虽然四次握手也可以实现可靠地同步双方的初始序列号,但由于第二步和第三步可以合并为一步,所以最终演变成了三次握手。而两次握手只能保证一方的初始序列号被对方成功接收,无法保证双方的初始序列号都能被确认接收。因此,三次握手是为了确保TCP连接的稳定性和可靠性而采取的最佳选择。

参考文献:两张动图-彻底明白TCP的三次握手与四次挥手_三次握手和四次挥手-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络爬虫第1天之数据解析库的使用

一、正则表达式 正则表达式(Regular Expression 简称regex或regexp)是一种强大的文本处理工具,它可以帮助实现快速的检索、替换或验证字符串中的特定模式。 1、match match()方法会尝试从字符串开始的位置到字符结束的位置匹配正则表达式&am…

JS中浅拷贝和深拷贝

本篇文章咱们一起来学习下JS中的浅拷贝和深拷贝,了解它们在内存上的区别,并掌握浅拷贝和深拷贝的常用实现方法。 引用赋值 在学习拷贝之前,咱们先来看一个常见的情景,如下图: 大家觉得这是深拷贝还是浅拷贝&#xff0…

gitee gihub上传步骤

上传 1. 到具体要上传的文件目录 2. 右击git Bash Here 初始化仓库:git init 3. 添加文件 添加所有文件 : git add . (注意这里有个点)添加具体文件: git add test.md 4. 添加到暂存区 git commit -m 暂存区 5. 将本地代…

深入解析HashMap数据结构及其应用

目录 引言 1. HashMap简介 2. 哈希表的基本原理 3. HashMap的内部结构 4. 哈希冲突的处理 5. HashMap的常见操作 6. HashMap的性能优化 7. 实际应用场景 结论 引言 在计算机科学中,数据结构是构建和组织数据的一种方式,而HashMap是其中一种常用…

Wiley将废除OA期刊“Hindawi”,MDPI、Frontier系列OA期刊将受巨大影响

公众号:生信漫谈,获取最新科研信息! Wiley将废除OA期刊“Hindawi”,MDPI、Frontier系列OA期刊将受巨大影响https://mp.weixin.qq.com/s/w1QvXnHHDV04gbABUxo3kA 周三上午,知名国际出版商Wiley在财报电话会议上宣布&a…

Java小案例-RocketMQ的11种消息类型,你知道几种?(请求应答消息)

前言 Rocket的请求应答消息是指在使用Rocket(这里可能是RocketMQ或者Rocket框架)进行通信时,客户端发送一个请求到服务端,然后服务端处理该请求并返回一个响应的过程中的数据交换。 在RocketMQ中: 请求应答消息通常…

代码随想录算法训练营Day4 | 24.两两交换链表中的节点、19.删除链表的倒数第 N 个节点、面试题. 链表相交、142.环形链表II

LeetCode 24 两两交换链表中的节点 本题要注意的条件: 遍历终止条件改变引用指向的时候,需要保存一些节点记录 为了更好的操作链表,我定义了一个虚拟的头节点 dummyHead 指向链表。如下图所示 既然要交换链表中的节点,那么肯定…

在线学习平台,云课堂云教育类网站源码,在线题库+随身携带的刷题神器+视频安装教程

源码介绍 在线题库:由传统的线下学习模式改为在线学习。能够实现学员在线学习、练习、考试 优点:方便、便宜、自我管理、选择性更多 、成人教育 (1)公考:国考、省考、事业单位… (2)升学&…

9. DashBoard

9. DashBoard 文章目录 9. DashBoard9.1 部署Dashboard9.2 使用DashBoard 在kubernetes中完成的所有操作都是通过命令行工具kubectl完成的。 为了提供更丰富的用户体验,kubernetes还开发了一个基于web的用户界面(Dashboard)。 用户可以使用…

在Windows上通过VS2019自带的Cmake来编译OpenCV-4.5.3源码

文章目录 用VS打开OpenCV源码cmake的配置及生成操作生成及安装 用VS打开OpenCV源码 方式一:文件–》打开–》Cmake 找到源码根目录下CMakeLists.txt文件 导入即可。 方式二:在开始使用这里 选择 打开本地文件夹 找到源码的根目录,导入即可…

「斗罗二」七怪大赛1击穿12,蝶神斩打爆人面魔蛛,二代七怪诞生

Hello,小伙伴们,我是拾荒君。 《斗罗大陆Ⅱ绝世唐门》第27集的更新,为我们带来了激烈的二代七怪竞选大赛的精彩瞬间。在这一集中,新一代史莱克七怪的表现尤为出色,他们面对的挑战也愈发艰难。 比赛进行得如火如荼,贝贝…

[ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证

文章目录 一、前言二、在 Azure Portal 中创建 VM三、验证已创建的虚拟机资源3.1 方法一:在虚拟机服务中查看验证3.1 方法二:在资源组服务中查看验证 四、文末总结 一、前言 本文会开始创建新系列的专栏,专门更新 Azure 云实践相关的文章。 …

linux日志管理_日志轮转logrotate

10.2 日志轮转logrotate 10.2.1 简介 日志:记录了程序运行时各种信息。通过日志可以分析用户行为,记录运行轨迹,查找程序问题。 ​ 但由于磁盘的空间是有限的,日志轮转就像飞机里的黑匣子,记录的信息再重要也只能记录…

flume系列之:监控flume agent channel的填充百分比

flume系列之:监控flume agent channel的填充百分比 一、监控效果二、获取flume agent三、飞书告警四、获取每个flume agent channel的填充百分比一、监控效果 二、获取flume agent def getKafkaFlumeAgent():# 腾讯云10.130.112.60zk = KazooClient(hosts

【案例】--“特别抢购”案例

目录 一、案例背景二、技术方案思路三、技术方案具体设计3.1、表设计3.2、Java代码实现一、案例背景 A公司向供应商B公司买了一套软件产品。B公司的这套产品有多个应用系统服务【如appId1、appId2、appId3】,每个应用都有各自的业务应用场景,但都需要管理文档,那么就需要磁…

Linux驱动(中断、异步通知):红外对射,并在Qt StatusBus使用指示灯进行显示

本文工作: 1、Linux驱动与应用程序编写:使用了设备树、中断、异步通知知识点,实现了红外对射状态的异步信息提醒。 2、QT程序编写:自定义了一个“文本指示灯”类,并放置在QMainWidget的StatusBus中。 3、C与C混合编程与…

C++:函数重载

1.函数重载概念 函数重载就是用同一个函数名定义的不同函数,当函数名和不同的参数搭配时函数的功能和含义不同。 2.实现函数重载的条件 同一个作用域,参数个数不同或者参数类型不同或者参数顺序不同(满足一个即可) void func(){} void func(int x){} v…

55 代码审计-JAVA项目注入上传搜索或插件挖掘

目录 必备知识点演示案例:简易Demo段SQL注入及预编译IDEA审计插件FindBugs安装使用Fortify_SCA代码自动审计神器使用Ofcms后台SQL注入-全局搜索关键字Ofcms后台任意文件上传-功能点测试 涉及资源: 我们一般针对java项目,进行漏洞分析的话,主要…

SolidWorks二次开发 C#-读取基于Excel的BOM表信息

SolidWorks二次开发 C#-读取基于Excel的BOM表信息 问题点来源解决方案及思路相关引用链接 问题点来源 这是一位粉丝问的一个问题,他说到: 老师,请问Solidworks二次开发工程图中"基于Excel的材料明细表"怎么读取里面的数据? Ps:这…

风速预测(五)基于Pytorch的EMD-CNN-LSTM模型

目录 前言 1 风速数据EMD分解与可视化 1.1 导入数据 1.2 EMD分解 2 数据集制作与预处理 2.1 先划分数据集,按照8:2划分训练集和测试集 2.2 设置滑动窗口大小为96,制作数据集 3 基于Pytorch的EMD-CNN-LSTM模型预测 3.1 数据加载&…