Java:网络原理-TCP/IP

1.应用层

主要涉及两种情况:

(1)使用大佬们已经创建好的应用层协议.

(2)自己定义应用层协议.

[1]明确前后端交互过程中,需要传递哪些信息.

比如开发一个外卖软件,展示"商家列表"

此处就需要先确定传递的信息是啥.

a.请求:用户id; 用户所处的位置

b.响应:商家列表,包含多个商家,包含商家的名字,距离,图片,评分...

[2]明确,组织这些信息的格式.

确保前端和后端的格式是一致的.

不用凭空发明,使用现有的格式就可以了.

---------------------------------------------------------------------------------------------------------------------------------

1.xml(传统的方案)

通过"成对的标签"表示"键值对"的信息;

<request>

        <userId>1001</userId>

        <position>E45N60</position>

</request>

xml进行网络传输时有一个明显的缺点:消耗大量的带宽.网络通信中带宽是非常贵的硬件设备.

xml和html的差别: xml里的标签(键值对)都是程序员自定义的;

html里的标签,都是固定的,已经有一套标准,约定好哪些标签是合法标签,这些标签都是什么含义.

2.JSON(当前更主流的网络通信的数据格式)

相比于xml来说,可读性也是很好的,同时能节省一定的带宽.

{

        "userId":1001,

        "position":"E45N60"

}

JSON也是"键值对"格式:

键和值使用":"分割

键值对之间使用","分割 

所有的键值对,都用"{}"括起来

{"userId":1001,"position":"E45N60"}这种JSON也是合法的,但是可读性较差.

3.yml(yaml)

强制要求了数据组织格式:

键值对必须独占一行.

而且"嵌套"结构,必须通过缩进来表示.

request:

        userId:1001

        position:"E60N45"

4.google protobuffer(关注性能,牺牲了可读性)

通过二进制的方式来组织数据.

protobuffer直接通过"位置"约定字段的含义,不需要传输key的名字.

也会针对传输的数值,进行二进制的编码,起到一些"压缩"的效果.

二进制数据无法肉眼阅读,调试相关数据就会比较麻烦.

2.传输层

---------------------------------------------------------------------------------------------------------------------------------

端口号

是一个整数,用来区分不同的进程.通过两个字节的无符号整数来表示的(0--65535),

实际上0这个端口比较特殊(随机使用一个端口),不会被使用(1--65535),1--1023属于已经被预定好的

(一些知名服务器已经提起预定了这些端口) 这样的端口被称为"知名端口号",日常开发时也会避开.

说是"知名",但是大部分服务器现在都已经不使用了.(80=>http, 443=>https, 22=>ssh)

同一时刻,同一个机器上,同一个协议,一个端口只能被一个进程绑定.一个进程可以绑定多个端口. 

---------------------------------------------------------------------------------------------------------------------------------

编写服务器,肯定至少需要绑定一个端口,和客户端进行交互.

服务器运行的过程中,希望能够对这个服务器的行为,进行一些"控制"

比如让服务器重新加载某个数据/某个配置/修改服务器的某个功能

也可以通过网络通信来完成上述功能,可以让服务器绑定另一个端口(管理端口),

通过这个端口,编写一个客户端,给服务器发送一些"控制类"请求.

需要针对服务器运行状态进行检测和调试,需要查看服务器运行中某个关键变量的数值时.

千万不能使用调试器,会导致服务器的一些线程被阻塞,无法给客户端提供正确的服务.

可以通过日志打印,但是不太方便(要修改代码&&重启服务器)

可以让服务器绑定一个端口,然后实现一些相关的打印关键变量的逻辑,客户端发送对应调试请求.

---------------------------------------------------------------------------------------------------------------------------------

UDP协议

实际上UPD的数据并没有换行的操作;由UDP报头+UDP载荷组成;

UDP报头总共八个字节,固定长度,四个字段没有指定分隔符,而是通过固定长度来区分的.

UDP报文长度就是报头长度+载荷长度.

UDP长度

是由两个字节来表示的,则意味着最大值为65535==>64KB

一旦超过64KB载荷就会被截断.

解决方案:

(1)把大的数据包拆分成多个(很难行得通,分包组包充满不确定性,不一定能全都安全传输到)

(2)直接使用TCP(TCP对于长度是没有限制的,并且自身也带有可靠传输的机制,对整体通信质量有利,代码修改的成本比较低)

关于校验和

前提:网络传输的过程是,是非常容易出错的,光电信号,受环境干扰,使里面传输的情况发生改变.

校验和存在的目的就是为了能"发现"或者"纠正"这里出现的错误;

就可以在传输的过程中加入额外信息来发现/纠正传输的错误;(只是发现错误携带的信息可以较少,

若想纠正信息携带的额外信息就得很多了.

---------------------------------------------------------------------------------------------------------------------------------

校验和具体是怎么工作的呢?

希望校验和可以更加严格的检查数据的内容,可以结合内容/内容片段生成校验和,

如果出错的数据没有被校验和检查出来,这种情况也是会发生的.

UDP中使用两个字节作为校验和.

UDP使用简单有效的方案:CRC校验和(循环冗余校验)

把UDP数据报整个数据都进行遍历,分别取出每个字节,往一个两个字节的变量上累加.

发送方:基于UDP数据,计算得到一个校验和checksum1;

接收方:基于收到的UDP数据,计算得到一个新的校验和checksum2;

最终比较checksum1和checksum2的值.

还有两个比较经典的校验和算法:
MD5算法

本质上是一个"字符串hash算法",背后的实现过程是一个"数学过程",简单理解成套公式.

特点:

1.定长:无论输入的字符串有多长,算出的md5都是固定长度.(适合做为校验和算法)

2.分散:输入的内容,哪怕只有一点点发生改变,得到的md5值都会相差很多.(适合做为hash算法,出现hash冲突的概率低)

3.不可逆:根据输入的内容计算出md5非常简单,但是如果已知md5值还原出原来的内容理论上是不可行的.(合适做为加密算法)

SHA1算法

---------------------------------------------------------------------------------------------------------------------------------

基于UDP的应⽤层协议

NFS: ⽹络⽂件系统

TFTP: 简单⽂件传输协议

DHCP: 动态主机配置协

BOOTP: 启动协议(⽤于⽆盘设备启动)

DNS: 域名解析协议

---------------------------------------------------------------------------------------------------------------------------------

TCP协议

4位首部长度: 

TCP报头的长度.UDP协议报头固定就是8个字节.对TCP来说,报头的长度是可变长的.

表示TCP报头长度有多少个4字节,故TCP头部最大长度为15 * 4 = 60字节.

保留6位:

保留位,虽然现在不用,可以以备不时之需.吸取UDP教训,当未来TCP需要新增属性/某个属性长度

不够用了,就可以把保留位拿出来,用作对应的作用.

TCP的结构不需要发生太大的改变,使得升级变得容易.用于考虑未来的可扩展性.

40字节选项:

TCP报头变长的主要原因,可以有也可以没有.

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

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

相关文章

C++类的多重继承演示

一个派生类可以继承多个基类 以下代码演示派生类zzj继承两个基类people、student #include <iostream>using namespace std;class people { private:int m_age; public:people(int age);void print();~people(); };people::people(int age) {cout << "peopl…

信息安全建设方案,网络安全等保测评方案,等保技术解决方案,等保总体实施方案(Word原件)

1 概述 1.1 项目简介 1.2 测评依据 2 被测信息系统情况 2.1 定级情况 2.2 承载的业务情况 2.3 网络结构 2.4 被测对象资产 2.5 上次测评问题整改情况说明 3 测评范围与方法 3.1 测评指标 3.1.1 安全通用要求指标 3.1.2 安全扩展要求指标 3.1.3 其他安全要求指标 3.1.4 不适用安…

vue3学习---案例实现学习

目录 一&#xff0c;京东秒杀导航栏 1&#xff0c;静态样式展示 2&#xff0c;设计步骤 1&#xff0c;html骨架 2&#xff0c;css样式设计 3&#xff0c;vue3动态样式设计 1&#xff0c;v-for使用 1&#xff0c;先在js模块做如下准备 2&#xff0c;v-for遍历 2&#xff…

架构师:如何提高web网站的请求并发响应量?

文章目录 一、提出问题二、相关概念三、如何提高网站请求响应能力&#xff1f;四、负载均衡有那些方式&#xff1f;五、常用微服务架构图及推荐书籍 一、提出问题 今天&#xff0c;突然想到一个问题&#xff0c;双十一&#xff0c;那些电商网站的并发量是多大&#xff1f; 简…

中酱:健康生活的先行者

中酱&#xff1a;健康生活的先行者 在追求品质生活的道路上&#xff0c;健康是永恒的主题。每一个关乎健康的选择&#xff0c;都像是为生活点亮一盏明灯&#xff0c;指引我们走向更美好的生活。而在饮食这个与健康息息相关的领域&#xff0c;调味品的选择至关重要。中酱 —— 作…

使用CentOS宝塔面板docker搭建EasyTier内网穿透服务

0. 前言 EasyTier是一个简单、安全、去中心化的内网穿透 VPN 组网方案&#xff0c;部署方便&#xff0c;支持 MacOS/Linux/Windows/FreeBSD/Android平台&#xff0c;而且作者搭建了一个公共服务器&#xff0c;不想折腾自建服务&#xff0c;可以使用默认的公共服务器地址 tcp:/…

如何以开源加速AI企业落地,红帽带来新解法

CSDN 看到&#xff0c;生成式 AI 的火爆正在引发计算、开发、交互三大范式全面的升级和转换&#xff0c;全行业或将迎来一次全新的科技变革周期&#xff0c;可能比移动与云计算变革更加剧烈。不过 AI 经历了追求千亿模型效果和芯片、集群硬件的军备竞赛后&#xff0c;如何真正落…

计算机毕业设计Python+图神经网络手机推荐系统 手机价格预测 手机可视化 手机数据分析 手机爬虫 Django Flask Spark 知识图谱

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

【C语言】分支和循环详解(下)猜数字游戏

与诸君共进步&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 文章目录 1. 随机数的生成2. 猜数字小游戏的实现 1. 随机数的生成 掌握了前⾯学习的这些知识&#xff0c;我们就可以写⼀些稍微有趣的代码了&#xff0c;⽐如&#xff1a; 写⼀个猜数字游戏 游戏要求…

iOS灵动岛动画小组件怎么播放动画

这个灵动岛相关的展示位置分几个地方&#xff1a; 紧凑型&#xff0c;最小化&#xff0c;扩展型&#xff0c;还有锁屏位置 我们先来看一下我这边实现的动画效果 demo下载&#xff1a; iOS灵动岛GIF动画 灵动岛样式 灵动岛有三种渲染模式&#xff1a; 第一种是 紧凑型&…

西门子KTP系列HMI用户自定义弹窗-多弹窗共用

接上一个文章内容《西门子KTP系列HMI用户自定义弹窗》西门子KTP系列HMI用户自定义弹窗-CSDN博客 当我需要别的操作并且需要弹窗时&#xff0c;整个弹窗的内容和变量都需要重复重新绑定&#xff1b;如下图所示&#xff1a; 由上图可看出当前的自定义弹窗有以下缺点&#xff1a; …

Unity使用Spine导致设备发烫

spine制作过程中&#xff0c;美术同学使用裁剪技术 将一个特效文件做固定范围显示&#xff0c;实际上非常消耗CPU算力。 解决办法&#xff1a; 交给程序来实现裁剪&#xff0c;只要加Mask组件即可

您与此网站之间建立的连接不安全解决方法

如果你打开网站&#xff0c;地址栏有警告&#xff0c;点进去是这样的提示&#xff1a;您与此网站之间建立的连接不安全&#xff0c;了解详细信息。 请勿在此网站上输入任何敏感信息&#xff08;例如密码或信用卡信息&#xff09;&#xff0c;因为攻击者可能会盗取这些信息。 …

【flask开启进程,前端内容图片化并转pdf-会议签到补充】

flask开启进程,前端内容图片化并转pdf-会议签到补充 flask及flask-socketio开启threading页面内容转图片转pdf流程前端主js代码内容转图片-browser端browser端的同步编程flask的主要功能route,def 总结 用到了pdf,来回数据转发和合成,担心flask卡顿,响应差,于是刚好看到threadi…

R7:糖尿病预测模型优化探索

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、实验目的&#xff1a; 探索本案例是否还有进一步优化的空间 二、实验环境&#xff1a; 语言环境&#xff1a;python 3.8编译器&#xff1a;Jupyter notebo…

张氏宗谱序言白话文翻译

序言&#xff1a; 回想千家有赤松子的传承&#xff0c;张家有 “百忍” 的风范。感慨因迁徙和战乱、水灾之苦&#xff0c;远居他乡而失去了家族秩序。想起自从从泗州来到淮安&#xff0c;安家在安东县东北乡众湖荡之地。&#xff08;这里可能在回忆家族的迁徙历史&#xff09;…

从0开始学习Linux——Yum工具

往期目录&#xff1a; 从0开始学习Linux——简介&安装 从0开始学习Linux——搭建属于自己的Linux虚拟机 从0开始学习Linux——文本编辑器 上一个章节我们简单了解了Linux中常用的一些文本编辑器&#xff0c;本次教程我们将学习yum工具。 一、Yum简介 Yum&#xff08;全名…

推荐一款基于Flash的交互式园林设计工具:Garden Planner

Garden Planner是一款由Artifact Interactive开发的基于Flash的交互式园林设计工具。它允许用户以拖放的方式安排植物、树木、建筑物和各种对象&#xff0c;使园林规划变得简单直观。此外&#xff0c;Garden Planner提供工具来快速创建铺路、路径和围栏&#xff0c;帮助用户设计…

WinForms 中使用 MVVM 模式构建应用:实现登录页面、页面导航及 SQLite 数据库连接完整框架搭建过程

前言 在传统的 WinForms 应用程序开发中&#xff0c;很多开发者使用事件驱动的设计模式&#xff0c;直接将业务逻辑编写在界面代码中。然而&#xff0c;随着应用程序的复杂性增加&#xff0c;单一的界面文件变得臃肿&#xff0c;难以测试和维护。借鉴 WPF 中 MVVM&#xff08;…

诗林工作室(编号:mb0003)分享:Finbiz自适应响应式网页设计模版,适用于前端设计、博客、官网等多类型开发模版

本设计模版来自外网&#xff0c;为HTML类型的模版&#xff0c;色彩多样&#xff0c;适合Web开发人员做前端站点设计参考使用。全站模版倾向于官网设计、自主博客等多行业的平台模版开发&#xff0c;适合各大CMS的主题模版开发参考&#xff0c;如常见的Wordpress主题开发、Z-Blo…