当前位置: 首页 > news >正文

【网络编程】网络原理(一)

系列文章目录

1、 初识网络
2、网络编程的基础使用(一)


文章目录

  • 系列文章目录
  • 前言
  • 一、端口号的使用
  • 二、UDP报文学习
    • 1.报文格式
    • 2.MD5算法
  • 总结


前言

在前文中,主要对UDP和TCP协议有了简单的了解,而这两种协议是负责传输层的内容。我们知道,在传输层中,有IP地址和端口号的概念,在这里我们需要注意,每个进程/应用程序的端口号是不能被重复使用的。
在下面的文章中,我们将继续深入了解这两个协议。


一、端口号的使用

在传输层中,两个进程不能绑定同一个端口号。

  1. 如果一个是TCP服务器,一个是UDP服务器,二者使用同一个端口是不会影响的。同种协议下的二者进程端口号是不能一致的。
  2. 一个进程可以同时绑定多个端口号。常见于根据端口号的不同提供,服务器执行的对应逻辑不相同。

二、UDP报文学习

1.报文格式

在UDP协议中,应用层数据抵达UDP之后,就会给这些数据加上UDP报头。
UDP数据报(DatagramPacket) = 报头+数据载荷
报头长度为8字节,分为4部分,每部分长度为2字节。 下图为UDP数据报的报文格式。
在这里插入图片描述

  1. 源端口号:即发送方端口号。

  2. 目的端口号:即接收方端口号。

  3. UDP长度:长度为2字节,即0-65535b = 64kb 这就是一个UDP数据报最大的容量了。通过UDP长度我们就可以知道载荷的容量。
    我们知道,现如今64kb已经是一个很小的容量了,随着数据的增多,就会越来越接近于64kb的上限。这就会导致一份大容量的数据需要被拆分成多个UDP数据报的形式进行发送,不仅大大消耗了系统资源,同时对性能也是一个不小的考验。

  4. UDP校验和(checkSum):数据在网络传输过程中可能会存在数据出错的现象,我们称之为“比特翻转”。简单一点理解就是原本二进制为0的数据可能会在传输过程中变成二进制为1的情况。

     为此,我们需要对发送过来的数据进行检验,是否与原来的数据一致。[1]基于UDP数据报中本身容量的限制,在UDP中,我们只能做到检查数据是否出错的程度。使用的方式为CRC检验。[2]校验和的方式是对数据进行一系列的计算,如果数据发生改变,校验和得到的结果也就不相同了。
    

    对校验和简单理解:在A端对数据内容进行计算得到检验和A,而发送到B端后对数据内容计算得到校验和B,通过校验和B与检验和A对比之后就可以知道数据是否出错。
    在这里插入图片描述

  5. 由于UDP数据报属于不可靠传输,适用于性能要求比较高,可靠性要求不高的场景。

2.MD5算法

在UDP数据报中,只能通过CRC算法简单得出数据是否出错,却不能知道数据在哪个地方出错。
而之后不断推陈出新的协议中,开始引入了MD5算法,通过MD5算法,一个错误的数据和正确的数据之间所得出来的校验和相差巨大。可以通过这样的特性来弄清楚数据错误的大致位置。
对于MD5算法,将数据转换成16进制是十分简单的,而还原难度十分大。感兴趣的可以在下面的链接中进行测试。
MD5在线网站


总结

在本文中,对于UDP协议的报文格式有了简单的了解,我们知道了UDP报文格式的内容,那么TCP报文会是什么情况呢?

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 政务服务技能竞赛规则流程方案
  • WINDOWS搭建nps/npc服务器
  • dpdk实现udp协议栈
  • 各地级市能源消费总量、夜间灯光值数据(2000-2022年)
  • 【雅思考试】-- Day4 - 单词
  • 人生苦短,我用 Python,AI 模型助力高效数据提取
  • C# 中读取byte[]转化成数字
  • 【网络】网络编程套接字(二)
  • 基于C#调用文心一言大模型制作桌面软件(可改装接口)
  • HarmonyOS鸿蒙开发学习:鸿蒙基础-基础环境-ArkTS-组件-样式
  • C++ exe程序内存占用分析之Linux篇
  • Java 设计模式之策略模式 (Strategy Pattern) 详解
  • 【C语言篇】猜数字游戏(赋源码)
  • js如何判断一个数在某一个等差区间之内
  • Mojo AI编程语言(十七)跨平台开发:应用广泛适配
  • 「译」Node.js Streams 基础
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Angular 响应式表单 基础例子
  • Angular2开发踩坑系列-生产环境编译
  • CSS 专业技巧
  • CSS相对定位
  • fetch 从初识到应用
  • java正则表式的使用
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • node 版本过低
  • supervisor 永不挂掉的进程 安装以及使用
  • use Google search engine
  • Vue UI框架库开发介绍
  • vue.js框架原理浅析
  • 对超线程几个不同角度的解释
  • 通过git安装npm私有模块
  • 通过几道题目学习二叉搜索树
  • 源码安装memcached和php memcache扩展
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 2017年360最后一道编程题
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​第20课 在Android Native开发中加入新的C++类
  • # include “ “ 和 # include < >两者的区别
  • #pragam once 和 #ifndef 预编译头
  • #QT(TCP网络编程-服务端)
  • #控制台大学课堂点名问题_课堂随机点名
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (1)SpringCloud 整合Python
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (五)关系数据库标准语言SQL
  • (一)appium-desktop定位元素原理
  • (转) 深度模型优化性能 调参
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)http-server应用
  • (转)memcache、redis缓存
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • **PHP二维数组遍历时同时赋值
  • .FileZilla的使用和主动模式被动模式介绍