当前位置: 首页 > backend >正文

TCP和UDP

目录

TCP

头部信息

TCP连接过程

三次握手

四次挥手

TCP的可靠性

UDP

头部信息

传输过程

两者的区别

使用场景


TCP

TCP是一种面向连接的,可靠性高,可以流量控制,适合传输大量数据的协议,但需要进行三次握手因此耗时长

什么是面向链接?在正式传输数据之前,先适用预先的协议,建立点到点的链接。TCP便是建立了一个双向的会话连接,通讯双方都可以向对方发送数据。

头部信息

最短有20字节

  • 源/目的端口号:用于建立端到端的连接
  • seq序号(32位):本次发送报文的第一个字节编号
  • ack确认序号(32位):期望收到的下一个字节编号
  • 首部长度:数据偏移,指出报文数据开始的地方距离TCP报文段起始处有多远
  • ACK:响应确认
  • PSH:推送标志,立即将缓存中的数据推送给相应进程
  • PST:复位标志,重新建立连接
  • SYN:建立连接
  • FIN:关闭连接
  • 窗口大小:告知接收窗口的大小(发送<=接收)
  • 校验和:校验范围包括首部和数据以及伪首部,校验方式:将16位按1的补码形式相加,然后对和取反
  • 紧急指针和URG:URG配合紧急指针,当URG=1,紧急指针有效,紧急指针给出紧急报文的最后一个字节的序号;紧急指针用于传输大量数据中途发现问题时,需要停止程序的运行

TCP连接过程

三次握手

  1. 第一次握手(SYN=1,seq=x):由客户端发出连接请求到服务器
  2. 第二次握手(SYN=1,seq=y,ACK=1,ack=x+1):再由服务器回话个客户,让客户知道自己已经收到了它的连接建立的请求,同时也告诉客户端我也同意建立连接
  3. 第三次握手(SYN=1,seq=x,ACK=1,ack=y+1):客户端在此回话表示收到服务器同意建立连接的报文,此时双方方可以稳定建立连接,三次握手完成时就可以进行数据传输。

必须进行三次的原因:三次是最少必要交互次数,能够确保通信双方都能接受并发送数据建立稳定连接;如果只有两次握手,只能确保客户端-->服务器可达,服务器无法确认客户端能否接收到自己发送的数据(SYN=1,seq=y,ACK=1,ack=x+1),第三次握手确认了客户端能够接收到服务器的信息

四次挥手

  1. 第一次挥手(FIN=1,seq=u):客户端给服务器发出连接断开请求
  2. 第二次挥手(ACK=1,seq=v,ack=u+1):当服务器收到后,给客户端回复,表明收到断开连接的请求
  3. 第三次挥手(FIN=1,ACK=1,seq=w,ack=u+1):再次由服务器给客户端发送关闭连接的请求
  4. 第四次挥手(ACK=1,seq=u+1,ack=w+1):客户端收到后,再次给服务器发送同意的信息时,不会立马关闭连接,等服务器关闭连接后,客户端立马关闭连接

前两次是断开客户端-->服务器的连接

后两次是断开服务器-->客户端的连接

TCP的可靠性

TCP的可靠性源自于核心机制:确认,重传,排序,流控

确认:接收方告知发送方数据已经成功接收,有两种实现方式

  • 累积确认:累积收到一段数据后,发送ACK为期望收到的下一个字节的序号(收到序号为1-1000的数据,发送的ACK=1001)
  • 选择确认:通过扩展选项明确改制哪些数据块已经收到,减少不必要的重传

重传:即重新发送数据包,有两种触发条件

  • 超时重传:发送方在一定时间(RTO)内未收到ACK回复
  • 快速重传:连续收到3次重复的ACK,则认为传输的数据丢失,立即重传

排序:为确保数据按发送顺序交付给应用层,每个字节分配唯一的序号(seq),接收方在缓存存放混乱序号的数据,知道缺失序号到达后排序(通过滑动窗口管理发送和接收的顺序)

流控:防止发送方速率过快导致接收方缓存区溢出(解决接收方缓存区溢出)

  • 滑动窗口:发送方通过TCP头部报文的窗口大小字节知道接收方缓存区的大小,发送的数据大小<=窗口大小
  • 动态调整:发送方根据窗口值调整发送速率
  • 零窗口探测:接收方窗口为0时(即缓存区已满),发送方定期发送探测报文

拥塞控制(有关滑动窗口的关键算法,区别于流控,拥塞用于解决网络堵塞问题)

  • 慢启动:窗口(cwnd)从1开始,每次收到ACK回复后 cwnd*2 指数增长,增长直到达到慢启动阈值(ssthresh)或发生丢包。

  • 拥塞避免:cwnd >= ssthresh时,每次收到ACK回复后cwnd+1,增长至阈值。

  • 快恢复:当收到重复ACK表示丢包但网络仍有流动性时,窗口减半,避免全局同步。

慢启动(指数增长) ---> 拥塞避免(线性增长) --发生丢包--> 严重:慢启动,cwnd=1,阈值减半;轻微:快恢复,cwnd减半接着传输

UDP

UDP是面向数据报的,不那么可靠,但传输速度快,适合少量数据

头部信息

  • 源/目端口号:建立端到端的连接
  • TTL生存时间:数据包每经过一个路由器的转发,其数值减1,当一个数据包的TTL值为0时,路由器将不再转发而直接丢弃
  • 校验和:检测数据报完整性

传输过程

发送端

  1. 应用程序将数据交给UDP协议
  2. 协议将数据分割成数据报,添加头部信息
  3. 数据报通过网络传输给接收端

接收端

  1. 接收到数据报后将数据交给UDP
  2. UDP验证校验和,去掉头部后将数据交给上层对应的应用程序

两者的区别

  1. TCP是面向链接的协议,而UDP是无连接的协议
  2. TCP协议的传输是可靠的,而UDP协议的传输是”尽力而为“
  3. TCP协议可以实现流控,而UDP不行
  4. TCP可以分段,而UDP不行
  5. TCP小号资源较大,传输效率较低,而UDP小号资源小,速度快

使用场景

  • TCP协议更适用于对可靠性要求较高,但是对传输效率和资源占用要求较低的场景(电子邮件、文件传输)
  • UDP更适用于对传输效率要求较高,可靠性要求较低的场景(实时会议、直播、多人游戏)

http://www.xdnf.cn/news/1192.html

相关文章:

  • Windows 同步-Windows 单向链表和互锁链表
  • Typebot:开源、强大、可自托管的聊天机器人构建工具
  • DES、3DES、SM4 加密算法简介
  • 查看Spring Boot项目所有配置信息的几种方法,包括 Actuator端点、日志输出、代码级获取 等方式,附带详细步骤和示例
  • 第十五届蓝桥杯 2024 C/C++组 下一次相遇
  • Uniapp:navigator(页面跳转)
  • 【飞渡科技数字孪生虚拟环境部署与集成教程 - CloudMaster实战指南】
  • KDD Cup 2017 数据集分析
  • G1 人形机器人软件系统架构与 Python SDK
  • BeeWorks:专业的企业Im即时通讯平台
  • PyTorch深度学习框架60天进阶学习计划 - 第48天:移动端模型优化(二)
  • flutter 插件收集
  • 15openlayers获取VectorLayer上的数据
  • C++学习:六个月从基础到就业——C++学习之旅:STL容器详解
  • webpack基础使用了解(入口、出口、插件、加载器、优化、别名、打包模式、环境变量、代码分割等)
  • v-html 显示富文本内容
  • Crawl4AI:打破数据孤岛,开启大语言模型的实时智能新时代
  • 【MCP Node.js SDK 全栈进阶指南】中级篇(3):MCP高级资源设计
  • 进行性核上性麻痹饮食指南:科学膳食提升生活质量
  • 学习Docker遇到的问题
  • SpringBoot高校心理健康系统实现与开发
  • 测试-时间规模化定律可以改进世界基础模型吗?
  • Go 剥离 HTML 标签的三把「瑞士军刀」——从正则到 Bluemonday
  • 实用生活c语言脚本
  • Linux-skywalking部署步骤并且添加探针
  • springboot项目配置springMVC
  • DB-GPT支持mcp协议配置说明
  • leetcode 二分查找
  • TS-300B浊度传感器详解(STM32)
  • 欧拉计划 Project Euler53(组合选择)题解