网络分层和网络原理之UDP和TCP
温故而知新
目录
网络分层
应用层
http协议
传输层
介绍
UDP协议
TCP协议
网络层
数据链路层
物理层
网络分层
一. 应用层
应用程序
现成的应用层协议有超文本协议http(不仅仅有文本).
http协议
http://t.csdnimg.cn/e0e8khttp://t.csdnimg.cn/e0e8k
自定义应用层协议,包含需要传输的信息以及格式,将信息转为字符串放入TCP或者UDP的socket中。常见传输格式xml,最流行的是json,但json仍然有网络带宽的消耗,protobuffer是将信息压缩为二进制,带宽消耗较小。
二. 传输层
1. 介绍
关注起点和终点
主要有TCP和UDP :
TCP:有连接,可靠传输,面向字节流,全双工。适用于需要确保数据完整性和顺序的场景。eg:文件传输,状态更新。
UDP:无连接,不可靠传输,面向数据报,全双工,接收缓冲区。适用于高速传输和对实时性要求较高的应用。
传输层一个重要概念:端口号
固定占2个字节,
表示范围0~65535(2^16-1),
0一般不用,1~1023是知名端口号,如80是http的端口号22是ssh的端口号(登录远程主机)
2.UDP协议
(1)组成
UDP的首部长度固定为8个字节(64位)64k。它由源端口号、目标端口号、长度和校验和组成。每个字段都占用2个字节。
- 源端口号(Source Port):占用2个字节,表示发送方使用的端口号。
- 目标端口号(Destination Port):占用2个字节,表示接收方使用的端口号。
- 长度(Length):占用2个字节,表示UDP首部和数据的总长度,包括8字节的UDP首部和数据部分的长度。
- 校验和(Checksum):占用2个字节,用于检测UDP首部和数据在传输过程中是否发生错误。
UDP的简洁首部长度是其相对于TCP更轻量级的一个特点,但也意味着它没有TCP那样的可靠性保证和流量控制机制。因此,在使用UDP时需要注意数据的可靠性和完整性问题,并根据具体应用场景决定是否需要额外的机制来处理这些问题。
(2)细节
✅1.当udp数据报携带信息过大,导致服务器与客户端交互的数据量接近64kb,超过上限会导致数据阶段,数据出错,解决办法:
1.将数据拆分为多个包,使用多个UDP传输(✕)如何去拆包组包,开发测试成本大。
2.使用TCP,无包大小的限制(✓)
3.升级UDP,比较麻烦。(✕)UDP是在操作系统内核实现的.
✅2.网络传输中数据是有可能出错的,如何基于校验和来完成数据校验呢?
1.发送方,把要发送的数据整理好(称为 data1),通过一定的算法, 计算出校验和 checksum1发送方把 data1 和 checksum1 -起通过网络发送出去.
2.接收方收到数据,收到的数据称为 data2 (数据可能和 data1 就不一样了),收到数据 checksum1
3.接收方再根据 data2 重新计算校验和(按照相同的算法),得到 checksum2
4.对比 checksum1 和 checksum2 是否相同.如果不同,则认为 data2 和 data1 一定不相同如 5.checksum1 和 checksum2 相, 则认为 data1 和 data2 大概率是相同的 理论上存在不同的可能性。
✅3.在UDP中使用循环冗余校验(CRC):把需要进行校验和的数据的每个字节逐个累加,把结果保存在两个字节的变量中,累加过程溢出也没事。如果中间出现数据错误,第二次的校验和就和第一次不也一样。
更严谨的是md5,MD5进行了定长,分散(一个字节不同差异也很大),不可逆。MD5也适合作为hash算法(哈希表是把一个key通过hash函数转换为数组下标,hash函数尽量分散,哈希碰撞的可能从才能降低),
✅4.UDP特点:寄信
UDP进行网络通信可以通过
java.net
包下的DatagramSocket
和DatagramPacket
类来实现无连接:知道对方ip和端口号即可连接,
不可靠:发送端发送数据报后,如果因为网络问题并没有到接收方,UDP协议也不会给应用层返回任何错误信息。
全双工:可以通过一个socket进行send和reseive,既能读也能写,即全双工;
缓冲区:UDP只有接收缓冲区,没有发送缓冲区。
UDP发送的数据会直接发送给内核,由内核将数据传给网络层协议进行后续传输动作;UDP具有接收缓冲区,这个缓冲区不能保证受到道德UDP报的顺序与发送UDP报的顺序一致;缓冲区满,再到达的UDP报就会被 丢弃。
大小受限:UDP协议首部有一个16位的最大长度,2个字节,也就是UDP能传输的最大长度是64KB(包含UDP首部)
面向数据报:以DataGaramSocket为单位传输
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, receiverAddress, receiverPort);
UDP是一种面向数据报的无连接协议,因此发送方和接收方之间不存在建立连接的过程,也没有可靠性保证。每个UDP数据报都是独立的,可能会丢失、重复或乱序。实际使用中可能需要考虑超时重传,分片传。
import java.net.DatagramSocket; import java.net.DatagramPacket; import java.net.InetAddress;public class UDPExample {public static void main(String[] args) {try {// 创建发送方的UDP socketDatagramSocket senderSocket = new DatagramSocket();// 准备要发送的数据String message = "Hello, UDP!";byte[] sendData = message.getBytes();InetAddress receiverAddress = InetAddress.getByName("127.0.0.1"); // 接收方的IP地址int receiverPort = 12345; // 接收方的端口号// 创建要发送的数据报文DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, receiverAddress, receiverPort);// 发送数据报文senderSocket.send(sendPacket);// 创建接收方的UDP socketDatagramSocket receiverSocket = new DatagramSocket(receiverPort);// 准备接收数据的缓冲区byte[] receiveData = new byte[1024];// 创建接收数据的数据报文DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);// 接收数据报文receiverSocket.receive(receivePacket);// 解析接收到的数据String receivedMessage = new String(receivePacket.getData());System.out.println("Received message: " + receivedMessage);// 关闭socketsenderSocket.close();receiverSocket.close();} catch (Exception e) {e.printStackTrace();}} }
5.UDP无连接不可靠面向数据报的协议如果要基于传输层UDP协议来实现可靠传输应该如何设计?大小有限制,如果要基于传输层UDP协议,传输超过64k的数据,如何设计?
参考TCP可靠性的实现
5.2+5.1分片重组+序列化保证顺序;5.1确认应答;超时重传;滑动窗口控制流量,校验和.......
简单了解基于UDP的应用层协议
NFS: 网络文件系统
TFTP:简单文件传输协议
DHCP:动态主机配置协议
BOOTP:启动协议 (用于无盘设备启动)
·DNS: 域名解析协议
3.TCP协议
(1)特性如下链接:
http://t.csdnimg.cn/NHMHb
(2)组成
初心:可靠传输~
数据报=首部(报头)+载荷;一行4个字节
报头长度是不固定的,选项也是报头的一部分,TCP报头包括固定部分和可选部分。固定部分的长度是20个字节(160位),包括源端口号、目标端口号、序列号、确认号、数据偏移、控制位、窗口大小、校验和和紧急指针等字
报头最短是20个字节(没有选项),最长是60个字节(选项最多是40字节);
保留位(6位):有需要就用。比udp的64kb好。扩展余地。
TCP首部长度字段占用4个位(即4个二进制位也就是4个字节,32个比特位),它使用4位来表示长度。由于4位最多能表示16个不同的取值(从0000到1111),因此TCP首部长度字段的取值范围是0-15,表示TCP首部的长度是以32位(此处设定4字节,所以有4倍的设定关系)为单位的倍数。也就是说,长度值乘以4才得到TCP首部的实际长度。当TCP首部长度字段取值为5时,长度为5 * 4 = 20字节,即TCP首部固定部分的长度。
TCP协议的组成主要包括以下部分:
- 源端口号(Source Port):占用2个字节,表示发送方使用的端口号。
- 目标端口号(Destination Port):占用2个字节,表示接收方使用的端口号。
- 序列号(Sequence Number):占用4个字节,表示本次传输的第一个字节的序列号。
- 确认号(Acknowledgment Number):占用4个字节,表示期望接收到的下一个字节的序列号。
- 数据偏移(Data Offset):占用4个位,表示TCP首部长度,单位为4字节,因此TCP首部长度最大值为60字节。
- 保留位(Reserved):占用6个位,保留未来使用,必须设置为0。
- 控制位(Flags):占用6个位,包含ACK、SYN、FIN等标志位,用于控制TCP连接的建立、维护和关闭。其中ack为1,表示它表示应答报文,ack为0表示普通报文。SYN为。
- 窗口大小(Window Size):占用2个字节,表示接收窗口的缓冲区大小,用于流量控制。
- 检验和(Checksum):占用2个字节,用于检测TCP首部和数据在传输过程中是否发生错误。
- 紧急指针(Urgent Pointer):占用2个字节,表示紧急数据的位置,用于处理紧急数据。
(3)特点
有连接
Socket clientSocket = serverSocket.accept(); accept方法会阻塞当前线程直到有客户端连接请求到达并被接受 记得抛出异常防止网络故障类问题
可靠传输+面向字节流+全双工(既可以读也可以写)
// 获取输入输出流 BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
💡TCP的可靠不在于它是否可以把数据100%传输过去,而是
- 1.发送方发去数据后,可以知道接收方是否收到数据;
- 2.如果接收方没收到,可以有补救手段;
三. 网络层
关注路径规划
四. 数据链路层
关注路径中节点的连接
五. 物理层
关注设备
相关文章:
网络分层和网络原理之UDP和TCP
温故而知新 目录 网络分层 应用层 http协议 传输层 介绍 UDP协议 TCP协议 网络层 数据链路层 物理层 网络分层 一. 应用层 应用程序 现成的应用层协议有超文本协议http(不仅仅有文本). http协议 http://t.csdnimg.cn/e0e8khttp://t.csdnimg.cn/e0e8k 自定义应…...
软件包管理:在CentOS 7中部署Tengine
目录 下载: 方法一: 方法二: 部署: 实验操作 下载: 方法一: 1、打开浏览器搜索tengine并点击官网 2、选择需要安装的版本并复制链接链接 标题栏处可以更改为中文界面 下滑选择版本单击下载 在远程连…...
爬取A站视频,涉及m3u8格式的处理
一、抓包分析 1.进入A站进行抓包分析 进入一个页面,右点击鼠标按钮,点击检查 接着点击network,点击Fetxh/XHR,然后刷新网页,得到下面的页面 发现其中有许多d595开头的文件,它们是ts文件,点击其中一个。在…...
《微信小程序开发从入门到实战》学习九十四
7.1 视图容器组件 7.1.4 movable-view和movable-area组件 movable-view是一个可移动的视图容器,它需要与movable-area组件结合使用。movabke-view只能放在movable-area组件中,在movable-area组件的范围内拖曳滑动。 movable-view组件属性如下…...
深度学习记录--Batch Norm
Batch Norm 与Input Norm对输入层进行归化不同,Batch Norm是对隐藏层进行归化 实现 ,其中、调节均值和方差 ,...
svn和git的本质区别是什么
参考: https://blog.csdn.net/feiying0canglang/article/details/126550676 上边图中,跨越了区的箭头,它中间的区数据都会同步。例如:git checkout ,它是将本地仓库数据更新到暂存区和工作区的。\ 理解 gitlab和svn都…...
Redis面试
1.说说什么事redis Redis是一种基于键值对的NoSql数据库。 Redis中的value支持string(字符串)、hahs(哈希)、list、set、zset(有序集合)、bitmaps(位图),HyperLoglog等数…...
贪吃蛇(C)
游戏背景:贪吃蛇是久负盛名的游戏,它也和俄罗斯⽅块,扫雷等游戏位列经典游戏的⾏列。 总: 游戏设计大纲: 使⽤C语⾔在Windows环境的控制台中模拟实现经典⼩游戏贪吃蛇。 实现的基本功能: 1、贪吃蛇地图绘制。 2、蛇吃⻝物的功能 (上、下、左、右⽅向键控制蛇的动作)。 …...
【云原生】Docker基于Dockerfile多级构建,实现缩小镜像体积
目录 一、基于上次的nginx的Dockerfile做多级构建 二、基于上次的php的Dockerfile修改做多级构建 三、基于上次的mysql的Dockerfile修改做多级构建 基于以上三个镜像构建 四、镜像体积是不是越小越好?为什么要缩减镜像体积? 五、缩小镜像体积的方法…...
第七十一周周报
学习目标: 一、实验 二、小程序 学习时间: 2024.1.20-2024.1.26 学习产出: 一、小程序 这周花了两天根据陈勇和纪行之的代码优化了小程序的代码 二、实验 根据stylegan2仓库的redeme文件重新跑了stylegan2和diffusion-stylegan2 DV…...
绿色制造的行业标杆OEKO-TEX STeP认证
STeP是“OEKO-TEX国际环保纺织协会”推出的一个独立的第三方认证体系。STeP全称Sustainable Textile & Leather Production(可持续纺织和皮革生产),是面向纺织和皮革供应链中环保且负有社会责任的生产工厂推出的透明认证体系。 STeP认证的…...
第3章:Python 的函数和模块(基于最新版 Python3.12 编写)
文章目录 3.1 函数:编写你的代码乐曲3.1.1 什么是函数?3.1.2 如何定义函数?3.1.3 如何调用函数?3.1.4 函数的返回值3.1.5 函数的文档字符串3.1.6 默认参数值3.1.7 可变数量的参数3.1.8 局部变量和全局变量3.1.9 递归函数 3.2 模块…...
网络安全产品之认识漏洞扫描设备
文章目录 一、什么是漏洞扫描设备二、漏洞扫描设备的主要功能三、漏洞扫描设备的主要技术四、漏洞扫描设备的主要类型五、漏洞扫描设备的使用方式六、漏洞扫描设备如何与其他安全设备联动七、漏洞扫描设备的应用场景 漏洞是指在硬件、软件、协议的具体实现或系统安全策略上存在…...
Hadoop增加新节点环境配置(自用)
完成Hadoop集群增添一个新的节点配置(文中命名为)Hadoop106,没有进行继续为该节点分配身份职能的步骤 1.在VMware中安装CentOS 7 新建虚拟机 1.⾸先我们创建⼀个新的虚拟机,也可以点⽂件-新建虚拟机。 2.选择⾃定义,…...
Apache Shiro 安全框架
前言 Apache Shiro 是一个强大且容易使用的Java安全矿建,执行身份验证,授权,密码和会话管理。使用Shiro的易于理解的API您可以快速轻松的获得任何应用程序直到大的项目。 一丶什么是Shiro 1.Shiro是什么 Apache Shiro是一个强大且易于使用…...
防火墙的NAT
目录 1. NAT 概念解析 2. 配置NAT策略: 1. NAT 概念解析 静态NAT --- 一对一 动态NAT --- 多对多 NAPT --- 一对多的NAPT --- easy ip --- 多对多的NAPT 服务器映射 源NAT --- 基于源IP地址进行转换。我们之前接过的静态NAT,动态NAT,NAPT都属…...
Java基础进阶03-注解和单元测试
目录 一、注解 1.概述 2.作用 3.自定义注解 (1)格式 (2)使用 (3)练习 4.元注解 (1)概述 (2)常见元注解 (3)Target &#x…...
Mac+Android Studio配置 Flutter环境
Fluttrer中文下载官网 Flutter下载官网 1、环境变量 .zshrc #Flutter export PUB_HOSTED_URL"https://pub.flutter-io.cn" export FLUTTER_STORAGE_BASE_URL"https://storage.flutter-io.cn" export FLUTTER_HOME/Users/leon/Flutter/flutter_3_10_4/f…...
架构整洁之道-设计原则
4 设计原则 通常来说,要想构建一个好的软件系统,应该从写整洁的代码开始做起。这就是SOLID设计原则所要解决的问题。 SOLID原则的主要作用就是告诉我们如何将数据和函数组织成为类,以及如何将这些类链接起来成为程序。请注意,这里…...
数据结构(队列)
一.什么是队列 1.队列定义 队列是一种特殊的线性表,特殊之处在于他只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。和栈一样,队列也是一种操作受限制的线性表。进行插入操作的一端称为队尾,进行删除操作的…...
docker容器启动后修改或添加端口 nacos容器 版本2.x需要额外开放9848、9849
1.输入docker ps -a查看需要修改的容器ID: 记录下、 docker ps -a 2.停止docker systemctl stop docker 3.进入docker 容器文件夹,找到对应容器的位置: docker的默认文件夹应该是/var/lib/docker 如果不是root用户查看的话,可能会出现权限…...
C语言实现归并排序算法(附带源代码)
归并排序 把数据分为两段,从两段中逐个选最小的元素移入新数据段的末尾。 可从上到下或从下到上进行。 动态效果过程演示: 归并排序(Merge Sort)是一种分治算法,它将一个数组分为两个子数组,分别对这两个…...
考研C语言刷题基础篇之分支循环结构基础(二)
目录 第一题分数求和 第二题:求10 个整数中最大值 第三题:在屏幕上输出9*9乘法口诀表 第四题:写一个代码:打印100~200之间的素数 第五题:求斐波那契数的第N个数 斐波那契数的概念:前两个数相加等于第三…...
Scala基础知识
scala 1、scala简介 scala是运行在JVM上的多范式编程语言,同时支持面向对象和面向函数式编程。 2、scala解释器 要启动scala解释器,只需要以下几步: 按住windows键 r输入scala即可 在scala命令提示窗口中执行:quit,即可退…...
数学建模-------误差来源以及误差分析
绝对误差:精确值-近似值; 举个例子:从A到B,应该有73千米,但是我们近似成了70千米;从C到D,应该是1373千米,我们近似成了1370千米,如果使用绝对误差,结果都是3…...
Arduino和MPLAB X 开发STM32F103和PIC16F15376
要点: 使用Arduino开发STM32F103(Blue Pill),MPLAB X 开发PIC16F15376(Curiosity Nano)C/C嵌入式开发ESP32(Arduino、ESP-IDF)和STM32实时操作系统FreeRTOS STM32使用FreeRTOS示例 在使用 FreeRTOS 时&a…...
手机操作系统Android
▶1.Android系统概述 Andaid(读[安卓)由Coosle公司和开放手机联盟共同开发,它是基于Lmx内核的开源操作系统。Andtoid主要用于移动设备,如智能手机和平板计算机。2008年发布了第一部Andtoid智能手机,以后Android逐渐扩展到平板计算机、电视、…...
2024年,你是否还在迷茫?
2024年,你是否还在迷茫? 别担心!鸿蒙来了,这个未来技术的制高点,为你提供了答案! 诸多大厂疯抢、24年预计鸿蒙相关的岗位需求将达到百万级、就业均薪达到19K,全国高校开课…… 种种现象都在表…...
ART: Automatic multi-step reasoning and tool-use for large language models 导读
ART: Automatic multi-step reasoning and tool-use for large language models 本文介绍了一种名为“自动推理和工具使用(ART)”的新框架,用于解决大型语言模型(LLM)在处理复杂任务时需要手动编写程序的问题。该框架可…...
Github 2024-01-26 开源项目日报Top10
根据Github Trendings的统计,今日(2024-01-26统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4Jupyter Notebook项目2HTML项目1Shell项目1Dockerfile项目1非开发语言项目1Go项目1Rust项目1 高级…...
广告推广网站建设/申请一个网站需要多少钱
大三即将结束,经过一段时间的较为系统的自学java, 突然看到一个自称一半以上的java程序员都会出错的程序尤为感兴趣。便深究了一番程序代码如下:package com.longpo; classPerson { privatestatic Person person new Person(); publicsta…...
陕西省建设厅网站官网/各大网站的网址
命令 [选项] [参数] 查询目录中的内容 ls: -a显示指定目录(缺省为当前目录)下所有文件,包括隐藏文件与目录 -A 不显示隐藏的文件 -b把文件名中不可输出的字符用反斜杠加字符编号的形式输出-B不显示以~结尾的文件-c根据 ctime排序及显示。…...
58同城网站招聘怎么做/微商刚起步怎么找客源
【1】页面之间无法传递变量 get,post,session在最新的php版本中自动全局变量是关闭的,所以要从上一页面取得提交过来得变量要使用$_GET[foo],$_POST[foo],$_SESSION[foo]来得到 当然也可以修改自动全局变量为开(php.ini改为register_globals On);考虑到…...
什么网站做招聘效果好/百度客服电话人工服务热线电话
整理了一些Java方面的架构、面试资料(微服务、集群、分布式、中间件等),有需要的小伙伴可以关注公众号【程序员内点事】,无套路自行领取引言MyBatis 是一种持久层框架,介于 JDBC 和 Hibernate 之间。通过 MyBatis 减少了手写 SQL 语句的痛苦&…...
dedecms怎么做网站/安徽seo优化规则
2019独角兽企业重金招聘Python工程师标准>>> 数据备份重要性: 数据尤其是一个公司的核心数据关系着公司的命脉,数据丢失可以导致公司倒闭。数据主要分为两大类: 文件类: 程序代码、图片、附件、软件包、配置文件数据&a…...
wordpress homeslide/怎样做一个网站
缓存更新策略 被动更新 设置key过期的时间,让其自动失效。 主动更新 更新DB的时候,同时更新缓存。一般业务都是主动更新和被动更新结合使用。 先更新DB,后更新缓存 对于主动更新来说,存在一个问题:你是先更新缓存&…...