Linux网络之UDP与TCP协议详解

文章目录

    • UDP协议
      • UDP协议数据报
      • 报头
    • TCP协议
      • 确认应答
        • 缓冲区
      • 超时重传
      • 三次握手
        • 其他问题
      • 四次挥手
      • 滑动窗口
      • 流量控制
      • 拥塞控制

UDP协议

前面我们只是说了UDP协议的用法,但是并没有涉及到UDP协议的原理

毕竟知道冰箱的用法和知道冰箱的原理是两个层级的事情

我们首先知道计算机网络世界是搭建在四层架构上的

而HTTP协议是处于最顶层,是应用层协议,应用层协议的最大特点就是非常多,而且各异

这样多的协议要在网络中传输,必须得给他统一了,并且还能将底层收上来的数据,正确的交付到各个端口中

做到这些的就是传输层协议,主要有两个,就是大名鼎鼎的UDP和TCP

UDP协议数据报

所有的协议都规定了两部分,就是报头和数据本身,在传输层我们一般习惯把这整体称之为数据包

报头

在这里插入图片描述

报头是这样的

相比于IP协议和TCP协议,UDP协议的报头还是十分友好的

UDP的报头大小是固定的,8字节,因此当我们获取到一个UDP数据报之后,取前8个字节,找到UDP数据报的总长度,就能完整的取到整个报文数据

需要注意的是,16位UDP长度指的是UDP数据报的总长度,包含报头和数据部分,因此UDP的最大数据大小就是2^16-1,大小就是64KB

UDP的传输过程是不可靠的,无连接的,面向数据报,在我们之前介绍的时候有说过,他的主要应用场景其实就是直播了

TCP协议

在这里插入图片描述

TCP报头就比UDP丑多了,而且他还是不定长的,其中有一个交4位首部长度,是代表了TCP报头的大小,范围是20到60字节

其他的部分都是用来确保TCP的可靠性和效率所用到的

TCP如此知名,就是因为他的可靠性,那么他做了哪些事情保证他的可靠呢

确认应答

我们发出了一条信息,怎么确定对方是否看到了呢,在Line或者抖音中,会回显对方是否已读,这其实就是一个确认应答机制

为了保证可靠性,TCP协议规定了ACK机制,也就是确认应答机制

机智的朋友肯定发现上面的标志位中有一个ACK,就是用于这个事情的

在这里插入图片描述

但是如果服务器和客户机一人一条发送,服务器每发送一个数据,都要等客户端回答收到之后再发送,这样固然是可靠了,但是效率却也大大降低了

于是就有了下面的想法,一次发送10条数据,分别标记上1到10

客户端收到1回复2,表明自己的1收到了,下一个想要2,因此客户端在一次收到1到10之后会分别回复2到11

但是计算机网络纷繁复杂,数据报可不一定是按顺序到达的,这就麻烦了,我怎么知道我缺哪个呢,而且每一个都进行回复也太二了

然后我们再想,一次发送了1到10,但是接收到了,1到5,8到10,6和7都丢了

那我们只回复5,标识5以前的都正确收到了,接下来想要6

这样就好很多了

缓冲区

除此之外,TCP的协议是全双工的,用一个端口就可以执行发送和接收两个操作,而且系统调用recv和read也不是从网卡中读取数据到内存,而是从缓冲区里拿上来的,send和write其实也算写入到缓冲区的,不是直接写到网卡里

在这里插入图片描述

那这个缓冲区写满了怎么办,怎么知道,发送缓冲区没数据了怎么办

这其实就是那16位的窗口做的事情,他分别对应了缓冲区的大小,每一次收发其实都会把缓冲区的状态写在里面,当缓冲区都快满了,写方就知道不要再往里面传了

超时重传

当数据在传输过程中丢了怎么办,迟迟没有收到ACK就说明发送失败了

当服务器等了一段时间也没有收到客户机发来的ACK,就说明数据可能是丢了,无论是数据丢了,还是ACK丢了,都会触发超时重传

这时候TCP协议就会要求服务器重新传一次数据

一般来说这个一段时间其实是动态的,各家操作系统都是这样

逻辑是这样的500ms是一个单位,每次乘2,当次数有几次之后,就说明对方主机可能出毛病了,有可能是被拔网线了,这时候就不会重传了

其实TCP协议他可靠吗,确实,在他能做到的范围内确实可靠,但是如果被拔网线就没办法了(不可抗力)

三次握手

我们说TCP协议是面向连接的,这个连接是怎么建立的呢

就是通过三次握手,在TCP报头中的SYN标记就是标识我要跟你交朋友

过程是这样的

客户端发起请求,说,我要跟你做朋友(发送一个包含SYN标记的报文)

服务端收到之后,说,我收到了你的消息,我也要跟你做朋友(发送了一个ACK和SYN标记都有的报文)

客户端收到之后,说,好!(发送一个ACK标记的报文)

在这里插入图片描述

这三次数据传递其实就建立了一个TCP连接,但是建立连接的时候,是在哪一个动作呢

其实是在客户端最后一次发送之后,客户端就认为连接建立好了,而服务器接收到了之后,服务器就认为连接建立好了

接下来客户端就可以发送请求了,疯狂星期四,V我50

需要注意的是,服务器可不是一次只跟一个客户机聊天,说不定有成千上万的客户端来请求,而操作系统的管理策略其实就是先描述再组织,将这些连接管理起来

其他问题

有一个经典的面试问题为什么是三次握手,其他次数行不行

  1. 偶数次

这里需要知道一点,当我发出一条消息的时候,我是不知道这条消息能不能传达到的,但是可以确定的是,我之前的消息一定传到了,并且我也可以收到对方的消息

而在这个过程中,永远是客户机给服务器发送请求,如果是奇数次,说明最后一个确认是服务器发给客户端的,说明之前的信息都没问题了,为什么还要继续确认呢?我直接发我的请求不好吗

而且如果使用偶数次握手,是服务器先确认建立的连接,客户端就可以一直发送SYN报文,一直不建立连接,服务器需要面对的可就多了,维护连接过多可是会挂掉的

  1. 其他奇数次呢

1次就不说了太蠢了,5次以上那不就是浪费资源了

3次就能干好的事情为什么要5次7次,那不是脱裤子放屁吗

四次挥手

有资源的申请就要有资源的释放,有链接的申请就要有链接的释放

在TCP报头中有一个叫做FIN,其实就是final,标志着我要离开我的朋友了

链接的释放可以说客户端也可以是服务器,这里我为了方便表示说是客户端,表示我要的资源已经拿到了,要拜拜了

客户端发出请求,要拜拜了(发送一个带有FIN的报文)

服务器收到了,我知道了(原地等待一会儿)(返回一个ACK,表示我知道了,然后等待一个CLOSE_WAIT的时间,给客户机反悔的机会,看客户机还有没有别的话说)

这段时间服务器什么也没有等到,服务器说,这是我跟你说的最后一句话,以后再也没有了(假),拜拜(发送了一个LAST_ACK,表示最后一个ACK报文,并且附带了FIN标志,表示结束)

当客户端收到之后,其实连接就已经断开了,并且会维持一段时间TIME_WAIT,不让客户端对同一个端口发送请求,咱不能抓着一只羊薅羊毛吧

在这里插入图片描述

滑动窗口

如果服务器发送了1到20号数据,但是客户端收到的是1和3到20,只发了一个2的请求,服务器看到之后觉得他只收到了1,于是把2到20又发了一遍,这样的效率又变得不行了

于是就有了滑动窗口,我们把发送缓冲区和接收缓冲区想象成数组,儿窗口限制的其实是左右的下标,我们每次只确认窗口中的数据即可

在这里插入图片描述

在这里插入图片描述

需要注意的是,在滑动窗口中的每一个部分其实都是需要确认ACK的,这是和之前不一样的

流量控制

流量控制其实用到的原理就是上面的滑动窗口,我们需要控制发送数据的速度,不能让接收端的缓冲区过满,不然就是无用功了

这时候TCP报头中的显示缓冲区情况就起到作用了

拥塞控制

拥塞控制与流量控制不同,他是为了防止网络状况不好产生的原因,比如说路由器出问题,网络拥堵送不出去

TCP的解决方案是慢启动,他指的是一开始的发送的数据很少,但是是指数级别的增长

当这个增长达到一定阈值之后,就是用线性增长了,如果遇到了重传,就会减半

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用API有效率地管理Dynadot域名,设置域名服务器(NS)

前言 Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮箱&…

在虚幻引擎中实现Camera Shake 相机抖动/震屏效果

在虚幻引擎游戏中创建相机抖动有时能让画面更加高级 , 比如 遇到大型的Boss , 出现一些炫酷的特效 加一些短而快的 Camera Shake 能达到很好的效果 , 为玩家提供沉浸感 创建Camera Shake 调整Shake参数 到第三人称或第一人称蓝图 调用Camera Shake Radius值越大 晃动越强

拍卖的价格怎么定?聊聊转转拍卖场的起拍定价算法演变

价格策略、定价调价算法是诸多中大规模电商不可或缺的一项能力,涉及到精准定价、智能调价、智能发券、成本控制等一系列智能运营场景,尤其对于二手行业来说,定价能力更是面临诸多挑战,却又不可或缺。本文将旨在介绍转转 TOB 拍卖场…

kibana开启访问登录认证

编辑es配置文件,添加以下内容开启es认证 vim /etc/elasticsearch/elasticsearch.yml http.cors.enabled: true http.cors.allow-origin: "*" http.cors.allow-headers: Authorization xpack.security.enabled: true xpack.security.transport.ssl.enable…

解释器模式原理剖析和Spring中的应用

解释器模式原理剖析和Spring中的应用 解释器模式 是一种行为型设计模式,它定义了一种语言的文法表示,并提供了一个解释器来处理该文法的表达式。解释器模式可以用于构建语法解释器,例如计算器、简单编程语言的解释器等。 核心思想&#xff1a…

Java框架学习(mybatis)(01)

简介:以本片记录在尚硅谷学习ssm-mybatis时遇到的小知识 详情移步:想参考的朋友建议全部打开相互配合学习! 官方文档: MyBatis中文网https://mybatis.net.cn/index.html 学习视频: 067-mybatis-介绍和对比_哔哩哔…

人工智能时代,程序员如何保持核心竞争力?

引言 随着AIGC(如ChatGPT、Midjourney、Claude等)大语言模型接二连三的涌现,AI辅助编程工具日益普及,程序员的工作方式正在发生深刻变革。有人担心AI可能取代部分编程工作,也有人认为AI是提高效率的得力助手。面对这一…

一天面了8个Java后端,他们竟然还在背5年前的八股文!

今天面了8个Java候选人,在面试中我发现他们还停留在面试背八股文的阶段,5年前面试背八股文没问题,随着市场竞争越来越激烈,再问普通的Java八股文已经没有意义了,因为考察不出来获选人的真实实力! 现在面试…

cpu路、核、线程、主频、缓存

路:主板插口实际插入的 CPU 个数,也可以理解为主板上支持的CPU的数量。每个CPU插槽可以插入一个物理处理器芯片。例如,一台服务器可能有2路或4路插槽,这意味着它最多可以安装2个或4个物理处理器。 核:单块 CPU 上面能…

C++ 异步编程中:future与promise、packaged_task、async

原文链接:C 异步编程之future与promise、async、packaged_task_std::promise和std::future异步发送-CSDN博客 1、std::future std::future类模板来关联线程运行的函数和函数的返回结果,这种获取结果的方式是异步的 std::future 通常由某个 Provider 创建…

unity 打包安卓 RenderTexture显示红色

1、ColorFarmat: 每个图形卡可能并不支持跨格式的所有用法。使用 SystemInfo.IsFormatSupported 可以检查图形卡支持的用法。 None未指定格式。R8G8B8A8_UNorm一种四分量、32 位无符号归一化格式,在字节 0 中具有 8 位 R 分量,在字节 1 中具…

Java面试篇基础部分-ReentrantLock详解(二)

Lock 接口的主要方法 void lock():给对象加锁,如果锁没有被其他线程使用,则当前线程获取到这个锁;如果锁正在被其他线程持有,则将禁用当前线程,直到当前线程获取到锁。boolean tryLock():试图给对象进行加锁操作,如果锁没有被其他线程使用,则将获取到这个锁并且返回tr…

Linux ubuntu debian系统安装UFW防火墙图形化工具GUFW

GUFW是UFW的图形化前端,可以通过以下命令安装: sudo apt install gufw安装成功后,可以通过应用程序菜单启动GUFW,在图形界面中,可以方便地添加、修改和删除规则,查看状态和日志。

【入门01】arcgis api 4.x 创建地图、添加图层、添加指北针、比例尺、图例、卷帘、图层控制、家控件(附完整源码)

1.效果 2.代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title></title><link rel"s…

CDGA|数据治理:策略与价值的深度融合

在当今这个数据驱动的时代&#xff0c;企业数据治理的重要性日益凸显。数据不仅是企业的核心资产&#xff0c;更是驱动业务决策、优化运营流程、创新产品服务的关键力量。然而&#xff0c;要让数据治理真正发挥价值&#xff0c;企业需要采取一系列策略来确保数据的准确性、完整…

C++之二叉搜索

1.二叉搜索树的概念 二叉搜索树又称为二叉排序树&#xff0c;它有以下的特点。 1.如果它的左子树不为空&#xff0c;则左子树上所以结点的值都小于等于根结点的值 2.如果它的右子树不为空&#xff0c;则右子树上所有结点都大于等于根结点的值 3.它的左右子树也分别为二叉搜…

【C++笔试强训】如何成为算法糕手Day3

​ 学习编程就得循环渐进&#xff0c;扎实基础&#xff0c;勿在浮沙筑高台 循环渐进Forward-CSDN博客 目录 循环渐进Forward-CSDN博客 第一题&#xff1a;除2&#xff01; 第二题&#xff1a;dd爱框框 第三题&#xff1a;简写单词 第一题&#xff1a;除2&#xff01; 牛客网…

数据保护从现在开始:如何抵御 .[RestoreBackup@cock.li].SRC 勒索病毒

导言 勒索病毒是一种不断演变的网络威胁&#xff0c;.[RestoreBackupcock.li].SRC、[chewbaccacock.li].SRC勒索病毒便是其中一种新型的攻击手段。该病毒通过加密用户文件并要求支付赎金来恢复访问&#xff0c;给个人和企业带来了严重的安全风险和经济损失。本文91数据恢复将探…

25 基于51单片机的温度电流电压检测系统(压力、电压、温度、电流、LCD1602)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;通过DS18B20检测温度&#xff0c;滑动变阻器连接数模转换器模拟电流、电压&#xff0c;通过LCD1602显示&#xff0c;程序里设置温度阈值为40&#xff0c;电流阈值为60&am…

新版torch_geometric不存在uniform、maybe_num_nodes函数问题(Prune4ED论文报错解决)

这是在复现论文“Towards accurate subgraph similarity computation via neural graph pruning”时遇到的报错。 ImportError: cannot import name uniform from torch_geometric.nn.pool.topk_pool 一、报错原因 论文作者使用的是2.1.0版本的torch_geometric。而我安装了2.…