网络基础二——传输层协议UDP与TCP

九、传输层协议

​ 传输层协议有UDP协议、TCP协议等;

​ 两个远端机器通过使用"源IP",“源端口号”,“目的IP”,“目的端口号”,"协议号"来标识一次通信

9.1端口号的划分

​ 0-1023:知名端口号,HTTP,HTTPS,FTP,SSH等应用层协议,他们的端口号都是固定的;如:ssh使用的是22号端口,ftp(rzsz使用的就是ftp协议)使用的是21号端口,telnet使用的是23号端口,http使用的是80号端口,https使用的是443号端口,smtp(邮件协议)使用的是25号端口;

​ 1024-65535:操作系统动态分配的端口号,比如客户端使用的由操作系统提供的端口号;其实在这些动态分配的端口号中,也是有一些约定好的应用层端口号,如:MySQL使用3306号端口;

​ 在操作系统中有配置文件记录了知名端口号;

vim /etc/services
#可以查看知名端口号;

​ 所以在绑定端口号的时候要注意,避开这些知名端口号;

​ 一个进程可以绑定多个端口号,但是一个端口号只能绑定一个进程;

9.2stat相关指令

netstat
#可以查看本地和网络通信;
-l,列出监听状态的服务;
-t,查看tcp的服务;
-u查看udp的服务;
-a,查看所有服务;
-n,拒绝显示别名;
-p,显示相关进程;

iostat
-x,查看设备读写速度

awk '{print $2}' 
#将第二列过滤;

xargs
#将输出的多行信息,以行为单位转换成命令行参数;
#可以搭配起来实现杀死一批进程;

pidof name
#直接得到含有name关键字的一批进程的pid;

十、UDP协议

​ 传输层、网络层、数据链路层,都要考虑,1.将报头和有效载荷分离;2.有效载荷应该交付给哪一个上层协议;

10.1UDP报头

​ 1.整个报文的长度是8个字节;使用定长报头的方式实现报头和有效载荷分离;

​ 2.使用16位的目的端口号,将有效载荷上交给对应服务进程;

​ 源端口号是操作系统自动生成的,目的端口号是需要用户传递的,可以定位目的服务,便于服务响应数据个客户端;

​ 16位UDP长度指的是整个报文的长度;通过UDP长度-8就可以得到正文的长度;

​ 16位UDP检验和,当数据出现偏差时,可以检测出来然后丢弃,如果成功就将数据传输给上层协议;尽管是进行了数据检验,但是还是无法保证数据的可靠性;服务端收到的只可能一个完整报文和一个不完整报文

在这里插入图片描述

10.2UDP协议特点

​ UDP套接字是全双工的;

​ 1.无连接,不需要建立连接就可以进行通信;

​ 2.不可靠传输,a.传输过程当中出现了数据乱序;b.接收缓冲区写满了,之后到达的数据会直接被丢弃

​ 3.面向数据报传递;

​ 面向数据报:发送几次报文,接收方就需要接收几次报文;不能对报文进行拆分和合并;即每个报文一定是完整的且每次收到的一定是一个报文;不需要对数据进行报头和有效载荷的分离,直接进行反序列化

10.3UDP的缓冲区

​ UDP没有真正意义上的发送缓冲区,只有接收缓冲区用来保存来不及处理的报文;因为服务端收到的只可能一个完整报文和一个不完整报文,有对报文的检验,所以不需要发送缓冲区的存在;

10.4UDP注意事项

​ 如果发送的数据大于16位的长度即64kb,这是就需要将数据分成多个64kb的数据块,多次发送报文;

10.5站在操作系统角度理解UDP

​ 在操作系统中位UDP的报头设计了专门的结构化数据类型;类似如下位段结构

struct udp_header
{
  uint32_t src_port:16;  
  uint32_t dst_port:16;  
  uint32_t length:16;  
  uint32_t check_code:16;  
};

​ 操作系统维护了UDP的报文结构体类型,指向了报文封装的一段空间;操作系统用双链表的形式将报文维护了起来;

struct sk_buff{
    char* start;
    char* end;
    char* pos;
    int type;
    struct sk_buff* next;
};

​ 当操作系统进行封装报文的时候,会先创建报头对象并且添加报头字段,然后将报头对象放到空间的最开始位置,用户层缓冲区的数据放到报头对象的后面,报文的start指向空间的起始地址,end指向空间的最后位置,pos指向报文的有效部分结尾;

10.6基于UDP的应用层协议

NFS: 网络文件系统 ;

TFTP: 简单文件传输协议 ;

DHCP: 动态主机配置协议 ;

BOOTP: 启动协议(用于无盘设备启动) ;

DNS: 域名解析协议;

十一、TCP协议

​ TCP叫做传输控制协议,很多应用层协议都会使用TCP协议,因为它的传输保证可靠性还有对高效传输有一定的策略;TCP也是全双工的;

11.1TCP缓冲区的理解

​ 用户在应用层使用应用层协议进行序列化和反序列化,使用系统调用接口对用户层缓冲区和内核缓冲区的内容进行拷贝;而在传输层,只是考虑内核发送缓冲区中有什么并将其可靠高效地发送到远端的接收缓冲区当中,其实也是一种拷贝;

​ read/recvfrom等接口阻塞是因为,接收缓冲区中没有数据,资源不就绪,操作系统会将服务进程阻塞,等待着有数据了资源就绪,才会进行读取;类似于键盘等硬件资源不就绪,进程阻塞;

​ 对数据的发送是由TCP协议决定的,这体现出了TCP协议的控制特点;

11.2TCP协议的段格式

在这里插入图片描述

4位首部长度:包含了选项的长度,即大小是从0-15;4位首部大小的基本单位是4字节,所以大小范围是0-60字节,标准报头20个字节,选项最多是40个字节;当不考虑选项时,一般4位首部长度是5;

​ 使用端口号将有效载荷交给上层;

​ 使用固定长度+自描述字段(4位首部长度)进行有效载荷和报头的分离;

16位窗口大小:返回确认应答时,自己接收缓冲区的剩余空间大小,用于辅助流量控制的;

32位序号:保证数据传输按序到达;TCP是面向字节流的,会将报文从左向右依次拷贝到发送缓冲区中,每一个字节天然就有了编号,即数组下标;其中报文最后一个字节的数组下标将作为32位序号的填充字段;

32位确认序号:确认应答是哪一个报文的应答;32位确认序号填充的是收到报文的序号加1

6个标记位:区分不同的报文类型,进而使得服务器执行不同的行为;

11.3TCP协议保证可靠性

​ 1.双方通信的时候一定要保证报头信息的完整;

​ 2.可靠性要保证数据不能丢包,当服务端读到速度过慢或者其他原因,使得缓冲区很快写满,导致数据大面积丢包;这时候就需要客户端和服务器协同,控制双方的读写速度,来减少数据丢包;通过控制发送数据的速度,使得读端来得及读取数据,规避大面积丢包问题,这种方式叫做流量控制

​ 可靠性要保证丢包重传和超时重传,所以理论上是不用进行流量控制的,但是对于一个完整的报文已经到达了目标主机,直接丢弃是不合理的,会使得曾经发送消耗的成本变得没有意义,浪费掉了,控制流量明显比丢包重传更有意义更合理;

​ 3.TCP保证可靠性的最基本的一个特点就是:确认应答(一般不带数据,只有报头),通信双发都要进行确认应答;服务端对于客户端发送过来的所有请求都要进行响应;

​ 当进行TCP网络通信的时候,客户端发送消息必须带一个完整的报头,服务器收到后会向客户端发送一个确认应答,也是要带一个完整的报头;可是双方并不能很好的保证发送和读取的速度均衡,此时客户端会根据服务端的接收缓冲区剩余空间的大小调整发送的速度;客户端根据确认应答返回的响应报头属性中的16位窗口大小(填充着服务端接收缓冲区剩余空间的大小)就可以调整发送的速度;

​ 只要收到了应答就可以保证刚刚我发送出去的消息成功递达了,所以对于没有应答的消息是无法保证可靠性的;双方在发送一条消息和接收到一个应答这种模式下,总会有一个消息或者是应答是新发出去的,不能保证可靠性;

11.3.1TCP最简单最原始的通信方式

​ 由于双方通信要保证的是发送方数据的可靠性,所以不需要考虑接收方发送给发送方的应答是否可靠,只需要知道发送方接收到了应答就已经充分说明了发送方的数据是可靠了;所以 在每一次通信过程中要保证数据可靠是单个方向的,是主动方需要保证可靠

​ 一段时间内主动方没有收到应答,则会认为数据丢失,对历史数据进行超时重传;为了能够支持重传要在接收到应答之前将数据维持一段时间;

​ 现实生活中常见的不是发送消息收到应答保证发送的消息是可靠的,常见的是主动方发送消息,被动方收到了消息并会发送消息,而此消息间接地表明了主动方消息的可靠性;在TCP通信中不是发送确认应答和主动消息两个报文,而是将两报文合并成了一个报文,这种方式叫做捎带应答

11.3.2TCP常规的通信方式

​ TCP原始的通信方式对于主动方如果要发送多个消息,就必须接收到了应答才能发送下一个消息,这样串行的通信效率无疑是非常低下的;原则上发送多个消息,只要保证每一个消息都有应答就行,并不需要串行方式进行;

​ 这种并行的方式存在丢包问题,需要提出策略解决;

​ 对于并行方式的发送消息会存在乱序问题,需要进行解决保证数据的可靠性;使用32位序号就可以保证数据顺序的可靠性;

​ TCP发送是不可能按照字节去发送的,而是按照数据块发送的;为了保证不乱序需要对每一个数据块设置序号,而这个序号就是数据块最后一个字节的下标;对于一次性发送的多个消息,需要同样多个应答,但是为了区分是哪一个消息的应答,就使用了32位确认序号;

​ 确认序号表示1.主动方发送的序号消息已经被收到了;2.确认序号之前的数据已经全部收到了,如:1001表示包括0-1000的数据已经收到;3.下次发送要从确认序号指定的数字开始发送;

​ 确认序号之前的数据已经全部收到了,这样就允许有少量的应答丢包,只要最后一个应答存在就可以保证多个数据传输是可靠的;

​ 因为双方通信是地位对等的,都需要发送数据然后得到应答,所以要将两个序号区分开;而且对于被动方捎带应答的这种情况可能既要发消息(需要主动方发送确认应答)又要提交应答,即一个报文是具有两种属性的,需要不同的序号进行区分;

11.3.3TCP不同类型的报文

​ TCP通信是会先建立连接,然后数据通信,最后断开连接,这些过程都会发送TCP报文,这也就意味着报文是有着不同的类型的,使得服务器执行不同的动作;通过使用6个标记位来区分不同的报文类型,进而使得服务器执行不同的行为;

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

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

相关文章

Spring Boot中前端通过请求接口下载后端存放的Excel模板

导出工具类 package com.yutu.garden.utils;import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import org.apache.commons.io.IOUtils; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.slf4j.Logger;…

06-编辑器

gedit编辑器 gedit是Ubuntu系统自带的编辑器,可以用来轻度编辑和记录一些内容。 在终端中我们通过以下命令打开: gedit 要打开或者新建的文件名虽然Ubuntu的图形界面也能通过gedit打开文件,但是用终端打开gedit可以动用更高的权限&#xff…

OpenHarmony实战开发-使用一次开发多端部署实现一多设置典型页面

介绍 本示例展示了设置应用的典型页面,其在小窗口和大窗口有不同的显示效果,体现一次开发、多端部署的能力。 1.本示例使用一次开发多端部署中介绍的自适应布局能力和响应式布局能力进行多设备(或多窗口尺寸)适配,保…

掌握机器学习新星:使用Python和Scikit-Learn进行图像识别

正文: 随着智能手机和社交媒体的普及,图像数据的生成速度比以往任何时候都快。为了自动化处理这些数据,我们需要强大的图像识别系统。机器学习提供了一种有效的方法来识别和分类图像中的对象。Scikit-Learn是一个流行的Python库,它…

谷粒商城实战(010 缓存-解决数据一致性问题以及SpringCache的使用)

Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强 总时长 104:45:00 共408P 此文章包含第166p-第p172的内容 缓存一致性问题解决 redisson使用lua脚本,所以的锁都保证了原子性 改之前的代码 锁的粒度越小越好 如11号…

PS入门|黑白色的图标怎么抠成透明背景

前言 抠图可以算是PS的入门必备操作,开始学习PS的小伙伴可以根据本帖子推荐一步步学习哦!但切勿心急~ 今天给小伙伴们带来:黑白色的图标抠图教程 抠图有很多种方法,但根据类型的不同,使用适当的方法很重…

Redis底层数据结构-Dict

1. Dict基本结构 Redis的键与值的映射关系是通过Dict来实现的。 Dict是由三部分组成,分别是哈希表(DictHashTable),哈希节点(DictEntry),字典(Dict) 哈希表结构如下图所…

YUNBEE云贝-2024年4月PostgreSQL PGCM认证实战培训

课程介绍 了解关注开源技术,学习PG以点带面 Linux/Andriod(操作系统)、Apache/Tomcat(应用服务器)、OpenStack/KVM(虚拟化)、Docker/K8S(容器化)、Hadoop(大…

利用Python和Selenium实现定时任务爬虫

网络爬虫在信息获取、数据分析等领域发挥着重要作用,而定时爬虫则可以实现定期获取网站数据的功能,为用户提供持续更新的信息。在Python中,结合Selenium技术可以实现定时爬虫的功能,但如何设置和优化定时爬虫的执行时间是一个关键…

C语言编写Linux的Shell外壳

目录 一、输出命令行 1.1 了解环境变量 1.2 获取用户名、主机名、当前路径 1.3 缓冲区改进MakeCommandLine 二、获取用户命令 2.1 读取函数的选择 2.2 细节优化 2.3 返回值 三、指令和选项分割 3.1 strtok 函数 3.2 分割实现 四、执行命令 4.1 fork 方法 4.2 进…

Qt C++ | Qt 元对象系统、信号和槽及事件(第一集)

01 元对象系统 一、元对象系统基本概念 1、Qt 的元对象系统提供的功能有:对象间通信的信号和槽机制、运行时类型信息和动态属性系统等。 2、元对象系统是 Qt 对原有的 C++进行的一些扩展,主要是为实现信号和槽机制而引入的, 信号和槽机制是 Qt 的核心特征。 3、要使用元…

蓝桥杯嵌入式学习笔记(9):RTC程序设计

目录 前言 1. RTC介绍 2. 使用CubeMx进行源工程配置 3. 代码编程 3.1 准备工作 3.2 进行bsp_rtc.h编写 3.3 进行bsp_rtc.c编写 3.4 main.c编写 3.4.1 头文件引用 3.4.2 变量声明 3.4.3 子函数声明 3.4.4 函数实现 3.4.5 main函数编写 4. 代码实验 5. 总结 前言 因本人备赛蓝…

2024年购买阿里云服务器多少钱?100元-5000元预算

2024年阿里云服务器租用费用,云服务器ECS经济型e实例2核2G、3M固定带宽99元一年,轻量应用服务器2核2G3M带宽轻量服务器一年61元,ECS u1服务器2核4G5M固定带宽199元一年,2核4G4M带宽轻量服务器一年165元12个月,2核4G服务…

IntelliJ IDEA中文---强化智能编码与重构,提升开发效率

IntelliJ IDEA 2023是一款功能强大的集成开发环境(IDE),专为Java开发人员设计。它支持智能代码编辑、自动补全和重构,帮助开发者提高编码效率。同时,内置了丰富的调试工具,支持断点调试和变量监视&#xff…

STM32-04基于HAL库(CubeMX+MDK+Proteus)中断案例(按键中断扫描)

文章目录 一、功能需求分析二、Proteus绘制电路原理图三、STMCubeMX 配置引脚及模式,生成代码四、MDK打开生成项目,编写HAL库的按键检测代码五、运行仿真程序,调试代码 一、功能需求分析 在完成GPIO输入输出案例之后,开始新的功能…

2024阿里云老用户服务器优惠价格99元和199元

阿里云服务器租用价格表2024年最新,云服务器ECS经济型e实例2核2G、3M固定带宽99元一年,轻量应用服务器2核2G3M带宽轻量服务器一年61元,ECS u1服务器2核4G5M固定带宽199元一年,2核4G4M带宽轻量服务器一年165元12个月,2核…

[RK356X_LINUX] 关于UMS功能电脑不显示盘符

问题描述 根据356x_linux\docs\Linux\ApplicationNote\Rockchip_Quick_Start_Linux_USB_Gadget_CN.pdf文档执行命令配置UMS功能。 虽然电脑端显示有UMS设备图标,但无盘符显示。 在执行/etc/init.d/S50usbdevice restart后会出现打印: Starting /usr/b…

MySQL数据库 数据库基本操作(二):表的增删查改(上)

1. CRUD CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写,就是数据库基本操作中针对表的一系列操作. 2. 新增(create) -->insert 语法: insert into 表名 [列名1,列名2…] values (val1,val2…) [注意] 列名可以没有,如果没有列名…

Delphi 是一种内存安全的语言吗?

上个月,美国政府发布了 "回到基石 "报告: 通往安全和可衡量软件之路 "的报告。该报告是美国网络安全战略的一部分,重点关注多个领域,包括内存安全漏洞和质量指标。 许多在线杂志都对这份报告进行了评论&#xff0…

跑mmdec(自用)

1. 准备工作 进服务器先conda activate openmmlab 如果没有conda初始化的话,要先 source ~/miniconda3/bin/activate 然后cd mmdetection进目录 2. 数据处理 把数据变成这样的格式