【linux网络(四)】传输层协议详解(上)

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:Linux从入门到精通⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学更多操作系统知识
  🔝🔝


在这里插入图片描述

Linux网络

  • 1. 前言
  • 2. UDP协议报文详解
  • 3. TCP协议的报文格式
  • 4. TCP的确认应答机制
  • 5. 16位窗口大小的用处
  • 6. TCP的超时重传机制
  • 7. 总结

1. 前言

本篇文章将核心从应用层转移到传输层, 传输层绕不开的两座大山: TCP和UDP. 由于UDP是一种简洁的协议,所以主要讲本篇文章的核心放在TCP协议上!

注: 如果对HTTP协议了解不深刻,建议先阅读这篇文章
HTTP详解

本章重点:

本篇文章会讲解UDP协议的报文格式, 深度解析UDP协议是怎样进行解包/封装的. 之后会讲解TCP的报文格式, 以及TCP协议中为了保证可靠性和效率而采用的方法.

任务:

  1. 对于如何协议都要解决的问题: 如何分离(解包), 如何交互(封装)
  2. 理解协议的报文本身
  3. 详细的了解具体的报文字段

2. UDP协议报文详解

直接上图:
在这里插入图片描述

UDP协议的报头是固定大小的,八字节. 所以解包也很简单: 提取前八个字节的数据, 解析16位UDP长度. 拿到长度后截断整个报文数据!

UDP的报头实际上就是结构体类型:

struct udp_hdr
{uint32_t src_port:16;uint32_t dst_port:16;uint32_t udp_len:16;uint32_t udp_check:16;
}

UDP传输过程类似于寄信, 无连接, 不可靠, 面向数据报, 这个在前面的文章有讲解过. 注意UDP的最大数据是2^16-1. 也就是64K. 这里经常会在面试中被问到.


3. TCP协议的报文格式

直接上图:

在这里插入图片描述

一眼看去, TCP协议确实比UDP要复杂的多, TCP协议的报头并不是定长的, 你可能会发现它除了选项和数据的长度是定长的20字节. 但是它的选项的长度是不定的. 在前20字节中有一个叫4位首部长度的字段. 它代表了报头一共有多大. 范围是: 20~60字节

TCP报头的其他字段数据, 比如: 序号, 确认序号, 窗口大小, 6位标志位等. 就是TCP用来保证它的效率和可靠性时需要使用到的字段


4. TCP的确认应答机制

讲个小例子帮助大家理解:
我们看电视剧中的特种兵用对讲机进行通信时, 比如张三对李四说: A点发现敌人, 张三说了这句话后并不确定李四是否听见这句话. 所以此时李四往往会回复一句: 收到. 此时张三才能确信李四收到了刚才的信息

确认应答机制(ACK机制):
为了保证可靠性

确认应答机制就是在说, A端向B端发送一段数据后, B端必须返回给A端一条信息, 代表B端确实收到了这条消息. 那么在上面的TCP协议中, 有一种类型的字段叫六位标记位. 其中之一的ACK标记位就用于确认应答

在这里插入图片描述

除此之外, 确认应答不仅仅会用到ACK标记位, 还会用到确认序号. 那么什么是确认序号? 先来了解TCP对数据的结构划分: TCP将发送缓冲区的每个字节的数据都进行了编号. 即为序列号(将发送缓冲区想象为字符串,编号就是字符串下标).

在这里插入图片描述

比如主机A给主机B发送了1000字节的数据, 那么这个TCP包中的序号就为1000. 当B主机收到TCP包后, 会给A主机发送确认应答, 并且会将确认序号设置为1001, 代表1001以前的数据我都收到了. 可以从1001个字节开始给我发数据了

在这里插入图片描述

同理,要是B主机没有给A发送1001确认序号,而是直接发送了2001. 证明2001以前的数据都收到了, 包括1~1000的

TCP的报头中包含序号和确认序号, 这是因为TCP是全双工的, 一端既可以发数据同时也能接受数据. 并且,系统调用recv,read并不是从网络从将数据读取到内存, 而是将接受缓冲区的数据读取上来. 同理, send和write函数也是讲数据写入发送缓冲区, 而不是直接写入网络

在这里插入图片描述

对确认应答的深刻理解:

确认应答机制只能保证历史发的数据都被接收了, 但是最新的数据对方是否接收了是未知数. 比如B端向A端发送ACK应答后, B端怎么在这里插入图片描述
知道A端有没有收到这条消息? 答案是B端是不知道的!


5. 16位窗口大小的用处

相信聪明的你也思考过, 要是客户端无脑一直给服务器发数据, 把服务器的接受缓冲区塞满了咋办? 是的, TCP协议当然也考虑到了这一点, 于是专门设置了16位窗口大小

用处:

16位窗口大小表示对端接受缓冲区的剩余空间大小, 当客户端收到的窗口大小太小时, 就会减缓发送数据的速度, 留给服务器喘息的机会. 所以发包的一方需要填写窗口大小, 而收包的一方需要解析对端的窗口大小. 当然你可能会问这些工作是谁做的? 答案是操作系统帮我们做的


6. TCP的超时重传机制

上面讲到, 每一次收到数据都会给对方发一个ACK应答表明我收到了. 那么如果我确实没有收到呢?应该怎么办? TCP协议当然也考虑到了这一点

超时重传机制:

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

在这里插入图片描述

这里还有一种情况: 主机A没收到B的确认应答:

在这里插入图片描述

聪明的你可能又会问了, 超过一定时间会重发, 那么这一定时间具体是多久?

为了在任何环境下都能高性能的通信, 会动态计算超时时间.

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

7. 总结

TCP协议会有很多方案来保证自身数据传输时的可靠性和效率性, 当然, 今天学习的机制都是和可靠性有关的. 与效率性有关的方案会放在传输层协议详解(下)中讲解. 博主最近在秋招总复习, 所以会更新的比较快. 休息一下, 马上回来!

🔎 下期预告:TCP/UDP协议详解(下) 🔍

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

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

相关文章

CPN Tools学习——从平面网构建分层 PN

1.先创建平面petri网 创建如下petri网: CPN ide创建petri网真的舒服很多,但是教程又是CPN Tools的,我的想法是看两个版本能不能互通,在前者创建,在后者运行学习。 新增定义: colset E unit with e; 但…

Go模板页面浏览器显示HTML源码问题

<!--* Title: This is a file for ……* Author: JackieZheng* Date: 2024-06-09 17:00:01* LastEditTime: 2024-06-09 17:01:12* LastEditors: Please set LastEditors* Description:* FilePath: \\GoCode\\templates\\index.html --> <!DOCTYPE html> <html …

高并发ping多台主机IP

简介 社区或者是大型公司往往有成千上万或者几百台设备&#xff0c;保持设备始终在线对网络运维人员来说至关重要&#xff0c;然而一个一个登录检查&#xff0c;或者一个一个ping并不明智&#xff0c;累人且效率极低&#xff0c;并出错率高。花钱买检测服务当我没说。 shell编…

acwing 5575. 改变数值 | c++题解及解释

acwing 5575. 改变数值 题目 代码及解释 #include <iostream> #include <cstring> #include <algorithm> #include <unordered_map> using namespace std;const int N305; int a[N],b[N]; unordered_map<int,int>f[N]; const int INF1e9;int gc…

Dev C++ 安装及使用方法教程-干活多超详细

Dev C 是一款非常好用&#xff0c;简约的C/C开发工具。可以减少很多创建工程的繁琐步骤&#xff0c;很快的进行开发。对于只用于来写代码的人来说&#xff0c;是比较轻量以及极速的。 Dev C 是一个windows下的c和c程序的集成开发环境。它使用mingw32/gcc编译器&#xff0c;遵循…

Docker部署常见应用之大数据基础框架Hadoop

文章目录 Hadoop简介主要特点核心组件生态系统 Docker Compose 部署集群参考文章 Hadoop简介 Hadoop是一个开源框架&#xff0c;由Apache软件基金会开发&#xff0c;用于在普通硬件构建的集群中存储和处理大量数据。它最初由Doug Cutting和Mike Cafarella创建&#xff0c;并受…

质疑标普,理解标普,加入标普

上周我在文章里提到过&#xff0c;标普信息科技LOF(161128)出现套利机会。每天申购卖出&#xff0c;到现在一个账户56*6336润。 得益于美股七巨头轮流领涨&#xff0c;161128依旧坚挺&#xff0c;每天溢价都是10%&#xff0c;成交量1个多亿&#xff0c;场内新增份额才400万份&…

2024年黑龙江省特岗招聘公告出了!!!

2024年黑龙江省农村义务教育阶段学校特设岗位教师招聘822人公告 (1、网上报名 时间&#xff1a;6月17日9&#xff1a;00—6月22日17&#xff1a;00。 网址&#xff1a; https&#xff1a;//sfyz.hljea.org.cn&#xff1a;7006/tgjs 2、网上资格审查 资格审查时间&#xff1a;6月…

马克·雷伯特访谈:机器人的未来及波士顿动力的创新之路

引言 机器人技术作为现代科技的前沿领域&#xff0c;始终吸引着大量的关注与研究。波士顿动力公司作为这一领域的领军者&#xff0c;其创始人兼前CEO马克雷伯特&#xff08;Marc Raibert&#xff09;近日在主持人莱克斯弗里德曼&#xff08;Lex Fridman&#xff09;的播客节目…

[Mdfs] lc3067. 在带权树网络中统计可连接服务器对数目(邻接表+图操作基础+技巧+好题)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接&#xff1a;3067. 在带权树网络中统计可连接服务器对数目 2. 题目解析 挺有意思的一道题目&#xff0c;重点是要能够读懂题目&#xff0c;然后结合几个图相关的处理技巧即可拿下。 图存储&#xff1a;邻接表即可。无向无…

HP惠普暗影精灵10 OMEN Gaming Laptop 16-wf1xxx原厂Win11系统镜像下载

惠普hp暗影精灵10笔记本电脑16-wf1000TX原装出厂Windows11&#xff0c;恢复开箱状态oem预装系统安装包&#xff0c;带恢复重置还原 适用型号:16-wf1xxx 16-wf1000TX,16-wf1023TX,16-wf1024TX,16-wf1025TX, 16-wf1026TX,16-wf1027TX,16-wf1028TX,16-wf1029TX, 16-wf1030TX,16-…

Electron无感打印 静默打印(vue3 + ts + vite)

&#xff08;electron vue3 项目搭建部分 自行查找其他资源 本文只讲解Electronvue3 如何实现静默打印&#xff09; 第一步获取打印机资源 渲染端代码&#xff08;vue里面&#xff09; // 因使用了vite所以在浏览器中打开 require会报错 只能在electron中 const { ipcRender…

FreeRTOS:4.内存管理

FreeRTOS内存管理 目录 FreeRTOS内存管理1. 为什么不直接使用C库函数的malloc和free函数2. FreeRTOS的五种内存管理方式3. heap4源码分析3.1 堆内存池3.2 内存块的链表数据结构3.3 堆的初始化3.4 堆的内存分配3.5 堆的内存释放 4. 总结 1. 为什么不直接使用C库函数的malloc和fr…

Cisco Packet Tracer实验(四)

生成树协议&#xff08;Spanning Tree Protocol&#xff09; 交换机在目的地址未知或接收到广播帧时是要进行广播的。如果交换机之间存在回路/环路&#xff0c;那么就会产生广播循环风暴&#xff0c;从而严重影响网络性能。 而交换机中运行的STP协议能避免交换机之间发生广播…

【云原生| K8S系列】Kubernetes Daemonset,全面指南

Kubernetes中的DaemonSet是什么? Kubernetes是一个分布式系统&#xff0c;Kubernetes平台管理员应该有一些功能可以在所有节点上运行特定于平台的应用程序。例如&#xff0c;在所有Kubernetes节点上运行日志代理。 这就是Daemonset发挥作用的地方。 Daemonset是一个原生的K…

【Mybatis-Plus】根据自定义注解实现自动加解密

背景 我们把数据存到数据库的时候&#xff0c;有些敏感字段是需要加密的&#xff0c;从数据库查出来再进行解密。如果存在多张表或者多个地方需要对部分字段进行加解密操作&#xff0c;每个地方都手写一次加解密的动作&#xff0c;显然不是最好的选择。如果我们使用的是Mybati…

每一个男人都曾有一个机器人的梦想

每一个男人都曾有一个机器人的梦想 我也有 每一个男人都曾有一个机器人的梦想。对于我来说&#xff0c;这个梦想始于童年时代&#xff0c;那时变形金刚风靡一时&#xff0c;几乎所有80后的孩子都为之疯狂。我是80后中的一员&#xff0c;那时候的科技还远没有如今这般发达&#…

【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)

&#x1f525;引言 本篇将深入解析单链表:探索底层逻辑&#xff0c;理解底层是如何实现并了解该接口实现的优缺点&#xff0c;以便于我们在编写程序灵活地使用该数据结构。 &#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &…

dp练习题

先来一个简单dp练习 class Solution { public:int rob(vector<int>& nums) {int n nums.size();vector<int> a(n 1);int ans nums[0]; a[0] nums[0];if (n 1) return ans;a[1] max(nums[0], nums[1]);ans max(ans, a[1]);if (n 2) return ans;for (i…

[DDR4] DDR 简史

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解DDR4》 存和硬盘&#xff0c;这对电脑的左膀右臂&#xff0c;共同扛起了存储的重任。内存以其超凡的存取速度闻名&#xff0c;但一旦断电&#xff0c;内存中的数据也会消失。它就像我们的工作桌面&…