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. 发送邮件 发送邮件的代码比较简单,如下…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
Java并发编程实战 Day 11:并发设计模式
【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天,今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案,它们不仅提供了优雅的设计思路,还能显著提升系统的性能…...
电脑桌面太单调,用Python写一个桌面小宠物应用。
下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡,可以响应鼠标点击,并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...
