网络编程——TCP和UDP详细讲解

文章目录

  • TCP/UDP全面详解
    • 什么是TCP和UDP?
    • TCP如何保证可靠性?
      • 1. 序列号(Sequence Number)
      • 2. 确认应答(ACK)
      • 3. 超时重传(Timeout Retransmission)
      • 4. 窗口控制(Sliding Window)
      • 5. 快速重传(Fast Retransmit)
    • 三次握手(建立连接)
    • 四次挥手(断开连接)
    • 为什么是三次握手?为什么是四次挥手?
      • 三次握手的原因
      • 四次挥手的原因
    • TCP和UDP特点
    • TCP拥塞控制
      • 一、慢启动(Slow Start)
        • 举例:
      • 二、拥塞避免(Congestion Avoidance)
        • 举例:
      • 三、超时重传与慢启动重启
      • 处理方法:
    • 四、快速重传与快速恢复(Fast Retransmit & Fast Recovery)
      • 快速重传行为:
      • 快速恢复行为:
    • 拥塞控制减慢增长速度的条件总结
      • 拥塞控制会减慢增长速度的时机:
    • TCP/IP 数据链路层的交互过程简述
    • TCP 和 UDP 如何区分?
    • UDP 中的 `connect()` 函数原理
      • `connect()` 的作用:
    • TCP连接中的 TIME_WAIT 状态详解
      • 一、TIME_WAIT 状态如何产生?
      • 二、TIME_WAIT 的两个核心作用
        • 1. 确保连接的可靠关闭
        • 2. 避免旧连接干扰新连接
      • 三、TIME_WAIT 的副作用与优化
        • ✅ 解决方法:
    • TCP的模型

TCP/UDP全面详解

什么是TCP和UDP?

TCP(Transmission Control Protocol)叫传输控制协议,是面向连接可靠传输的协议。
UDP(User Datagram Protocol)叫用户数据报协议,是无连接尽最大努力交付的协议。

一句话总结:

  • TCP可靠但慢,像寄快递(要签收、确认收货)
  • UDP快速但可能丢失,像发传单(发了就发了,收不收无所谓)

TCP如何保证可靠性?

TCP为了确保数据能安全、完整送到对方,设计了很多机制,主要有:

1. 序列号(Sequence Number)

每发送一段数据,TCP都会打个"编号"。
比如发送第一包数据编号1001,第二包编号2001,接收方按照编号顺序排列,避免了丢包、乱序问题。

2. 确认应答(ACK)

接收方收到数据后,会回一条确认信息(ACK),告诉发送方:“我收到了!下一包从xxxx开始发。”
如果发送方迟迟收不到确认,就会怀疑数据丢了。

3. 超时重传(Timeout Retransmission)

如果一定时间(超时)还没收到确认,发送方就自动重发
一般超时时间 = 2 × RTT(往返时延)+ 偏差值。

4. 窗口控制(Sliding Window)

为了提高速度,TCP可以同时发多包,不需要一包一确认。
窗口大小定义了一次可以连续发送多少数据而不用等确认

小例子:
窗口大小=3,发送方可以连续发第1包、第2包、第3包数据,不用等第1包的确认就发第2包!

5. 快速重传(Fast Retransmit)

如果连续收到3个相同的ACK(比如一直提示1001未收到),发送方立刻重发缺失的数据段,而不用等超时。


三次握手(建立连接)

  1. 客户端发送SYN报文,请求建立连接(SYN=1,seq=J)。
  2. 服务器收到后,发送SYN+ACK报文,表示接受(SYN=1,ACK=1,seq=K,ack=J+1)。
  3. 客户端再回一个ACK报文,确认连接建立(ACK=1,ack=K+1)。

三次握手后,双方就可以正式通信了。
在这里插入图片描述

特别感谢@frozendure绘制的图片。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四次挥手(断开连接)

  1. 客户端发FIN报文,请求断开(主动关闭)。
  2. 服务器收到后,回ACK确认(被动关闭)。
  3. 服务器数据发完后,也发FIN报文。
  4. 客户端收到FIN后,回ACK确认,进入TIME_WAIT等待一段时间后彻底关闭。

小图示:
在这里插入图片描述


为什么是三次握手?为什么是四次挥手?

三次握手的原因

  • 防止陈旧连接(老旧、失效的请求包)误建立连接。
  • 确保双方收发能力正常
    如果只两次握手,可能因为网络延迟,服务器误认为客户端还想建立新连接,导致资源浪费。假设两次握手时,A发出的第一个请求连接报文段在某一网络节点长时间滞留,以致延误到连接释放后才到达B。B收到失效的连接请求报文段后,认为是A又发出一次新的连接请求。于是向A发送确认报文段,同意建立连接,此时在假定两次握手的前提下,连接建立成功。这样会导致B的资源白白浪费
    假设两次握手时,A发出一个请求报文段,但发送过后A就因为问题而导致下线。之后B收到了A发来的请求连接报文段,给A发送确认报文段,同意建立连接,此时在假定两次握手的前提下,连接建立成功。这样会导致B的资源白白浪费
  • 第一次握手(客户端发送SYN):保证客户端能够发送数据。
  • 第二次握手(服务器发送SYN-ACK):保证服务器能够接收并发送数据。
  • 第三次握手(客户端发送ACK):保证客户端能够接收数据。

四次挥手的原因

  • TCP是全双工,发送和接收需要分别关闭
  • 一方关闭发送,不代表另一方立即也关闭发送,因此需要两次FIN和两次ACK,确保双方都完成通信。

TCP和UDP特点

项目TCPUDP
是否连接面向连接(需三次握手)无连接
可靠性可靠,具备确认应答、重传机制不可靠,尽力而为
传输速度较慢(因连接建立和状态维护)较快(无需连接、开销小)
传输单位字节流(Stream)数据报(Datagram)
是否顺序保证顺序到达不保证顺序
占用资源较多(需维护连接状态)较少
安全性容易受到SYN洪水攻击等较少攻击面
优点可靠性高、顺序到达快速、资源开销小
缺点速度慢、资源占用高、易被攻击不可靠、易丢包、乱序
适用场景要求高可靠性,能容忍延迟要求实时性强,容忍丢包
应用实例文件传输(FTP)、发送邮件(SMTP)、网页浏览(HTTP)视频通话(VoIP)、在线视频直播、网络游戏、广播

TCP拥塞控制

在 TCP 通信中,如果发送端窗口设置过大,会在短时间内发送大量数据,这可能导致中间路由器和接收端缓冲区被挤爆,进而引发丢包、重传等问题。TCP 拥塞控制是指通过动态调整数据发送速率,避免过多的数据包涌入网络,从而引起网络拥堵甚至网络瘫痪的一种机制。

因此,TCP 引入了拥塞控制窗口(cwnd),并采用如下四种主要算法动态调整窗口大小:


一、慢启动(Slow Start)

  • 初始化拥塞窗口 cwnd = 1(以 MSS 为单位)。
  • 每收到一个确认应答(ACK),就将 cwnd 翻倍(即指数增长)。
  • 每经过一个 RTT,cwnd *= 2。
举例:
  1. 第一个 RTT:cwnd = 1
  2. 第二个 RTT:cwnd = 2
  3. 第三个 RTT:cwnd = 4
  4. 第四个 RTT:cwnd = 8

✅ 优点:快速提高网络利用率
❌ 缺点:指数增长可能迅速导致拥塞


二、拥塞避免(Congestion Avoidance)

当 cwnd 达到慢启动阈值 ssthresh(一般初始值为 65536 字节),就不再使用慢启动的指数增长,而是进入拥塞避免阶段。

  • 每经过一个 RTT,仅将 cwnd 加 1(线性增长)。
  • 防止窗口增长过快引发网络拥塞。
举例:
  1. cwnd = 64,到达 ssthresh
  2. 后续每次 ACK,cwnd = cwnd + 1/cwnd ≈ 每 RTT 增加 1

三、超时重传与慢启动重启

如果出现报文段超时未收到 ACK,TCP 认为网络出现拥塞。

处理方法:

  1. ssthresh 设置为当前 cwnd 的一半;
  2. 将 cwnd 设为 1;
  3. 重新进入慢启动阶段

🔁 这是 TCP 的自我修复机制,避免持续拥塞。


四、快速重传与快速恢复(Fast Retransmit & Fast Recovery)

如果收到 3 个重复的 ACK(即 ACK 重复了 3 次),TCP 认为某个报文段丢失。

快速重传行为:

  • 立即重传丢失的段,而不是等待超时。

快速恢复行为:

  • ssthresh = 当前 cwnd / 2;
  • cwnd = ssthresh + 3(体现网络尚可);
  • 进入拥塞避免阶段(不再重回慢启动);

✅ 快速恢复保持了中等的发送速率,防止性能大幅下降。


拥塞控制减慢增长速度的条件总结

拥塞控制会减慢增长速度的时机:

  1. cwnd 超过 ssthresh
    • 进入拥塞避免阶段,从指数增长变为线性增长。
  2. 发生超时重传
    • 表明网络严重拥塞,立即进入慢启动(cwnd 重置为 1)。
  3. 收到 3 个重复 ACK
    • 进入快速重传,cwmd 缩减并进入拥塞避免。

TCP/IP 数据链路层的交互过程简述

当 IP 层向数据链路层(如以太网)传递数据时:

  1. 查找 ARP 缓存:查找目标 IP 对应的 MAC 地址;
  2. 若存在,直接封装 MAC 地址;
  3. 若不存在,发起 ARP 广播请求;
  4. 接收到 IP 匹配的设备返回自己的 MAC 地址;
  5. 使用该 MAC 地址封装链路层帧,完成数据发送。

TCP 和 UDP 如何区分?

传输层协议由 IP 协议头中的 Protocol 字段决定:

  • TCP:值为 6
  • UDP:值为 17

操作系统根据协议和端口号,将报文传递给对应的应用程序。


UDP 中的 connect() 函数原理

connect() 的作用:

  1. 记录对端 IP 与端口号
  2. 发送数据时不再需要 sendto() 指定地址,可以使用 write()、send();
  3. 接收数据时只接受来自该对端的数据
  4. 可接收异步错误信息
  5. 丢弃来自其他地址的包

✅ 用于长期通信(如 TFTP)或希望使用 TCP 接口风格的场景。


TCP连接中的 TIME_WAIT 状态详解

一、TIME_WAIT 状态如何产生?

  1. 主动关闭连接的一方(client)发送最后一个 ACK 后进入 TIME_WAIT
  2. 保持 2 * MSL 时间后释放连接;
  3. MSL(Maximum Segment Lifetime):报文段在网络中的最大生存时间。

二、TIME_WAIT 的两个核心作用

1. 确保连接的可靠关闭
  • 若最后一个 ACK 丢失,server 会重发 FIN;
  • client 能在 TIME_WAIT 状态中接收该 FIN,并再次回复 ACK;
  • 保证被动关闭方正常结束连接。
2. 避免旧连接干扰新连接
  • 如果不等待,可能使用相同四元组快速建立新连接;
  • 网络中仍存在旧连接的数据包,可能被误接收,导致数据错乱;
  • 2MSL 等待时间保证旧数据失效。

三、TIME_WAIT 的副作用与优化

  • 占用端口资源;
  • 影响服务器重启;
✅ 解决方法:

设置套接字选项 SO_REUSEADDR,允许 TIME_WAIT 状态的端口被重复绑定。

TCP的模型

四层TCP/IP模型如下,包括应用层、网络层、数据链路层、物理层
在这里插入图片描述
在这里插入图片描述

特别感谢@frozendure绘制的图片和说明。

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

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

相关文章

性能测试工具篇

文章目录 目录1. JMeter介绍1.1 安装JMeter1.2 打开JMeter1.3 JMeter基础配置1.4 JMeter基本使用流程1.5 JMeter元件作用域和执行顺序 2. 重点组件2.1 线程组2.2 HTTP取样器2.3 查看结果树2.4 HTTP请求默认值2.5 JSON提取器2.6 用户定义的变量2.7 JSON断言2.8 同步定时器&#…

rabbitMQ如何确保消息不会丢失

rabbitmq消息丢失的三种情况 生产者将消息发送到RabbitMQ的过程中时,消息丢失。消息发送到RabbitMQ,还未被持久化就丢失了数据。消费者接收到消息,还未处理,比如服务宕机导致消息丢失。 解决方案 生产者发送过程中,…

Beetle-RP2350 扩展板设计

Beetle-RP2350 扩展板设计 本文介绍了 DFRobot Beetle RP2350 开发板的扩展板设计,包括参数特点、效果展示、原理图、实物验证、工程测试等,为 RP2350 系列产品的开发提供了便捷。 PCB 工程详见:Beetle-RP2350扩展板 - 立创开源硬件平台 . …

2025年一加7pro刷twpr / magisk / kali nethunter教程+资源下载+避坑指南

从二手市场500淘了一个一加7pro 12+256 ,根据网上教程刷机但很多坑,折腾一周后搞定,记录下给后人避坑 资源下载:链接:https://pan.quark.cn/s/c16b972509f2 提取码:mUW7 本文是主流程+避坑指南,没有基础的需要手把手教学的shell都不会的就别看了,直接放弃或者tb找人花钱…

java HashMap,高效 哈希

java HashMap 有独特的设计。 哈希表数组的每个位置是一个哈希桶&#xff0c;里面由链表或红黑树实现。&#xff08;> 8 或 < 6 的变化时&#xff0c;避免频繁切换&#xff09; 容量&#xff08;capacity&#xff09;&#xff1a; 哈希表中桶&#xff08;bucket&#xf…

【业务领域】计算机网络基础知识

《计算机网络方面有哪些书籍值得推荐&#xff1f;》 知乎扫盲贴&#xff1a; 《网络是怎么链接的》 初识RDMA技术——RDMA概念&#xff0c;特点&#xff0c;协议&#xff0c;通信流程 采样 》 存储 》传输 》处理 》反应 传感器 存储器 接口 算法/cpu 机器

List--链表

一、链表 1.1 什么是List&#xff1f; 在C语言中&#xff0c;我们需要使用结构体struct来进行List(链表&#xff09;的实现&#xff1a; struct ListNode {DataType Data;//DataType是任意类型的变量定义struct ListNode* next;//指向下一个结点的指针变量 }; 与之前的vect…

tensor 的计算操作

1、创建tensor 常见创建 tensor 的方法 函数 作用 torch.Tensor(*size) 通过指定尺寸&#xff0c;生成一个 值全为 0 的 tensor torch.tensor(*list) 直接通过指定数据&#xff0c;生成tensor&#xff0c;支持 List、Numpy数组 torch.eye(row, column) 按照指定的行列数…

【Java面试题04】MySQL 篇

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、MySQL 篇&#xff1a;☀️☀️☀️1、MySQL 是如何实现事务的? 后序还在更新中~~~三、总结&#xff1a;&#x1f353;&#x1f353;&#x1f353; 一、前言&#x1f680;&#x1f680;&#x1f680; ☀️ 你每一…

UDP/TCP协议知识及相关机制

一.UDP协议 UDP是一种无连接、不可靠、面向报文、全双工传输层的协议~ 1.无连接 &#xff1a; 知道对端的端口号和IP可以直接传输&#xff0c;不需要建立连接 2..不可靠&#xff1a;没有确认机制&#xff0c;没有重传机制&#xff0c;不知道数据包能否能正确到达对端&#xff0…

【AI面试准备】语言模型、语音、多模态等模型能力评估指标和能力边界

面试岗位提出这个要求:掌握语言模型、语音、多模态等模型能力评估指标和能力边界。 以下是针对语言模型、语音模型、多模态模型能力评估指标与能力边界的结构化总结,结合高频面试考点和实际应用场景: 目录 **一、语言模型(LLM)评估与边界**1. **核心评估指标**2. **能力边…

优雅关闭服务:深入理解 SIGINT / SIGTERM 信号处理机制

目录 为什么需要优雅关闭&#xff1f; 什么是 SIGINT 和 SIGTERM&#xff1f; 如何实现优雅关闭&#xff08;以 C 为例&#xff09; 示例代码&#xff08;gRPC 服务 Boost 信号监听&#xff09;&#xff1a; 优雅关闭时的清理内容通常包括&#xff1a; 与 SIGKILL 的区别…

容器化-Docker-集群

一、Docker 集群基础概念​ 1、什么是 Docker 集群​ Docker 集群是由多个 Docker 主机组成的集合,这些主机通过网络连接在一起,共同管理和运行容器。在集群中,我们可以将容器服务均匀地分布到各个节点上,实现负载均衡和资源的高效利用。Docker 集群的核心组件包括管理器…

关于kafka

1.为什么需要消息队列 举个经典的例子。 你是一个网购达人&#xff0c;经常在网上购物。快递小哥到了你的小区后&#xff0c;立刻给你打电话说&#xff1a;“你的快递到了&#xff0c;请马上来取。” 但你是一个合格的牛马&#xff0c;在上班&#xff0c;不方便取快递&#…

微服务即时通信系统(十二)---入口网关子服务

目录 功能设计 模块划分 业务接口/功能示意图 服务实现流程 网关HTTP接口 网关WebSocket接口 总体流程 服务代码实现 客户端长连接管理封装(connectionManage.hpp) proto文件的编写 身份鉴权proto 事件通知proto 各项请求的URL的确定 服务端完成入口网关服务类…

存储器层次结构:理解计算机记忆的金字塔

存储器层次结构&#xff1a;理解计算机记忆的金字塔 在计算机系统中&#xff0c;“速度”与“成本”常常处于对立面。为了在速度与成本之间取得平衡&#xff0c;计算机体系结构采用了一种名为“存储器层次结构&#xff08;Memory Hierarchy&#xff09;”的设计思想。本文将通…

HTTP 错误 500.19 - Internal Server Error

1.HTTP 错误 500.19 - Internal Server Error NetCore项目托管到IIS后&#xff0c;报错如下&#xff1a; 原因是因为IIS中没有安装AspNetCoreModuleV2导致的&#xff0c; 1.打开IIS 2.选中服务器根节点&#xff0c;找到模块&#xff0c;双击进入&#xff0c;确认模块中是否存…

【c++】【STL】stack详解

目录 stack类的作用什么是容器适配器stack的接口构造函数emptysizetoppushpopswap关系运算符重载 stack类的实现 stack类的作用 stack是stl库提供的一种容器适配器&#xff0c;也就是我们数据结构中学到的栈&#xff0c;是非常常用的数据结构&#xff0c;特点是遵循LIFO&#…

K8s学习与实践

一、Kubernetes 核心原理 1. Kubernetes 设计哲学 Kubernetes&#xff08;k8s&#xff09;是一个开源的容器编排平台&#xff0c;旨在自动化容器化应用的部署、扩展和管理。其核心设计围绕以下目标&#xff1a; 声明式配置&#xff1a;用户描述期望状态&#xff08;如 YAML …

Umi-OCR项目(1)

最近接触到了一个项目&#xff0c;我在想能不能做出点东西出来。 目标&#xff1a;识别一张带表格的图片&#xff0c;要求非表格内容和表格内容都要识别得很好&#xff0c;并且可视化输出为word文档。 下面是第一步的测试代码&#xff0c;测试是否能够调用ocr能力。 import re…