UDP、TCP

article/2025/9/21 1:30:23

传输层协议UDP、TCP

  • 一、TCP/UDP的任务
  • 二、UDP
    • 1.UDP概述
    • 2.UDP报文格式
    • 3.使用UDP的应用层协议
  • 三、TCP
    • 1.TCP概述
    • 2.TCP报文
    • 3.TCP三次握手
    • 4.四次挥手
    • 5.超时重传
    • 6.流量控制和快重传
    • 7.拥塞控制
    • 8.延迟应答、捎带应答
    • 9.粘包问题
    • 10.基于TCP的应用层协议
  • 四、总结

一、TCP/UDP的任务

在这里插入图片描述

我们在应用层调用网络相关的发送用户数据的接口时,本质不是直接把数据发送到网络中,而是把数据先拷贝到TCP/UDP的缓冲区里,而什么时候往网络里发送数据,发送多少数据,出错了怎么办的这些问题就是传输层协议要解决的。

二、UDP

1.UDP概述

用户数据报协议—UDP是传输层的协议,主要特点是:

  1. 无连接: 知道对端的IP和端口号就直接进行传输, 不需要建立连接。
  2. 不可靠: 没有确认机制, 没有重传机制。 如果因为网络故障数据没有发送到对方, UDP协议层也不会给应用层返回错误信息。
  3. 面向数据报: 应用层交给UDP多长的报文, UDP就发送多长的报文,不会拆分和合并。

UDP的缓冲区:
UDP没有真正意义上的发送缓冲区:
调用sendto时数据直接交给内核, 由内核将数据传给网络层协议进行后续的传输动作

UDP具有接收缓冲区:
接收缓冲区不能保证收到的UDP数据报顺序和发送顺序一致; 如果缓冲区满了, 再到达的UDP数据报就会被丢弃

2.UDP报文格式

在这里插入图片描述
长度:数据报的长度,最小为8字节(只有报头),最大是64K,如果传输的数据超过64K, 需要在应用层手动的分包, 多次发送, 并在接收端手动拼装
校验值:检测UDP数据报是否有错,有错就丢弃

3.使用UDP的应用层协议

在这里插入图片描述

三、TCP

1.TCP概述

TCP,大名鼎鼎的传输控制协议,其主要特点如下:

  1. ⾯向连接:应用程序在使用TCP前要先建立TCP连接,数据传送完毕要释放建立好的TCP连接。
  2. 可靠的:通过TCP协议传输的数据无差错、不丢失、不重复、按序到达。
  3. 面向字节流:
    在这里插入图片描述
    字节流形式的数据 “没有边界”,消息多⼤都可以进⾏传输,如果应用层拷贝到TCP缓存的数据太长,TCP可以把数据划分的短一些构成多个报文传送,如果数据太少,TCP可以等数据较多时再构成报文发出去。

2.TCP报文

TCP报文格式如下:

序列号:
TCP连接中传送的每一个字节都按顺序编号
在建⽴连接时,设置整个要传送的字节流的起始序号为计算机⽣成的随机数
序列号则是本报文段发送的数据的第一个字节的序号

确认号:
是期望收到对方下一个报文段的序列号,而且若确认号为N,表明到N-1为止的数据都已正确收到

首部长度:
表示该TCP头部有多少个32位bit(有多少个4字节);
因为是4位,表示的最大二进制数是15,所以TCP头部最大长度是15 * 4 = 60
最小是固定的20字节

窗口大小:
表明自己接收缓冲区剩余的空间大小,要求对方发送数据时必须考虑到这一点,这个值通常是动态变化的。

校验和:
校验的范围包括首部和数据
发送端填充CRC校验。接收端校验不通过, 则认为数据有问题

紧急指针:
指出了紧急数据的末尾在报文段中的位置

六位标志位:
URG: 为1代表紧急指针有效
ACK: 为1代表有效,连接建立后所有的报文ACK都为1
PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走
RST: 表明出现严重差错,必须释放连接重新建立
SYN: 为1代表这是一个连接请求(SYN=1,AVK=0)
或连接接受报文(SYN=1,AVK=1)
FIN: 通知对方, 本端要关闭了, 我们称携带FIN标识的为结束报文段

3.TCP三次握手

在这里插入图片描述

⼀开始,客户端和服务端都处于 CLOSED 状态。先是服务端主动监听某个端⼝,处于 LISTEN 状态
在这里插入图片描述
客户端会随机初始化序号( client_isn ),将此序号置于 TCP ⾸部的「序号」字段中,同时把 SYN 标志位置为 1 ,接着把SYN报⽂发送给服务端,表示向服务端发起连接,该报⽂不包含应⽤层数据,之后客户端处于 SYN_SENT 状态。
在这里插入图片描述
服务端收到客户端的 SYN 报⽂后,⾸先也随机初始化⾃⼰的序号( server_isn ),将此序号填⼊TCP ⾸部的「序号」字段中,其次把 TCP ⾸部的「确认应答号」字段填⼊ client_isn + 1 , 接着把 SYN和 ACK 标志位置为 1 。最后把该报⽂发给客户端,该报⽂也不包含应⽤层数据,之后服务端处于 SYN_RCVD 状态。
在这里插入图片描述
客户端收到服务端报⽂后,还要向服务端回应⼀个应答报⽂,⾸先该应答报⽂ TCP ⾸部 ACK 标志位置为 1 ,其次「确认应答号」字段填⼊ server_isn + 1 ,最后把报⽂发送给服务端,这次报⽂可以携带客户到服务器的数据,之后客户端处于 ESTABLISHED 状态。服务器收到客户端的应答报⽂后,也进⼊ ESTABLISHED 状态。此时连接就已建⽴完成,客户端和服务端就可以相互发送数据了。

4.四次挥手

在这里插入图片描述
客户端打算关闭连接,此时会发送⼀个 TCP ⾸部 FIN 标志位被置为 1 的报⽂,也即 FIN 报⽂,之后客户端进⼊ FIN_WAIT_1 状态。

服务端收到该报⽂后,就向客户端发送 ACK 应答报⽂,接着服务端进⼊ CLOSED_WAIT 状态。

客户端收到服务端的 ACK 应答报⽂后,之后进⼊ FIN_WAIT_2 状态。

等待服务端处理完数据后,也向客户端发送 FIN 报⽂,之后服务端进⼊ LAST_ACK 状态。

客户端收到服务端的 FIN 报⽂后,回⼀个 ACK 应答报⽂,之后进⼊ TIME_WAIT 状态。

服务器收到了 ACK 应答报⽂后,就进⼊了 CLOSED 状态,⾄此服务端已经完成连接的关闭。

客户端在经过 2MSL ⼀段时间后,⾃动进⼊ CLOSED 状态,⾄此客户端也完成连接的关闭。
在这里插入图片描述

5.超时重传

在这里插入图片描述

TCP的发送方在规定时间内没有收到确认报文就要重传已发送的报文。
没有收到确认报文可能是发送方的发送报文丢失,也可能是确认报文丢失,如果是确认报文丢失进行了超时重传,接收方会收到一些重复的报文,TCP协议利用前面提到的序列号识别出重复的包, 并且丢弃。

TCP为了保证高性能通信, 动态计算这个最大超时时间。

Linux中(BSD Unix和Windows也是如此), 超时以500ms为一个单位进行控制, 每次判定超时重发的超时
时间都是500ms的整数倍。
如果重发一次之后, 仍然得不到应答, 等待 2500ms 后再进行重传。
如果仍然得不到应答, 等待 4
500ms 进行重传,以此类推, 以指数形式递增。
累计到一定的重传次数, TCP认为网络或者对端主机出现异常, 强制关闭连接。

6.流量控制和快重传

上文解释过窗口的含义,还有一个概念是滑动窗口
滑动窗口其实是发送缓冲区的一部分(实际上缓冲区是头尾相接的环形):
在这里插入图片描述
假设A收到了B发来的确认报文,窗口是20字节,确认号是31,根据这两个数据A构造出自己的发送窗口如图

在没有收到B的确认报文的情况下,允许A可以把滑动窗口里的数据都发出去,但是在A收到B的确认报文前,发送出去的数据都要暂时保留在滑动窗口里,以便超时重传时使用。

显然,A的发送窗口里的数据量不能超过B的接收能力。

发送窗口的大小由前沿和后沿决定。窗口越大, 则网络的吞吐率就越高。

收到新确认,后沿就可以前移,没有收到,后沿不动。

前沿通常向前移动,但是由于接收方接受能力变低,前沿也可能不动。

前沿也可能向后收缩,但TCP标准强烈不赞成这样做

滑动窗口既保证了发送方的效率,又考虑了接收方的接受能力,这就是所谓的流量控制,这种机制从三次握手期间就开始了。

那如果丢包了怎么处理?
分两种情况
在这里插入图片描述
上图这种情况,ACK600丢失,但不需要重传,因为后续的ACK700被发送方收到

还有一种情况是发送方的报文丢失
那么发送方会一直连续收到接收方发来相同的ACK,连续收到三个就重新发送对应的报文,这种机制被称为 “高速重发控制”,也叫 “快重传”。

7.拥塞控制

⼀般,一个计算机⽹络都是很多主机共享的。因此可能会因为其他主机之间的通信使得⽹络拥堵。在⽹络拥堵时,如果发送⼤量数据包,可能会导致数据包时延、丢失,这时 TCP 会重传数据,但是重传就会导致⽹络的负担更重,这就需要拥塞控制

拥塞控制简单说就是⽹络发送拥塞时,TCP 会减少发送的数据量,为了在发送⽅调节发送数据量,定义了拥塞窗⼝的概念。拥塞窗⼝也是发送⽅的窗口,它会根据⽹络的拥塞程度动态变化。发送窗口的大小实际上是拥塞窗⼝和接收窗⼝中的最⼩值

拥塞窗⼝变化的规则:
只要⽹络中没有出现拥塞, 拥塞窗口变⼤;
⽹络中出现了拥塞, 窗口变小;

拥塞控制过程:
在这里插入图片描述

拥塞窗口大小开始为1,一开始是慢启动算法,呈指数增长,当窗口大小超过慢启动阈值(ssthresh), 不再按照指数方式增长, 而是按照线性方式增长。当网络拥塞,发生超时重传或快重传后需要重置拥塞窗口大小和慢启动阈值

在这里插入图片描述
例如:
在这里插入图片描述
发生快重传时:
在这里插入图片描述
例如:
在这里插入图片描述

8.延迟应答、捎带应答

延迟应答:
如果接收数据的主机立刻返回ACK应答, 这时候返回的窗口可能比较小。

假设接收端缓冲区为1M. 一次收到了500K的数据; 如果立刻应答, 返回的窗口就是500K;
但实际上可能处理端处理的速度很快, 10ms之内就把500K数据从缓冲区消费掉了;
在这种情况下, 接收端处理还远没有达到自己的极限, 即使窗口再放大一些, 也能处理过来;
如果接收端稍微等一会再应答, 比如等待200ms再应答, 那么这个时候返回的窗口大小就是1M;

窗口越大, 网络吞吐量就越大, 传输效率就越高。

不是所有的包都可以延迟应答

数量限制: 每隔N个包就应答一次
时间限制: 超过最大延迟时间就应答一次
具体的数量和超时时间, 依操作系统不同也有差异; 一般N取2, 超时时间取200ms

捎带应答:
在这里插入图片描述

9.粘包问题

首先要明确, 粘包问题中的 “包” , 是指的应用层的数据包!
TCP是基于字节流的,只维护发送出去多少,确认了多少,并没有维护消息与消息之间的边界,这就导致了粘包问题。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可参考这里🔗

10.基于TCP的应用层协议

在这里插入图片描述

四、总结

对比TCP/UDP

在这里插入图片描述
UDP 在传送数据之前不需要先建立连接,远端收到 UDP 报文后,不需要给出任何确认。虽然 UDP 不提供可靠交付,但在某些情况下 UDP 却是一种最有效的工作方式(一般用于即时通信),比如: QQ 语音、 QQ 视频 、直播等等

TCP 在传送数据之前必须先建立连接,数据传送结束后要释放连接。TCP 为了提供可靠的,面向连接的传输服务,采用了很多机制,同时就增加了时间和空间的开销。所以TCP报文首部也比UDP复杂,还要占用许多处理机资源。TCP 一般用于文件传输、发送和接收邮件、远程登录等场景。

TCP和UDP都是传输使用的工具, 什么时机用, 具体怎么用, 还是要根据具体的需求场景去判定

在这里插入图片描述

本文部分内容参考自
《计算机网络》 谢希仁
《图解网络》 小林


http://chatgpt.dhexx.cn/article/0Icv9cSI.shtml

相关文章

tcp udp proxy

服务目的 首先如下图所示: 作为一个内外网的通信,必须使用tcp 和 udp 的proxy 把内网和外网打通,比如中间是一个有两个网卡的路由器,打通以后,由proxy 发送数据到服务端,服务端按照上图处于外网。 服务端…

UDP-RTP协议解析

一、RTP协议 数据传输协议RTP,用于实时传输数据。RTP报文由两部分组成:报头和有效载荷 二、RTP的会话过程 当应用程序建立一个RTP会话时,应用程序将确定一对目的传输地址。目的传输地址由一个网络地址和一对端口组成,有两个端口&a…

UDP 理解

这里需要指出的一点是,伪首部完全是虚拟的,它并不会和用户数据报一起被发送出去,只是在校验和的计算过程中会被使用到,伪首部主要来自于运载UDP报文的IP数据报首部,将源IP地址和目的IP地址加入到校验和的计算中可以验证…

关于TCP/UDP

目录 1、TCP协议 1.1 TCP协议格式 1.2 TCP协议原理 2、UDP协议 在学习TCP/UDP之前先来了解以下整体的通信传输,它是一个向下封装、向上分用的过程: 这是TCP/IP四层模型,所以要想实现通讯,通过TCP建立和断开连接是至关重要的&a…

UDP详解

1、UDP数据包格式 UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传…

TCPUDP相关介绍

TCP and UDP TCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。 一个TCP连接必须要经过三次握手才能建立起来。断开连接需要四次挥手才…

TCPUDP

TCP:面向连接的服务,可靠的进程到进程的通信协议。(因为TCP里面封装了端口号,端口号就意味着一个服务,进程);应用场景:如:文件传输;HTTP应用层协议 UDP&…

TCP/UDP

Tcp / ip : 应用层、传输层、网络层、网络接口层 查看本机ip: windons r (进入交互换环境)ipconfigping 本机ip 查看本机网络有无问题 端口: 知名端口(固定端口):0—1023动态端口:程序可以设置的端口 1…

UDP协议的详细解析

UDP数据报 一、UDP的概述(User Datagram Protocol,用户数据报协议) UDP是传输层的协议,功能即为在IP的数据报服务之上增加了最基本的服务:复用和分用以及差错检测。 UDP提供不可靠服务,具有TCP所没有的优…

UDP协议详解

一、UDP协议概述 传输层另一个重要的协议就是用户数据报协议 UDP。UDP 只在 IP 的数据报服务之上增加了很少一点的功能&#xff0c;这就是复用和分用的功能以及差错检测的功能。 <注> UDP(User Datagram Protocol&#xff0c;用户数据报协议) UDP的主要特点是&#xff1a…

截图文字识别工具

tkinter程序源码&#xff1a;初识Python&#xff0c;如有不足请多指教。 import tkinter as tk import keyboard # 安装&#xff1a; pip install keyboard from PIL import ImageGrab # pip install pillow import time from aip import AipOcr # pip install baidu-a…

电脑截图如何快速识别文字?3分钟教会你快速截图识别怎么做

电脑截图已经成为我们日常生活中的常见操作&#xff0c;无论是工作还是学习&#xff0c;我们都有可能需要截取电脑屏幕上的某个区域进行保存或分享。但是&#xff0c;有时候我们需要识别截图中的文字内容&#xff0c;这时候该怎么办呢&#xff1f;接下来&#xff0c;本文将为大…

python截图识别文字_10几行代码,用python打造实时截图识别OCR|python基础教程|python入门|python教程...

https://www.xin3721.com/eschool/pythonxin3721/ 你一定用过那种“OCR神器”&#xff0c;可以把图片中的文字提取出来&#xff0c;极大的提高工作效率。 &#xff01; 今天&#xff0c;我们就来做一款实时截图识别的小工具。顾名思义&#xff0c;运行程序时&#xff0c;可以…

chrome拓展 --截屏文字识别

文章目录 场景源代码功能实现点击在页面上出现裁剪框百度云文字识别复制选中 参考 场景 因为学习通题目都加密了复制过来也无法进行搜题 无奈写了这个插件 为什么使用插件的形式 而不是脚本 &#xff1f; 使用了html2canvas结果是比的是dom文字变成了加密过的 无法识别 于是使用…

微信怎么识别图片文字?其实操作很简单

微信作为中国最流行的社交媒体应用程序之一&#xff0c;已经成为人们分享照片和信息的主要平台之一。在微信中&#xff0c;用户可以轻松地将照片上传到朋友圈或与朋友共享。然而&#xff0c;在某些情况下&#xff0c;这些照片上可能有一些重要的文字信息&#xff0c;这些信息需…

电脑截图怎么识别文字?识别原理又是什么?

在日常工作和生活中&#xff0c;我们经常需要从图片或截图中提取文字&#xff0c;但是手动输入费时费力&#xff0c;因此电脑截图文字识别技术应运而生。本文将介绍电脑截图文字识别的原理和方法。 OCR技术的原理 OCR是一种光学字符识别技术&#xff0c;其原理是将图片中的文字…

C# 通用OCR识别 文字识别 中文识别

软件说明 基于以下两个开源项目&#xff0c;做了再次封装 https://github.com/paddlepaddle/PaddleOCR PaddleOCRSharp: 本项目是一个基于PaddleOCR的C代码修改并封装的.NET的OCR工具类库。包含文本识别、文本检测、基于文本检测结果的统计分析的表格识别功能&#xff0c;同…

手把手教截图识别文字

点击上方 毛利学python&#xff0c;选择置顶或星标 第一时间送达Python 技术干货&#xff01; 最近不想打字&#xff0c;直接截图然后识别出来文字&#xff0c;不就可以不用打吗&#xff1f;我就是太懒了。 keyboard 这个库让你可以控制和监控输入设备。 对于每一种输入设备&a…

屏幕可以截图识别文字?我来教你

我们经常浏览一些网页的时候&#xff0c;看到一些优美的文字&#xff0c;想将它复制下来&#xff0c;却发现粘贴的时候都是一些乱码之类的&#xff0c;以前我估计你们大多数的人都会选择用手抄&#xff0c;但是今天我来了&#xff0c;我给大家介绍一个非常有用的一个方法&#…

python截图识别文字_Python技术:截图文字识别工具

#01 截图文字识别工具 有时候在海报上面&#xff0c;图片上面&#xff0c;或者PDF文档中&#xff0c;经常出现一些唯美的文字。这个时候想要复制下来才发现不能复制。因为有的是图片&#xff0c;有的是PDF。 可以使用Python制作一个小工具&#xff0c;来识别图片上的文字。但…