TCPUDP
TCP
1.什么是TCP
TCP是处于运输层的通信协议,该协议能够实现数据的可靠性传输。
2.TCP报文格式
源端口和目的端口:各占两个字节,发送进程的端口和接收进程的端口号。
序号:占4个字节,序号如果增加到溢出,则下一个序号从0开始,在TCP传输过程中,传送的每一个字节流都是按顺序编号的。首部中的序号指的是发送数据的第一个字节流的编号。例如当前发送第一个字节流序列号为201,数据部分一共100个字节,那么下一次发送的序号就是301.
确认号:占4字节,期望收到对方下一个报文段数据第一个字节的编号。
数据偏移:占4位,单位是4字节,TCP报文的的首部长度。
保留字段:占6位,保留今后使用。
控制字段6位:
- 第一位URG(紧急标志位):为1时,表示紧急标指针有效,告诉系统此报文为一个紧急数据,应尽快送达。发送的优先级更高。
- 第二位ACK(确认):当为1时,确认号字段有效,ACK为0时,确认号无效,连接建立和确认应答有用。
- 第三位PSH(推送):为1时有效,发送方希望接收方收到推送包,立即将该包交付给上层协议,不要等到缓存区满了在向上交付。
- 第四位RST(复位):为1时有效,表面TCP连接出现严重差错,必须释放连接,重新建立连接.
- 第五位SYN(同步):在连接建立时用来同步序号,当SYN = 1,而ACK = 0时,表面这是一个连接请求报文段,如果接收方同意连接,则应返回SYN = 1和ACK = 1的报文段.
- 第六位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建立连接的过程吧。
建立连接:
-
客户端向服务器发送SYN报文,其中SYN=1表示建立连接请求,同时将初始序列号seq=x发送给服务器。
-
服务器接收到SYN报文后,向客户端发送SYN+ACK报文,其中SYN=1表示确认建立连接请求,同时也向客户端发送了自己的初始序列号seq=y和ack = x+1。
-
客户端接收到SYN+ACK报文后,向服务器发送ACK报文,其中ACK=1表示确认收到了服务器的确认建立连接请求的报文,并将确认号ack=y+1发送给服务器。此时,TCP连接已经建立。
在TCP三次握手的过程中,客户端和服务器都会发送SYN和ACK报文,以确保双方都能够正常收发数据。通过建立连接前的三次握手,可以保证双方都已经准备好传输数据,从而确保了数据传输的可靠性。
既然有连接,那么就有一个断开的过程,客户端不想在向服务端发送数据了,为了保障资源的利用,客户端向服务端申请断开连接。下面看看TCP是如何断开连接的吧。
断开连接:
-
客户端向服务器发送FIN报文,其中FIN=1表示客户端已经没有数据要发送了。
-
服务器接收到FIN报文后,向客户端发送ACK报文,其中ACK=1表示确认收到了客户端的FIN报文,由系统内核自动回复。
-
服务器向客户端发送FIN报文,其中FIN=1表示服务器已经没有数据要发送了,一般由应用程序触发。
-
客户端接收到FIN报文后,向服务器发送ACK报文,其中ACK=1表示确认收到了服务器的FIN报文。
在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协议是一种轻量级的协议.
-
无连接:UDP是一种无连接的协议,发送数据之前不需要建立连接,也不需要维护连接状态,因此传输效率高。
-
不可靠:UDP不提供可靠的数据传输保证,发送数据时不会进行数据的重传和校验,数据包有可能在传输过程中丢失或者重复。
-
面向报文:UDP将应用程序传递给它的数据报文看作一个整体进行处理,不会进行数据分段和重组操作,因此能够保证数据的完整性。
-
简单快速:UDP的头部较小,没有复杂的连接控制和拥塞控制机制,因此传输速度较快。
-
支持广播和多播:UDP支持广播和多播功能,可以将数据同时发送给多个接收方。
-
适用于实时应用:UDP适用于实时应用,如在线游戏、视频会议等,因为它能够快速地传输数据,但不保证数据的可靠性。
2.UDP数据报格式
- 源端口:2字节需要对方响应时选用,不需要可以全用0
- 目的端口:2字节目的端口号
- 长度:2字节,UDP用户数据报的长度,最小值为8仅有首部。
- 校验和 2字节,检测用户数据报在传输过程中是否有误。有错就丢弃,可选,如果传送的检验和为0,说明发送端没有计算检验和,数据报会被丢弃 。使用CRC(循环冗余算法)。
基于UDP的应用层协议:NFS(网络文件系统)、TFTP(简单文件传输协议)、DHCP(动态主机配置协议)、DNS(域名解析协议)。
相关文章:

TCPUDP
TCP 1.什么是TCP TCP是处于运输层的通信协议,该协议能够实现数据的可靠性传输。 2.TCP报文格式 源端口和目的端口:各占两个字节,发送进程的端口和接收进程的端口号。 序号:占4个字节,序号如果增加到溢出,则下一个序…...

设计模式 - 备忘录模式
目录 一. 前言 二. 实现 三. 优缺点 一. 前言 备忘录模式又称快照模式,是一种行为型设计模式。它可以在不破坏封装性的前提下捕获一个对象的内部状态,并在对象之外保存这个状态,以便在需要的时候恢复到原先保存的状态。在不违反封装的情况…...

OpenCV4(C++)—— 几何图形的绘制
文章目录 一、基本图形1、线2、线圆3、线椭圆4、矩形 二、多边形 一、基本图形 1、线 绘制线,要给出两个点坐标 void cv::line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color, int thickness 1, int lineType LINE_8, int shift 0);…...

智能优化算法常用指标一键导出为EXCEL,CEC2017函数集最优值,平均值,标准差,最差值,中位数,秩和检验,箱线图...
声明:对于作者的原创代码,禁止转售倒卖,违者必究! 之前出了一篇关于CEC2005函数集的智能算法指标一键统计,然而后台有很多小伙伴在询问其他函数集该怎么调用。今天采用CEC2017函数集为例,进行展示。 为了突…...

python文件打包方式汇总
在Python中,你可以使用多种方法来打包你的项目,以下是最常见的两种方式: 使用PyInstaller: PyInstaller是一个非常实用的工具,可以将Python程序打包成独立的可执行文件。这样,你就可以在没有Python环境的…...

基于ChatGPT+词向量/词嵌入实现相似商品推荐系统
最近一个项目有个业务场景是相似商品推荐,给一个商品描述(比如 WIENER A/B 7IN 5/LB FZN ),系统给出商品库中最相似的TOP 5种商品,这种单纯的推荐系统用词向量就可以实现,不过,这个项目特点是商品库巨大,有…...

虾皮商品链接获取虾皮商品详情数据(用 Python实现虾皮商品信息抓取)
在网页抓取方面,可以使用 Python、Java 等编程语言编写程序,通过模拟 HTTP 请求,获取虾皮网站上的商品页面。在数据提取方面,可以使用正则表达式、XPath 等方式从 HTML 代码中提取出有用的信息。值得注意的是,虾皮网站…...

【数据库系统概论】数据查询之单表查询。详细解释WHERE、OEDER BY、GROUP BY 和 HAVING
前言 ❓单表查询选择表中的若干列查询经过计算的值选择表中的若干元组(行)消除取值重复的行查询满足条件的元组(WHERE) 对查询结果排序(ORDER BY)聚集函数对查询结果分组(GROUP BY) …...

2023年医药商业行业发展研究报告
第一章 行业概况 1.1 定义 医药商业行业,作为医药领域的重要组成部分,扮演着至关重要的角色。这一行业专注于医药商品的经营与流通,确保药品能够有效、安全地到达消费者手中。随着医药科技的进步和市场需求的增长,医药商业行业在…...

Android 消息机制
Android 消息机制 Android 的消息机制也是Handler机制,主要作用是用来在不同线程之间通信,通常使用在子线程执行完成一些儿耗时操作,需要回到主线程更新UI时,通过Handler将有关UI操作切换到主线程。由于Android中主线程不可进行耗…...

QT计时器QTime的使用举例
Qt 中的计时器(QTimer)是一种用于执行定时操作的机制。您可以使用 QTimer 来执行周期性任务、在一段时间后执行操作或创建间隔定时器。以下是使用 QTimer 的基本步骤以及一个简单的示例: **包含头文件:**首先,确保您的…...

js中await用法
在JavaScript中,await用于暂停异步函数执行,等待Promise对象的解决。当Promise对象解决时,await将返回被解决的值,否则它将抛出一个被拒绝的Promise错误。 下面是一些使用await的例子: 使用await等待一个Promise对象…...

Qt多工程同名字段自动翻译工具
开发背景 项目里不同工程经常会引用同一批公共类,这些类里如果有字段需要翻译,需要在不同的项目里都翻译一遍,比较麻烦冗余。 特此开发了这个小翻译工具,能读取程序目录下的所有ts文件,以类名归类,不同项目…...

vue3+elementui实现表格样式可配置
后端接口传回的数据格式如下图 需要依靠后端传回的数据控制表格样式 实现代码 <!-- 可视化配置-表格 --> <template><div class"tabulation_main" ref"myDiv"><!-- 尝试过在mounted中使用this.$refs.myDiv.offsetHeight,获取父元素…...

x11截屏源码(ubuntu18.04)
使用x11库实现截屏并保存为png图片 【shot.c】 // filename: shot.c #include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/Xatom.h> #include <X11/cursorfont.h> #include <png.h> #include <stdio.h> #include <stdlib.h>…...

【ComfyUI】MacBook Pro 安装(Intel 集成显卡)
文章目录 环境概述配置pip镜像配置pip代理git配置(选配)下载comfyUI代码创建、激活虚拟环境下载依赖安装torchvision启动comfyUI为什么Mac不支持CUDA,即英伟达的显卡?安装Intel工具包 环境 显卡:Intel Iris Plus Grap…...

HTTPS 加密全过程
加密协议以前是SSL,现在都是TLS, 而证书现在大多数都是SSL证书 抓包流程: TCP三次握手过后, 客户端发送Client Hello 服务器相应Server Hello 服务器再次响应发送证书: 服务器再发送公钥:...

联邦学习综述二
联邦学习漫画 联邦学习漫画链接: https://federated.withgoogle.com/ Federated Analytics: Collaborative Data Science without Data Collection 博客链接: https://blog.research.google/2020/05/federated-analytics-collaborative-data.html 本篇博客介绍了联邦分析&a…...

Idea本地跑flink任务时,总是重复消费kafka的数据(kafka->mysql)
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Idea中执行任务时,没法看到JobManager的错误,以至于我以为是什么特殊的原因导致任务总是反复消费。在close方法中,增加日志,发现jdbc连接被关闭了。 重新…...

基于nodemailer实现邮件发送
概述 node中可用nodemailer实现邮件的发送。本文使用QQ邮箱实现邮件的发送。 实现效果 实现 1. QQ邮箱配置 首先需要开启POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,如下图所示。 生成授权码 2. 发送邮件 发送邮件的代码比较简单,如下…...

【PostgreSQL内核学习(十八)—— (数据库表参数)】
数据库表参数 default_reloptions 函数案例 声明:本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。 本文主要参考了《PostgresSQL数据库内核…...

区块链的两个核心概念之一签名, 另一个是共识.
Alice的公私钥, 签名和验证签名仅仅确定了Alice对数字资产A所有权的宣言. 之后, Bob也可以用自己的私钥对资产A进行签名宣誓所有权。区块链中叫双花,即重复宣称所有权, 也称重复花费交易。这时候需要共识算法(集体成员pow或委员会代表pos监督…...

wpf中prism框架切换页面
主页面...

正则表达式(Regular Expression)学习网址分享
正则表达式(Regular expressions,也叫REs、 regexs 或regex patterns),是一种文本模式,包括普通字符(例如,a 到z 之间的字母)和特殊字符(称为"元字符"…...

【已解决】socket.gaierror: [Errno -3] Temporary failure in name resolution
问题描述 今天在环境迁移的过程中遇到多个问题,包括ModuleNotFoundError: No module named flask,socket.gaierror: [Errno -3] Temporary failure in name resolution以及Downloading: "https://huggingface.co/gyrojeff/YuzuMarker.FontDetection…...

CUDA code=700(cudaErrorIllegalAddress) 报错与排查方法
CUDA code700(cudaErrorIllegalAddress) 报错与排查方法 最近笔者在调试自己写的 CUDA 代码时, 遇到了 code700(cudaErrorIllegalAddress) 的报错, 在此记录一下排查和解决方法. 报错 报错是由 CUDA API 函数执行时产生的, 由 checkCudaErrors() 函数检测出(CUDA 常用错误检…...

项目管理过程组
项目管理有2条主线,一条是技术,一条是管理。项目过程由项目团队实施。一般术语以下两大类之一:一类是项目管理过程。另一类是面向产品的过程。在大多数情况下,大多数项目都有共同的项目管理过程。它们通过有目的的实施而互相联系起…...

python每日一练(5)
🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…...

经典循环命题:百钱百鸡
翁五钱一只,母三钱,小鸡三只一钱;百钱百鸡百鸡花百钱。 (本笔记适合能熟练应用for循环、会使if条件分支语句、能格式化字符输出的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:…...

IDEA使用模板创建webapp时,web.xml文件版本过低的一种解决方法
创建完成后的web.xml 文件,版本太低 <!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>Archetype Created Web Appl…...