TCPUDP

news2024/11/18 20:20:04

TCP

1.什么是TCP

TCP是处于运输层的通信协议,该协议能够实现数据的可靠性传输。

2.TCP报文格式

源端口和目的端口:各占两个字节,发送进程的端口和接收进程的端口号。

序号:占4个字节,序号如果增加到溢出,则下一个序号从0开始,在TCP传输过程中,传送的每一个字节流都是按顺序编号的。首部中的序号指的是发送数据的第一个字节流的编号。例如当前发送第一个字节流序列号为201,数据部分一共100个字节,那么下一次发送的序号就是301.

确认号:占4字节,期望收到对方下一个报文段数据第一个字节的编号。

数据偏移:占4位,单位是4字节,TCP报文的的首部长度。

保留字段:占6位,保留今后使用。

控制字段6位:

  1. 第一位URG(紧急标志位):为1时,表示紧急标指针有效,告诉系统此报文为一个紧急数据,应尽快送达。发送的优先级更高。
  2. 第二位ACK(确认):当为1时,确认号字段有效,ACK为0时,确认号无效,连接建立和确认应答有用。
  3. 第三位PSH(推送):为1时有效,发送方希望接收方收到推送包,立即将该包交付给上层协议,不要等到缓存区满了在向上交付。
  4. 第四位RST(复位):为1时有效,表面TCP连接出现严重差错,必须释放连接,重新建立连接.
  5. 第五位SYN(同步):在连接建立时用来同步序号,当SYN = 1,而ACK = 0时,表面这是一个连接请求报文段,如果接收方同意连接,则应返回SYN = 1和ACK = 1的报文段.
  6. 第六位FIN(终止):用来释放一个连接,当FIN = 1时,表面此报文段的发送方的数据已经发送完毕,并要求释放连接.

窗口:占2字节,值为[0,2^16-1],指的是发送本报文段的接收窗口大小,如果发送方的确认字段为1000,窗口大小为1000,那么接收方只能发送小于等于1000个字节的数据

校验和:占2字节,检验部分包括首部和数据部分,计算校验和时,要在TCP报文段加上12字节的伪首部.

紧急指针:占2字节,它指出本报文段中紧急数据的字节数(紧急指针接受后就是普通数据),窗口为0也能发送紧急数据,当处理完紧急数据时,TCP告诉应用程序恢复到正常操作.

选项:长度可变,最长40个字节.

总结:TCP的首部的前20个字节是固定的,所以首部最小长度为20字节.

2.TCP实现原理

在古代时期,人们通过写信来互相交流,但是信件的传输渠道并不发达,要保证信件的准确到达更是难上加难,在发信的过程中,如果彼此都认为自己的信是准确到达的,那么我们就可以认为它们互相交流是OK的。如果是你会使用什么办法判断它们互相交流没有问题呢?

举例:A向B发送信件,B接收到了信件,B可以知道A的信息是准确到达的;但是A并不知道它的信息是准确到达的,这时B就像A发送信息,A收到了B的信件,此时A就能认为自己的信是准确到达B的;但是B并不知道它的信息是否准确到达,此时A在向B发送一封信件,B收到信件后就可以自己的信件是准确到达的;此时A、B之间能感知到对方能够正确的接受消息。A,B之间就可以放心大胆的传输数据了。TCP也是如此,为了保证可靠性,首先收发方需要确认彼此都是正常的,才能放心的发送数据,下面看看TCP建立连接的过程吧。

建立连接:

  1. 客户端向服务器发送SYN报文,其中SYN=1表示建立连接请求,同时将初始序列号seq=x发送给服务器。

  2. 服务器接收到SYN报文后,向客户端发送SYN+ACK报文,其中SYN=1表示确认建立连接请求,同时也向客户端发送了自己的初始序列号seq=y和ack = x+1。

  3. 客户端接收到SYN+ACK报文后,向服务器发送ACK报文,其中ACK=1表示确认收到了服务器的确认建立连接请求的报文,并将确认号ack=y+1发送给服务器。此时,TCP连接已经建立。

在TCP三次握手的过程中,客户端和服务器都会发送SYN和ACK报文,以确保双方都能够正常收发数据。通过建立连接前的三次握手,可以保证双方都已经准备好传输数据,从而确保了数据传输的可靠性。

既然有连接,那么就有一个断开的过程,客户端不想在向服务端发送数据了,为了保障资源的利用,客户端向服务端申请断开连接。下面看看TCP是如何断开连接的吧。

断开连接:

  1. 客户端向服务器发送FIN报文,其中FIN=1表示客户端已经没有数据要发送了。

  2. 服务器接收到FIN报文后,向客户端发送ACK报文,其中ACK=1表示确认收到了客户端的FIN报文,由系统内核自动回复。

  3. 服务器向客户端发送FIN报文,其中FIN=1表示服务器已经没有数据要发送了,一般由应用程序触发。

  4. 客户端接收到FIN报文后,向服务器发送ACK报文,其中ACK=1表示确认收到了服务器的FIN报文。

在TCP断开连接的过程中,每一次挥手都需要等待对方的确认,从而确保双方都已经准备好断开连接。通过断开连接前的四次握手,可以保证双方都已经完成了数据传输,并且都已经准备好断开连接,从而确保了数据传输的可靠性。

注意:断开之前需要保证彼此之间都没有数据需要传输了且双方都同意断开,才是一次完整的断开。

TCP传输细节

TCP通过以下细节来保证数据传输的可靠性

确认应答

对于发送方发送的数据,接收方如果接收到了会向发送反做出反馈表示自己确认收到了。

停止等待

当TCP发出一个段后,它启动一个定时器,等待目的端发送确认收报文,发送方接收到了确认报文,继续发送后续内容,在还未收到发送端的确认时,都应该保存好已经发送出去的内容,用于超时重传。

超时重传

发送出数据以后,报文和ACK都由可能丢失,但是发送端并不能确定具体哪个丢失,TCP协议如何处理?

如果不能及时收到一个确认应答,将重发这个报文段。

滑动窗口

客户端和服务端都能作为数据的发送端,如果每一次发送出的数据报都需要等待ACK返回,等待的过程将会耗费比较多的时间,传输效率大打折扣,为了提高传输效率。因此滑动窗口就产生了,那么具体过程是怎么的呢?

举例:假如需要发送10000个比特。分成10次发送。

第一次可以连续发送多个数据包,在连续的发送过程中,可能已经收到了前面数据报的确认应答报文,这时候窗口就可以向后移动,继续发送后面的数据,在这个过程中,窗口一般是持续移动的,因此基本就不需要等待了,提高了传输效率。

ACK丢失:ACK丢失都不是什么大问题,如果接收到了更大的确认序号,接收端也能明白小序号的已经收到了。

数据报丢失:数据报丢失时,ACK返回报文中会持续索要丢包的数据,直到索要成功返回ACK,然后继续索要后续的数据。

流量控制

TCP连接的双方都有一定大小的接收缓存空间,如果一方的发送能力太快,而一方的接收能力特别弱,可能会导致接收弱的一方缓存区溢出,导致数据丢失,那么有必要采用一些手段进行平衡发送和接收速率,TCP协议如何处理?

TCP报文首部有一个窗口参数,仅在ACK报文中生效,表示接收区缓冲区大小,窗口越大,发送速率就越快。当发送方获取到接收缓存区的信息,就会对窗口进行相应调整,来保证自己的发送速率不要过快/慢。如果窗口为0,说明接收缓存区满了,发送端就会停止发送并在一定时刻后发送探测报文,询问接收方缓存区是否有剩余空间。

拥塞控制

数据在互联网中传输过程具有不确定性,和很多的因素有关,因此数据在互联网中传输的速率也需要考虑,如果网络拥塞,导致很多数据丢包了,发送速率和接收速率很快的话,也会影响总体的传输速率,因为可能需要更多的时间对丢包的数据进行重传,那么是如何实现拥塞控制的呢?

通过不断实验的方法:慢启动的方式,开始给定一个比较小的窗口,如何没有出现丢包,逐渐的增大窗口,呈指数增长,到一定程度,呈线性增长,增大到一定程度发现丢包了,重新降到一个比较小的点,重新开始。

延迟应答

在流量控制中,通过ACK报文告诉发送方窗口的大小。当接收方收到了数据,那么这时缓存区也会相应的变小一些,为了回复给发送方ACK报文缓存区大一些,会等待一会时间让缓冲区的信息被应用读取,缓存区就变大了,这时再返回ACK报文窗口就能更大一些,发送方就可以发送更多的数据。

捎带应答

基于延迟应答的一种策略,ACK等待了一小段时间发送,可能这时候也需要发送响应,因此可以将ACK和响应数据一起发送,提高了传输效率。

粘包问题

产生原因:TCP是面向字节流进行传输的,发送方如果发送一个应用层数据包,不会出现什么问题。如果发送方一次发送多个应用层数据包,多个应用层数据包合并到一个TCP报文中发送了,接收方不能正确的判断边界,就容易出现问题。

解决方案:

  • 约定好应用层数据包的长度,每个包都有一个固定的长度,不足长度的使用空格方式补齐。
  • 每个包的末尾使用固定特殊字符分割,即使被拆分了,接收方也能通过特殊字符对包进行合并。
  • 应用层自定义一种协议或使用现有协议,将消息封装例如http协议。

TCP特征

  • 可靠性:TCP是一种可靠的传输协议,它提供数据传输的可靠性保证,能够在数据传输过程中检测和纠正传输中的错误,确保数据的完整性和准确性。

  • 基于连接:TCP是一种基于连接的协议,它要求在数据传输前先建立连接,然后才能进行数据的传输。这种基于连接的方式可以保证数据传输的可靠性和有序性。

  • 面向字节流:TCP是一种面向字节流的协议,它把数据看作是一个连续的字节流,而不是一个个分离的消息。

  • 全双工,同时可以接收也能发送数据。

基于TCP的应用层协议

HTTP(超文本传输协议)、SMTP(简单邮件传输协议)、FTP(文件传输协议)、SSH(协议)

UDP

1.什么是UDP

UDP(User Datagram Protocol)是一种无连接的传输层协议,而是简单地将数据报文从一个主机发送到另一个主机。UDP协议是一种轻量级的协议.

  1. 无连接:UDP是一种无连接的协议,发送数据之前不需要建立连接,也不需要维护连接状态,因此传输效率高。

  2. 不可靠:UDP不提供可靠的数据传输保证,发送数据时不会进行数据的重传和校验,数据包有可能在传输过程中丢失或者重复。

  3. 面向报文:UDP将应用程序传递给它的数据报文看作一个整体进行处理,不会进行数据分段和重组操作,因此能够保证数据的完整性。

  4. 简单快速:UDP的头部较小,没有复杂的连接控制和拥塞控制机制,因此传输速度较快。

  5. 支持广播和多播:UDP支持广播和多播功能,可以将数据同时发送给多个接收方。

  6. 适用于实时应用:UDP适用于实时应用,如在线游戏、视频会议等,因为它能够快速地传输数据,但不保证数据的可靠性。

2.UDP数据报格式

  1. 源端口:2字节需要对方响应时选用,不需要可以全用0
  2. 目的端口:2字节目的端口号
  3. 长度:2字节,UDP用户数据报的长度,最小值为8仅有首部。
  4. 校验和 2字节,检测用户数据报在传输过程中是否有误。有错就丢弃,可选,如果传送的检验和为0,说明发送端没有计算检验和,数据报会被丢弃 。使用CRC(循环冗余算法)。

基于UDP的应用层协议:NFS(网络文件系统)、TFTP(简单文件传输协议)、DHCP(动态主机配置协议)、DNS(域名解析协议)。

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

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

相关文章

几种预训练模型微调方法和peft包的使用介绍

文章目录 微调方法Lora(在旁边添加训练参数)Adapter(在前面添加训练参数)Prefix-tuning(在中间添加训练参数)Prompt tuning PEFTPEFT 使用PeftConfigPeftModel保存和加载模型 微调方法 现流行的微调方法有:Lora,promp…

【MySql】5- 实践篇(三)

文章目录 1. 日志和索引问题1. 日志相关问题1.1 两阶段提交 2. 业务设计相关问题 2. order by工作原理2.1 全字段排序2.2 rowid 排序2.3 全字段排序 VS rowid 排序 3. 正确显示随机消息3.1 内存临时表3.2 磁盘临时表3.3 随机排序方法 1. 日志和索引问题 1. 日志相关问题 1.1 …

NodeJs内置模块child_process

内置模块child_process子进程 写在前面 子进程是Nodejs的核心Api,如果你会shell命令,它会有非常大的帮助,或者你喜欢编写前端工程化工具之类,它也有很大的用处,以及处理CPU密集型应用。 创建子进程 Nodejs创建子进…

如何处理用户输入验证和表单提交?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

PCL点云处理之点云重建为Mesh模型并保存到PLY文件 ---方法二 (二百一十一)

PCL点云处理之点云重建为Mesh模型并保存到PLY文件 ---方法二 (二百一十一) 一、算法介绍二、算法实现1.代码2.效果一、算法介绍 离散点云重建为mesh网格模型,并保存到PLY文件中,用于其他软件打开查看,代码非常简短,复制粘贴即可迅速上手使用,具体参数根据自己的点云数据…

Unity可视化Shader工具ASE介绍——5、ASE快捷键和常用节点介绍

大家好,我是阿赵。   继续介绍Unity可视化Shader插件ASE。这次来说一些常用节点的快捷键,顺便介绍一些常用的节点。   用过UE引擎的朋友可能会发现,ASE的整体用法和UE的材质节点编辑器非常的像,甚至连很多节点的快捷键都和UE的…

【Vue面试题十六】、Vue.observable你有了解过吗?说说看

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:Vue.observable你有了解…

Python笔记;库,包,模块

在Python中库没有官方说法。 是其他地方沿用过来的。 姑且认为他是一个包或多个包的集合。 包里有子包和模块。 模块以.py格式存储。 下图是一个例子,对于Robot包: import math a math.sqrt(9) 等价于 from math import * a sqrt(9) from math im…

【数据库——MySQL(实战项目1)】(2)图书借阅系统——数据库测试、视图以及存储过程

目录 1. 简述2. 数据表 增、删、改 测试2.1 借阅人表2.2 图书表2.3 借阅信息表 3. 功能代码3.1 创建视图显示所有逾期未归还的借阅信息(包括借阅人姓名,借阅人类别,书名,借出日期,应归还日期,逾期时长&…

二叉搜索树--新增节点-力扣 701 题

例题细节二叉搜索树的基础操作-CSDN博客也讲过了&#xff08;put&#xff09;&#xff0c;下面给出递归实现 public TreeNode insertIntoBST(TreeNode node, int val) {//找到空位了if(node null) {return new TreeNode(val);}if(val < node.val) {//一直找到有null的位置…

草柴返利APP如何查询领取天猫内部隐藏优惠券购物拿天猫返利?

草柴返利APP是一种简单、快捷的购物省钱工具&#xff0c;可以帮助你在天猫上查询并领取内部隐藏优惠券&#xff0c;确认收货后拿购物返利。草柴返利APP可以轻松查询到天猫优惠券&#xff0c;让你购物更加方便&#xff0c;享受更多的折扣优惠。 草柴返利APP如何查询领取天猫优惠…

2、使用阿里云镜像加速器提升Docker的资源下载速度

1、注册阿里云账号并登录 https://www.aliyun.com/ 2、进入个人控制台&#xff0c;找到“容器镜像服务” 3、在“容器镜像服务”中找到“镜像加速器” 4、在右侧列表中会显示你的加速器地址&#xff0c;复制地址 5、进入/etc/docker目录&#xff0c;编辑daemon.json&#xff0…

jumpserver如何录入web资产

需要部署远程应用发布机&#xff0c;此机器需新建一台Windows机器&#xff0c;不要加域 本次环境&#xff1a;Windows 2019 server标准版&#xff0c;8U16G 系统设置-远程应用 设置完成后提交。 此发布机上需预先安装openssh&#xff0c;否则jumpserver无法部署应用发布机 …

第二章 进程与线程 二十、死锁的处理策略(预防死锁、避免死锁、死锁的检测和解除)

目录 一、分类 二、预防死锁 1、破坏互斥条件 2、破坏不剥夺条件 3、破坏请求和保持条件 4、破坏循环等待条件 5、总结 三、避免死锁 1、什么是安全序列 2、安全状态和不安全状态 3、银行家算法 &#xff08;1&#xff09;核心思想 &#xff08;2&#xff09;例子 …

【ElasticSearch】使用 Java 客户端 RestClient 实现对文档的查询操作,以及对搜索结果的排序、分页、高亮处理

文章目录 前言&#xff1a;RestClient 查询文档的 RestAPI一、全文检索查询1.1 match_all 查询1.2 match 查询1.3 multi_match 查询 二、精确查询2.1 term 查询2.2 range 查询 三、复合查询&#xff1a;Boolean 查询与 function score 查询的综合案例四、对查询结果的处理4.1 将…

关于Qualifier你要知道的二三事

&#x1f35e; Qualifier注解的作用-定义Bean-指定Bean的名称 Qualifier注解可以区分具有相同类型的多个Bean&#xff0c;用于明确指定要注入的Bean的名称或限定符。通过为要注入的Bean添加 Qualifier注解&#xff0c;你可以告诉Spring应该使用哪个Bean&#xff0c;以解决Spri…

黑马JVM总结(三十一)

&#xff08;1&#xff09;类加载器-概述 启动类加载器-扩展类类加载器-应用程序类加载器 双亲委派模式&#xff1a; 类加载器&#xff0c;加载类的顺序是先依次请问父级有没有加载&#xff0c;没有加载自己才加载&#xff0c;扩展类加载器在getParent的时候为null 以为Boots…

zabbix监控实战1

1、zabbix监控平台部署 重新克隆纯净虚拟机 数据库初始化 修改密码为WHqwerty123 初始化完成 创建zabbix数据库 基础配置和服务启动 访问 2、zabbix添加监控节点 修改字体文件 在客户端 手动添加监控节点 自动添加监控节点 3、zabbix api 自动注册 停掉自动发现 删掉serve…

VMware 下模拟软 RAID 的创建及故障恢复

Author&#xff1a;rab 目录 前言一、创建 RAID1.1 环境1.2 什么是 RAID&#xff1f;1.3 软 RAID 和硬 RAID1.4 如何创建软 RAID&#xff1f; 二、故障模拟与数据恢复2.1 故障模拟2.2 故障恢复 思考&#xff1f; 前言 一块物理硬盘要投入生产使用&#xff0c;一般会经历一下这…

面试经典 150 题 2 —(滑动窗口)— 3. 无重复字符的最长子串

3. 无重复字符的最长子串 方法 class Solution { public:int lengthOfLongestSubstring(string s) {int result 0, length s.length();int start 0, end 0;while(end < length){// 发现有重复字符时&#xff0c;可以直接把左指针移动到第一个重复字符的下一个位置for(i…