网络分层和网络原理之UDP和TCP

温故而知新

目录

网络分层 

应用层 

http协议

传输层

介绍 

UDP协议

TCP协议 

网络层

数据链路层

物理层


网络分层 

一. 应用层 

应用程序

现成的应用层协议有超文本协议http(不仅仅有文本).

http协议

http://t.csdnimg.cn/e0e8kicon-default.png?t=N7T8http://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个字节。

  1. 源端口号(Source Port):占用2个字节,表示发送方使用的端口号。
  2. 目标端口号(Destination Port):占用2个字节,表示接收方使用的端口号。
  3. 长度(Length):占用2个字节,表示UDP首部和数据的总长度,包括8字节的UDP首部和数据部分的长度。
  4. 校验和(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包下的DatagramSocketDatagramPacket类来实现

无连接:知道对方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 socket
            DatagramSocket 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 socket
            DatagramSocket 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);

            // 关闭socket
            senderSocket.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协议的组成主要包括以下部分:

  1. 源端口号(Source Port):占用2个字节,表示发送方使用的端口号。
  2. 目标端口号(Destination Port):占用2个字节,表示接收方使用的端口号。
  3. 序列号(Sequence Number):占用4个字节,表示本次传输的第一个字节的序列号。
  4. 确认号(Acknowledgment Number):占用4个字节,表示期望接收到的下一个字节的序列号。
  5. 数据偏移(Data Offset):占用4个位,表示TCP首部长度,单位为4字节,因此TCP首部长度最大值为60字节。
  6. 保留位(Reserved):占用6个位,保留未来使用,必须设置为0。
  7. 控制位(Flags):占用6个位,包含ACK、SYN、FIN等标志位,用于控制TCP连接的建立、维护和关闭。其中ack为1,表示它表示应答报文,ack为0表示普通报文。SYN为。
  8. 窗口大小(Window Size):占用2个字节,表示接收窗口的缓冲区大小,用于流量控制。
  9. 检验和(Checksum):占用2个字节,用于检测TCP首部和数据在传输过程中是否发生错误。
  10. 紧急指针(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.如果接收方没收到,可以有补救手段;

三. 网络层

关注路径规划

四. 数据链路层

关注路径中节点的连接

五. 物理层

关注设备

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

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

相关文章

云手机哪一款好用?

随着海外市场的不断发展,云手机市场也呈现蓬勃的态势,众多云设备软件纷纷涌现。企业在选择云手机软件时,如何找到性能卓越的软件成为一项关键任务。在众多选择中,OgPhone云手机凭借其卓越的性能和独特功能脱颖而出。以下是OgPhone…

音频格式之AAC:(3)AAC编解码原理详解

系列文章目录 音频格式的介绍文章系列: 音频编解码格式介绍(1) ADPCM:adpcm编解码原理及其代码实现 音频编解码格式介绍(2) MP3 :音频格式之MP3:(1)MP3封装格式简介 音频编解码格式介绍(2) MP3 :音频格式之MP3&#x…

一文详解C++拷贝构造函数

文章目录 引入一、什么是拷贝构造函数?二、什么情况下使用拷贝构造函数?三、使用拷贝构造函数需要注意什么?四、深拷贝和浅拷贝浅拷贝深拷贝 引入 在现实生活中,可能存在一个与你一样的自己,我们称其为双胞胎。 相当…

5|领域建模实践(上):怎样既准确又深刻地理解业务知识?

上节课咱们完成了事件风暴,梳理了系统的行为需求。但你可能也发现了,其实还有些微妙的业务概念还没有澄清,这就要靠领域建模来完成了。 建立领域模型是 DDD 的核心。要建好领域建模,需要理论和实践相结合。由于我们的模型有一定的…

CSC签证费报销的相关规定及要求-主要国家签证费报销凭据

国家留学基金委(CSC)派出流程很多是在留学服务机构办理,即北京教育部留学服务中心及教育部出国人员上海集训部,其中含签证费报销。本篇知识人网小编以上海集训部为例,详细解读一下签证费报销的相关规定及要求&#xff…

sql 行转列 日周月 图表统计

目录 目录 需求 准备 月 分析 按月分组 行转列 错误版本 正确版本 日 分析 行转列 周 分析 按周分组 行转列 本年 需求 页面有三个按钮 日周月,统计一周中每天(日),一月中每周(周),一年中每月(月),设备台数 点…

Linux中断 -- 中断路由、优先级、数据和标识

目录 1.中断路由 2.中断优先级 3.中断平衡 4.Linux内核中重要的数据结构 5.中断标识 承前文,本文从中断路由、优先级、数据结构和标识意义等方面对Linux内核中断进行一步的解析。 1.中断路由 Aset affinity flow GIC文中有提到SPI类型中断的路由控制器寄存器为…

Leetcode—114. 二叉树展开为链表【中等】

2023每日刷题(九十八) Leetcode—114. 二叉树展开为链表 Morris-like算法思想 可以发现展开的顺序其实就是二叉树的先序遍历。算法和 94 题中序遍历的 Morris 算法有些神似,我们需要两步完成这道题。 将左子树插入到右子树的地方将原来的右…

Java - OpenSSL与国密OpenSSL

文章目录 一、定义 OpenSSL:OpenSSL是一个开放源代码的SSL/TLS协议实现,也是一个功能丰富的加密库,提供了各种主要的加密算法、常用的密钥和证书封装管理功能以及SSL协议。它被广泛应用于Web服务器、电子邮件服务器、VPN等网络应用中&#x…

线性表--栈

1.什么是栈? 栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除 操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出的原则。 压栈:栈的插入操作叫做进栈/压栈/入栈&#xff…

YOLOv5改进 | Conv篇 | 在线重参数化卷积OREPA助力二次创新(提高推理速度 + FPS)

一、本文介绍 本文给大家带来的改进机制是一种重参数化的卷积模块OREPA,这种重参数化模块非常适合用于二次创新,我们可以将其替换网络中的其它卷积模块可以不影响推理速度的同时让模型学习到更多的特征。OREPA是通过在线卷积重参数化(Online Convolutional Re-parameteriza…

TensorFlow2实战-系列教程3:猫狗识别1

🧡💛💚TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 1、项目介绍 基本流程: 数据预处理:图像数据处理&#xff0c…

Spring 的执行流程以及 Bean 的作用域和生命周期

文章目录 Bean 的作用域更改作用域的方式singletonprototype Spring 执行流程Bean 的生命周期 Bean 的作用域 Spring 容器在初始化⼀个 Bean 的实例时,同时会指定该实例的作用域。Bean 有6种作用域 singleton:单例作用域prototype:原型作用域…

Hadoop-MapReduce-MRAppMaster启动篇

一、源码下载 下面是hadoop官方源码下载地址&#xff0c;我下载的是hadoop-3.2.4&#xff0c;那就一起来看下吧 Index of /dist/hadoop/core 二、上下文 在上一篇<Hadoop-MapReduce-源码跟读-客户端篇>中已经将到&#xff1a;作业提交到ResourceManager&#xff0c;那…

首发:2024全球DAO组织发展研究

作者&#xff0c;张群&#xff08;专注DAO及区块链应用研究&#xff0c;赛联区块链教育首席讲师&#xff0c;工信部赛迪特邀资深专家&#xff0c;CSDN认证业界专家&#xff0c;微软认证专家&#xff0c;多家企业区块链产品顾问&#xff09; DAO&#xff08;去中心化自治组织&am…

adb测试冷启动和热启动 Permission Denial解决

先清理日志 adb shell logcat -c 打开手机模拟器中的去哪儿网&#xff0c;然后日志找到包名和MainActivity adb shell logcat |grep Main com.Qunar/com.mqunar.atom.alexhome.ui.activity.MainActivity 把手机模拟器的去哪儿的进程给杀掉 执行 命令 adb shell am start -W…

TensorFlow2实战-系列教程1:回归问题预测

&#x1f9e1;&#x1f49b;&#x1f49a;TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 1、环境测试 import tensorflow as tf import numpy as np tf.__version__打印结果 ‘…

深入理解Redis:如何设置缓存数据的过期时间及其背后的机制

目录 Redis 给缓存数据设置过期时间 Redis是如何判断数据是否过期的呢&#xff1f; 过期的数据的删除策略 Redis 内存淘汰机制 Redis 给缓存数据设置过期时间 一般情况下&#xff0c;我们设置保存的缓存数据的时候都会设置一个过期时间。为什么呢&#xff1f; 因为内存是有…

4小时精通MyBatisPlus框架

目录 1.介绍 2.快速入门 2.1.环境准备 2.2.快速开始 2.2.1引入依赖 2.2.2.定义Mapper ​编辑 2.2.3.测试 2.3.常见注解 ​编辑 2.3.1.TableName 2.3.2.TableId 2.3.3.TableField 2.4.常见配置 3.核心功能 3.1.条件构造器 3.1.1.QueryWrapper 3.1.2.UpdateWra…

Redis(八)哨兵机制(sentinel)

文章目录 哨兵机制案例认识异常 哨兵运行流程及选举原理主观下线(Subjectively Down)ODown客观下线(Objectively Down)选举出领导者哨兵选出新master过程 哨兵使用建议 哨兵机制 吹哨人巡查监控后台master主机是否故障&#xff0c;如果故障了根据投票数自动将某一个从库转换为新…