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

网络原理TCP/IP(1)

文章目录

  • 端口号
  • UDP协议

在网络通信中,协议非常重要
协议进行了分层
应用层就是对应着应用程序,是程序员打交道最多的这一层,调用系统提供的网络api写出来的代码都是属于应用层的

应用层有很多现成的协议,但是更多的还是程序员需要根据实际场景自定义协议

自定义协议,约定好两方面内容
1.服务器和客户端之间要交互哪些信息
2.数据的具体格式

客户端按照上述约定发送请求,服务器按照上述约定解析请求
服务器按照上述约定构造响应,客户端也按照上述约定解析相应

为了让程序员更方便的去约定这里的协议格式,业界也给出了几个比较好用的方案,
1.xml(可扩展标记语言)
使用标签来定义语言,标签成对出现,标签的名字 / 标签的值 / 标签的嵌套关系都是程序员自定义的

2.json
举例:

请求
{userld: 1000,position:[经纬度]
}
相应
{id: 1001,name:"麻辣烫"
}

键值对结构
键和值之间使用:分割
键值对之间使用,分割
把若干个键值对使用{ }括起来,此时就形成一个json对象
还可以把多个json对象放在一起,使用,分割开,并且使用[ ]整体括起来就形成了一个json数组
相比于xml来说,json占用空间小,更节省了带宽

3.protobuffer
更节省带宽的方式,效率最高的方式

端口号

端⼝号(Port)标识了⼀个主机上进⾏通信的不同的应⽤程序;
在这里插入图片描述
端口号范围划分
• 0-1023:知名端⼝号,HTTP,FTP,SSH等这些⼴为使⽤的应⽤层协议,他们的端⼝号都是固定的
.• 1024-65535:操作系统动态分配的端⼝号.客⼾端程序的端⼝号,就是由操作系统从这个范围分配
的.
认识知名端口号(Well-Know Port Number)
有些服务器是⾮常常⽤的,为了使⽤⽅便,⼈们约定⼀些常⽤的服务器,都是⽤以下这些固定的端⼝号:
• ssh服务器,使⽤22端⼝
• ftp服务器,使⽤21端⼝
• telnet服务器,使⽤23端⼝
• http服务器,使⽤80端⼝
• https服务器,使⽤443
我们⾃⼰写⼀个程序使⽤端⼝号时,要避开这些知名端⼝号

UDP协议

特点:
无连接,不可靠传输,面向数据报,全双工
研究一个协议,主要研究报文格式,基于报文格式,来了解这个协议的其他各个特性
UDP数据报 = 报头(重点) + 载荷(应用层数据包)
在这里插入图片描述
上述图其实不准确,教材为了排版方便
在这里插入图片描述

16位UDP⻓度,表⽰整个数据报(UDP⾸部+UDP数据)的最⼤⻓度;
• 如果校验和出错,就会直接丢弃;
UDP报头一共有四个字段,每个字段两个字节(一共八个字节)
协议报头中使用2个字节表示端口号,端口号的取值范围就是0–65535
因此一个UDP数据报最大长度就是64KB,无法更长了

校验和
验证数据传输过程中是否正确
前提:数据在网络传输过程中,可能坏掉
校验和的作用就是用来识别当前数据是否出现了比特翻转
UDP中,校验和使用比较简单的方式,CRC(循环冗余校验)算法完成校验
校验和使用过程:UDP数据报发送方,在发送之前,先计算一遍CRC,把计算好的CRC值放到UDP数据报中(设这个CRC值为value1),接下来这个数据报通过网络传输到达接收端,接收端收到这个数据之后,也按照同样的算法再算一遍CRC的值,得到的结果是value2,比较自己计算的value2和收到的value1是否一致,如果一致的,就说明数据是正确的,如果不一致,传输过程中发生了比特翻转了
上述的CRC算法中,如果只有一个bit位发生翻转,此时100%能够发现问题,如果有两个/多个bit位发生翻转,有可能恰好校验和和之前一样

除了CRC之外,还有一些更高精度的校验和算法
常用的有md5算法和sha1算法
md5背后有一系列的数学公式,md5的特点:
1.定长:无论原始数据多长,算出来的md5的最终值都是固定长度,常用的md5有16位版本(2字节),32位版本(4字节),64位版本(8字节)
2.分散:计算md5的过程中,原始数据只要有一点变化,算出来的md5值就会差别很大
3.不可逆:一个源字符串,计算md5值过程非常简单,但是一个算好的md5值,还原回原始的字符串,理论上是不可完成的

相关文章:

  • 如何接手一个新系统
  • CKS1.28【1】kube-bench 修复不安全项
  • Vue3自定义PostCss插件
  • 蓝桥杯---生日蜡烛
  • 【机器学习】基于集成学习的 Amazon 用户评论质量预测
  • 重写Sylar基于协程的服务器(6、HOOK模块的设计)
  • MongoDB 聚合:$listSessions
  • Java 正则匹配sql
  • C#验证字符串的长度,用正则表达式 vs 字符数组长度或字符串的长度
  • 字符函数和字符串函数
  • 数据结构——B/顺序表和链表
  • 自动化报告pptx-python|如何将pandas的表格写入PPTX(二)
  • MAE实战:使用MAE提高主干网络的精度(一)
  • 回归预测 | Matlab实现WOA-CNN-LSTM-Attention鲸鱼算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制)
  • Linux项目自动化构建工具之make/Makefile演示gcc编译
  • 分享一款快速APP功能测试工具
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 《剑指offer》分解让复杂问题更简单
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Android开源项目规范总结
  • java2019面试题北京
  • JavaScript服务器推送技术之 WebSocket
  • leetcode讲解--894. All Possible Full Binary Trees
  • rc-form之最单纯情况
  • Sass Day-01
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Shell编程
  • 程序员该如何有效的找工作?
  • 分布式事物理论与实践
  • 简单易用的leetcode开发测试工具(npm)
  • 将回调地狱按在地上摩擦的Promise
  • 前端攻城师
  • 如何在 Tornado 中实现 Middleware
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 携程小程序初体验
  • 译米田引理
  • 由插件封装引出的一丢丢思考
  • Android开发者必备:推荐一款助力开发的开源APP
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • python最赚钱的4个方向,你最心动的是哪个?
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 浅谈sql中的in与not in,exists与not exists的区别
  • 选择阿里云数据库HBase版十大理由
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (145)光线追踪距离场柔和阴影
  • (31)对象的克隆
  • (6)设计一个TimeMap
  • (9)STL算法之逆转旋转
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (ZT)一个美国文科博士的YardLife
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)LINQ之路