网络原理TCP/UDP

2023-11-10

TCP

TCP全称为"传输控制协议(Transmission Control Protocol)。人如其名,要对数据的传输进行一个详细的控制。

TCP协议段格式

在这里插入图片描述

  • ack:应答
  • syn:申请建立连接
  • FIN:申请断开连接
  • “校验和”:验证数据的完整性

传输的数据控制(关注可靠与效率),可靠与效率成反比,越可靠效率越低。
TCP是综合考虑了两者,取的一个均衡:不是保证绝对意义的可靠,也不是绝对意义的效率最高

可靠机制

确认应答机制

在这里插入图片描述

  • 数据会进行编号,并使用32位序号保存。
  • 确认应答,ack标志位置位1,会使用32位确认序号保存。
  • 下一个是多少? ——下一个是1001
    接收到的数据报,连续序号的最大值+1
    告诉对方下一次从哪个位置发。——数据(1001~2000)

超时重传机制

主机A发送数据给B之后,可能因为网络拥堵等原因,数据无法到达主机B;
如果主机A在一个特定时间间隔内没有收到B发来的确认应答,就会进行重发;

在这里插入图片描述
没有接收到ack应答包,可能是由于:(1)发送数据丢包。(2)ack应答丢包
解决办法:发送数据包重新发送。

超时时间如何确定,隔多长时间进行重传呢?

跟网络环境有关,是动态变化的。

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

连接管理机制

建立连接——三次握手

在这里插入图片描述
建立连接流程如下:

  1. 客户端发送syn=>申请建立客户端到服务器的连接。
  2. 服务端返回syn+ack => 申请建立服务端到客户端的连接。ack是对第一个数据报的应答,syn和ack可以一起发送(一个数据报,两个标志位置为1),也可以分开发送。
  3. 客户端返回ack => 对第二个数据报syn的应答。
断开连接——四次挥手

在这里插入图片描述
断开连接流程如下:

  1. 客户端发送FIN到服务器:申请关闭客户端到服务器的连接。
  2. 服务端返回ACK :服务器状态置为 close_wait
  3. 服务器发送FIN到客户端:申请关闭服务器到客户端的连接 => 客户端收到申请关闭连接的请求,状态置为TIME_WAIT
  4. 客户端返回ACK => 服务端状态置为closed(已关闭)
常见问题

1. 双方连接状态为什么最后才是closed(已关闭)?

:双方都要保证可靠的关闭连接。

2. 第2,3个数据报为什么没有合并?

:第2个数据报,是系统内核返回的(不用程序写代码来发送)
第3个数据报,是程序调用close方法发送的服务端在关闭连接前,可能需要做一些其他工作。

是否可以合并:先放在缓冲区(可能是立即发,也可能不是)=>对应的,第三个数据报也是发送到缓冲区。
此时,如果第二个数据报还在缓冲区,就可能合并发送。

3. 服务端出现大量的close_wait,原因?

:服务端没有执行 close方法,因为执行close方法才会发送第3个数据报。

4.客户端接收第3个数据报,状态为什么置为TIME_WAIT,而不是CLOSED?

:客户端接收到第3个数据报,不能马上置为CLOSED。第4个数据报,可能出现丢包(服务端无法断开连接)服务端就会根据超时重传机制,重发第3个数据报此时客户端如果是CLOSED,就没法接收了

5.客户端接收第3个数据报,状态时TIME_WAIT,需要等多久?
:2MSL。1MSL是单个报文传输的最大时间。

效率机制

滑动窗口

作用:以并行的方式发送数据报,减少等待时间,提高效率。
在这里插入图片描述
窗口大小如何确定?

窗口大小:无需等待确认应答,而可以继续发送的数据报最大值。
滑动窗口大小滑动窗口大小= min(流量窗口大小,拥塞窗口大小)

窗口滑动是如何滑动的?
在这里插入图片描述
发生丢包的情况:

  1. ack丢包:没影响,后续的ack也能表示序号前的全部接收
  2. 发送的数据报丢包:接收的ack下一个序号,是接收端,接收到的连续序号最大值+1﹐(如果中间有部分没接收到,就相当于不连续)
  3. 快重传:连续3次接收到下一个是x,就表示从x开始的数据报丢包,需要重传

流量控制机制

背景:发送端发送速度如果快于接收端,程度读取速度,就可能导致接收缓冲区被打满,进而引起一系统丢包,重传再次丢包的问题。

  • 接收端接收能力有限,主动的告诉发送端,自己的接收能力。
  • 接收端:接收缓冲区,剩余空间大小=>返回的ack应答包,还会使用“窗口大小”字段来设置这个值。

拥塞控制

背景:网络状态不明的情况下,贸然发送大量的数据报,就可能产生网络拥塞。类似发快递,不清楚交通状态,就贸然发送大批量的货物,可能导致交通阻塞。

  • TCP引入慢启动机制,先发少量的数据,探探路(根据“拥塞窗口”探路),摸清当前的网络拥堵状态,再决定按照多大的速度传输数据;
  • 拥塞窗口
  • 发送开始的时候,定义拥塞窗口大小为1;
  • 每次收到一个ACK应答,拥塞窗口加1;
  • 每次发送数据包的时候,将拥塞窗口和接收端主机反馈的窗口大小做比较,取较小的值作为实际发送的窗
  • 拥塞窗口如何变化
    在这里插入图片描述
  • 当TCP开始启动的时候,慢启动阈值等于窗口最大值;
  • 在每次超时重发的时候,慢启动阈值会变成原来的一半,同时拥塞窗口置回1;

延迟应答

背景:接收端返回流量窗口代表接收缓冲区可用空间大小,如果立即返回,就不划算(立即返回的流量窗口大小就会比较小)
接收端返回的流量窗口(ack应答包有窗口大小字段),不是立即返回,而是等待一定时间,这样返回的流量窗口大小就可能更大

  • 流量窗口大小,是滑动窗口大小的决定因素之一。
  • 滑动窗口大小是网络吞吐量的决定因素之一。

所以延迟应答是效率机制——延迟一定时间应答,效率就更高。

捎带应答

背景:不管是客户端还是服务端,每一端,即可以是发送端,也可以是接收端。不管客户端还是服务端,接收到数据后,返回的ack应答包(作为接收端),可以和发送的数据报(作为发送端)合并在一起(捎带的方式)发送给对方

粘包问题——应用层的数据包

应用层需要约定统一的协议:明确包和包之间的边界。没有明确边界,就会出现粘包问题。

站在传输层角度,TCP是一个一个报文过来的,按序号排好在缓冲区。而应用层角度,看到的只是一串连续字节数据。

传输层:如果基于tcp协议(面向字节流,没有关闭流,可以一直收发数据)
解决方案

  1. 固定大小的包:读、写都按照固定大小来发送/接收。
  2. 可变长度的包:发送时包含长度的信息,接收到就按照这个信息读取相应大小的数据。也可以自定义,如使用分隔符来分割包。

UDP协议:因为是面向数据报的,不存在粘包问题。

TCP与UDP区别

UDP TCP
无连接 有连接(三次握手、四次挥手)
不可靠 可靠
面向数据报 面向字节流
缓冲区:只有接收缓冲区 有接收缓冲区和发送缓冲区
大小受限 大小不限
适用场景:实时性要求高,允许少量丢包。(早期QQ) 适用场景:可靠性比较高的地方(文件传输)

数据报 vs字节流

面向数据报:

应用层交给UDP多长的报文,UDP原样发送,既不会拆分,也不会合并;
用UDP传输100个字节的数据:

如果发送端调用一次sendto,发送100个字节,那么接收端也必须调用对应的一次recvfrom,接收100个字节;而不能循环调用10次recvfrom,每次接收10个字节。
面向字节流:

创建一个TCP的socket,同时在内核中创建一个发送缓冲区和一个接收缓冲区;

  • 调用write时,数据会先写入发送缓冲区中;
  • 如果发送的字节数太长,会被拆分成多个TCP的数据包发出;
  • 如果发送的字节数太短,就会先在缓冲区里等待,等到缓冲区长度差不多了,或者其他合适的时机发送出去;
  • 接收数据的时候,数据也是从网卡驱动程序到达内核的接收缓冲区;然后应用程序可以调用read从接收缓冲区拿数据;
  • 另一方面, TCP的一个连接,既有发送缓冲区,也有接收缓冲区,那么对于这一个连接,既可以读数据,也可以写数据.这个概念叫做全双工

由于缓冲区的存在,TCP程序的读和写不需要一一匹配,例如:

  • 写100个字节数据时,可以调用一次write写100个字节,也可以调用100次write,每次写一个字节
  • 读100个字节数据时,也完全不需要考虑写的时候是怎么写的,既可以一次read 100个字节,也可以一次
    read一个字节,重复100次;

基于UDP,设计一个可靠传输?

在应用层,自己引入序列号,确认应答机制、超时重传机制等类似TCP的机制,实现可靠传输。

基于UDP,设计大小不限数据传输?

在应用层,自己写代码实现 引入序列号,确认应答机制、超时重传机制等类似TCP的机制,实现可靠传输。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络原理TCP/UDP 的相关文章

  • 反病毒技术

    目录 UTM 反病毒概念 病毒 反病毒 病毒威胁场景 常见病毒传播途径 计算机病毒分类 病毒蠕虫木马对比 常见病毒行为特征 反病毒技术原理 单机反病毒 网关反病毒应用场景 智能感知引擎 IAE 防火墙反病毒检测技术 反病毒处理流程 应用例外
  • GEE 导入shp数据-裁剪影像

    1 Importing Table Data https developers google com earth engine guides table upload 需要注意在导入shp文件时 需要将包含 shp dbf shx prj四
  • tf好朋友之matplotlib的使用——contour等高线的绘制

    tf好朋友之matplotlib的使用 contour等高线的绘制 等高线绘制常用函数 plt contourf plt contour plt clabel 应用示例 大家都有学过地理噢 地理里面有一个很帅气的东西叫做 等 高 线 等高线
  • SQL中datetime和timestamp的区别

    初学PHP MySQL 在开发一个简单的报名程序时 要求在每一条新插入的记录后面添加一个日期字段 方便日后查询和排序 于是立即百度 发现可以使用datetime或timestamp两种日期类型来实现 这对于爱纠结的我来说是不被允许的 于是立

随机推荐

  • 黑马程序员SSM_SpringBoot笔记(自用)

    SpringBoot 1 简介 1 入门案例 新建模块 开发控制器类 在 controller 包下创建 BookController 代码如下 RestController RequestMapping books public clas
  • 说说synchronized关键字和volatile关键字的区别

    说说synchronized关键字和volatile关键字的区别 synchronized关键字和volatile关键字是两个互补的存在 而不是对立的存在 volatile关键字是线程同步的轻量级实现 所以volatile性能肯定比sync
  • ThinkPHP怪现象:数据表新增字段后开发模式可更新运行模式无法更新

    一 情况说明 一个已经发布的程序中 数据库原有表article 字段原有id content title三个字段 原程序可以正常运行 通过大D方法可以正常的更新数据库 现在要对这个程序进行更新 数据库表article现在增加字段media
  • vue 前端 + 若依(ruoyi)后端 实现国际化

    简介 记录一下 前端使用vue 后端使用若依 ruoyi 基于spring boot 实现页面 后端返回提示信息国际化 前端 vue 2 6 12 vue i18n 8 27 2 安装vue i18n 注 最新的交于该版本有差异 所以指定使
  • android tab 切换动画,Android之ViewPager+TabLayout组合实现导航条切换效果(微信和QQ底部多标签切换)...

    前言 之前在另外一篇中用Fragment和button实现了点击切换Fragment的效果 比较简陋 这次改用ViewPager TabLayout 实现联动的效果 实现效果 ViewPager 多个页面滑动 TabLayout 和 Vie
  • python项目开发案例集锦,python开发程序流程

    大家好 给大家分享一下python项目开发案例集锦 源码 很多人还不知道这一点 下面详细解释一下 现在让我们来看看 今天任务 1 创建Python项目为pythontest1以及test1 py文件 2 修改字号 3 输入九九乘法表程序 编
  • 输出从顶点Vi到Vj的所有简单路径

    class Solution public bool visited 20 void init for int i 0 i lt 20 i visited i false int firstarc vector
  • 导出下载csv格式的表格(逗号分隔文件)的servlet代码,留待以后调用

    导出并下载csv格式的表格 逗号分隔文件 以导出销售榜单为例 package cn estore web servlet import java io IOException import java io PrintWriter impor
  • 使用aop获取方法运行之后的返回值

    AfterReturning returning rvt pointcut annotation com roton common utils LogRecord public Object AfterExec JoinPoint join
  • 机器学习洞察

    在之前的 机器学习洞察 系列文章中 我们分别针对于多模态机器学习和分布式训练 无服务器推理进行了解读 本文将为您重点介绍 JAX 的发展并剖析其演变和动机 下面 就让我们来认识一下 JAX 这一新崛起的深度学习框架 亚马逊云科技开发者社区为
  • Jenkins安装配置及插件安装使用

    个人理解持续集成 为解决程序代码提交质量低 提交内容导致原有系统的BUG 按时或按需自动编译版本 进行自动化测试 百度对持续集成的定义 持续集成是一种软件开发实践 即团队开发成员经常集成他们的工作 通常每个成员每天至少集成一次 也就意味着每
  • MySQL监控工具PMM

    MySQL监控工具PMM PMM 安装server端 添加agent 配置agent 添加MySQL监控 查看客户端组件状态 大致内容 参考链接 PMM PMM Percona Monitoring and Management 是一个免费
  • qTip2 Events

    author YHC 绑定事件 这个API触发一些特殊的事件 以下详细信息 允许你给qTip分配多个时间监听 和为某一事件做出响应 例如 我们绑定一个事件句柄 它将侦听qTip的移动的事件 和更新DIV元素里面显示的qTip的坐标内容 se
  • 【满分】【华为OD机试真题2023 JS】微服务的集成测试

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 微服务的集成测试 知识点深搜 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 现在有n个容器服务 服务的启动可能有一定的依赖性 有些服务启动没有依赖 其次服务自身
  • 现在公司都不缺人了?软件测试工作经历3年,居然被坑了?防不胜防!

    我的情况 大概介绍一下个人情况 女 本科 三年多测试工作经验 懂python 会写脚本 会selenium 会性能 然而到今天都没有收到一份offer 从年后就开始准备简历 年后上班的第一天就开始投 开始只是投了一些官网已久的岗位 并没有收
  • Keras中model.evaluate()返回的是 loss value & metrics values

    Keras官方文档 https keras io models model evaluate Keras中model evaluate 返回的是 损失值和你选定的指标值 例如 精度accuracy evaluate evaluate x N
  • Spring事务管理: 构建稳健的数据库事务处理

    博主猫头虎 带您 Go to New World 博客首页 猫头虎的博客 面试题大全专栏 文章图文并茂 生动形象 简单易学 欢迎大家来踩踩 IDEA开发秘籍专栏 学会IDEA常用操作 工作效率翻倍 100天精通Golang 基础入门篇 学会
  • SpringBoot入门到精通(四):整合JDBC和JPA

    整合JDBC JdbcTemplate JPA 当前环境说明 Windows10 64 Maven3 x JDK1 8 MySQL5 6 SpringToolSuite4 Spring官方提供的开发工具 实际就是一个Eclipse 一 整合
  • 必看!!!客户端requests与服务端request收发请求

    当使用代码进行接口访问的时候 请求的发送与请求的接受使用的参数应该怎么如何传输能够请求到正确的响应呢 一 使用GET请求发送 客户端与服务端的参数传输与接受 1 服务端 首先使用web框架写一个简单的接口 接收两个参数 page和size
  • 网络原理TCP/UDP

    文章目录 TCP TCP协议段格式 可靠机制 确认应答机制 超时重传机制 连接管理机制 建立连接 三次握手 断开连接 四次挥手 常见问题 效率机制 滑动窗口 流量控制机制 拥塞控制 延迟应答 捎带应答 粘包问题 应用层的数据包 TCP与UD