【JavaEE网络】TCP/IP协议:细节与应用

目录

    • TCP/IP协议
      • 协议格式
      • 传输层重点协议
        • UDP协议
          • UDP协议端格式
        • UDP的特点
        • TCP协议
          • TCP协议端格式
        • TCP的特点


TCP/IP协议

协议格式

应用层(后端开发必知必会):这一层也有很多现成的协议(后面还会重点介绍HTTP协议,这是做网站必备的)也有很多时候,是需要程序员自己定义协议的

客户端,需要给服务器发起一个请求,服务器收到请求之后,就给客户端返回一个响应

以下以外卖软件举例

客户端和服务器之间的沟通有很多种形式,因此需要在开发设计这个程序的时候,就需要提前做好良好的规划。这里的设计是非常灵活的,最主要的是要有一个固定的标准

举例:

做出如下设计:

  1. 明确当前请求和响应中包含哪些信息(根据需求来的)

请求:用户身份,用户当前位置…

响应:商家的名称,图片,好评率,距离你的位置,评分…

  1. 明确具体的请求和响应的格式

请求:

示例1:

请求:1234,80,100\n

所谓的“明确格式”就是看你按照啥样的方式,构造出一个字符串后续这个字符串就可以作为 tcp 或者 udp 的 payload 进行传输

另一方面服务器就可以对这个字符串进行解析,解析出 逗号 前面的是userld,逗号后面的是经度纬度

响应:

魏家凉皮,1.jpg,98%,1km,4.7\n

杨国福,2.jpg,99%,1.2km,4.8\n

\n

这个时候就构造出了一个响应这样的字符串,客户端就可以按照这样的格式来进行解析了

实际上,上述这样的格式约定,咋搞都行。任意进行约定的,只要保证,客户端和服务器遵守同一个约定即可

实例2:

在这里插入图片描述

实际上,以上的格式约定,咋样都行,任意进行约定的,只要保证,客户端和服务器遵守同一个约定即可。请求和响应的具体的数据组织形式,是非常灵活的。只要程序员想都行,只要客户端和服务器使用的是相同的规则即可

自定义协议:

  1. 明确传递的信息是有啥
  2. 约定好信息按照啥样的格式组织成(二进制)字符串

介绍几个通用重要的协议格式:

  1. xml

是以成对的标签,来表示“键值对”信息,同时标签支持嵌套,就可以构成一些更复杂的树形结构数据

//请求
<request><userld>1234<userld><position>100 80</position>
<request>//响应
<response><shops><shop><name>魏家原皮</name><image>1.jpg</image><distance>1km</distance><rate>96%<rate<star>4.7</star></shop><shop><name>杨国福麻辣烫《name><image>2.jpg</image><distance>1km</distance><rate>96%<rate><star>4.7</star></shop><shops>
<response>

优点:xml非常清晰的把结构化数据表示出来了

缺点:表示数据需要引入大量的标签,看起来繁琐,同时也会占用不少的网络带宽(国内最贵的硬件资源,就是网络带宽)

xml越来越少了,有一些新的单体xml

  1. json(最流行的一种数据组织格式)

本质上也是键值对,看起来,比xml格式要干净不少

请求:
{userld:1234position: "10080"
}响应:
[{name:魏家凉皮image:1.jpgdistance:"1kmrate:96%star:4.7},{name:杨国福琳辣烫image:2.jpg,distance:1kmrate:96%star:4.7}
]

**优势:**相比于xml,表示的数据简洁很多,可读性非常好,方便程序员观察中间结果,为方便调试问题

**劣势:**终究是要花费一定的带宽来传输key的名字

当前最主流使用的一种网络传输数据的格式,未来在实际开发中会经常用到json格式的数据。

json对于换行并不敏感,如果这些内容全放在同一行,也是完全合法的

一般网络传输的时候,会对json进行压缩(去掉不必要的换行和空格),同时把所有数据放到一行去,整体占用的带宽就更降低了(影响到可读性)

也有很多现成的json格式化工具

  1. protobuffer(主要用于对于性能要求更高的场景)

谷歌提出的一套二进制的数据序列化方式。使用二进制的方式,约定某几个字节,表示哪个属性,最大程度的节省空间(不必传输key,根据位置和长度,区分每个属性的)

优点:节省带宽,最大化效率

缺点:二进制数据,无法肉眼直接观察,不方便调试,使用起来比较复杂

  1. 除了以上三种,还有很多序列化方式的。

学习一个协议,当然要掌握协议的特性,还需要理解报文格式

传输层重点协议

负责数据能够从发送端传输接收端。

UDP协议
UDP协议端格式

在这里插入图片描述

  • 16位UDP长度,表示整个数据报(UDP首部+UDP数据)的最大长度;
  • 如果校验和出错,就会直接丢弃;

其实这图不算准确,是为了排版方便做的妥协,以下才是整个UDP数据报图文结构

在这里插入图片描述

网络传输的过程中,收到外界干扰,数据可能出错。本质上是光信号/电信号/电磁波

UDP的校验和具体是咋实现的?使用了一种简单粗暴的CRC校验算法(循环冗余校验和)

  1. 把UDP数据报中每个字节都依次进行累加
  2. 把累加结果保存到2个字节的变量中,加着加着,可能就溢出了,但无所谓,所有字节都加一遍,最终就得到了校验和
  3. 传输数据的时候,就把原始数据和校验和一起传递过去
  4. 接收方收到数据时,同时也收到了发送端送过来的校验和(旧的校验和),接收方按照同样的方式再算一遍,得到新的校验和
  5. 如果新的和旧的相同,就视为数据传输过程中是正确的,如果不同,就视为数据传输过程中数据出错了
UDP的特点

UDP传输的过程类似于寄信

  1. 无连接

客户端在开始就直接send,服务器在开始就直接receive没有进行连接

  1. 不可靠

  2. 面向数据报

//客户端
DatagramPacket requestPacket=new DatagramPacket(request.getBytes(),request.getBytes().length,InetAddress.getByName(serverIp),serverPort);
//客户端
DatagramPacket responsePacket=new DatagramPacket(new byte[4096],4096);

都是packet

  1. 全双工
//客户端
socket.send(requestPacket);
//客户端
socket.receive(responsePacket);
  1. 缓冲区

  2. 大小受限

TCP协议

TCP,即Transmission Control Protocol,传输控制协议。人如其名,要对数据的传输进行一个详细的控制。

TCP是一个最重要的协议,用的特别多(HTTP也是基于TCP)

TCP协议端格式

在这里插入图片描述

  • 源/目的端口号:表示数据是从哪个进程来,到哪个进程去;

端口号属于哪一层中的概念?传输层

  • 32位序号/32位确认号:后面详细讲;
  • 4位TCP报头长度(除了数据光看头部的长度):表示该TCP头部(TCP头部是变长的)有多少个32位bit(有多少个4字节),4位表示的范围是0~15,但单位是4字节;所以TCP头部最大长度是15 * 4 = 60(需要使用首部长度,来确认,报头到哪里就结束了,载荷数据从哪里开始)
  • 6位标志位(每个1bit,表示非常重要的含义):
    • URG:紧急指针是否有效
    • ACK:确认号是否有效
    • PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
    • RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段
    • SYN:请求建立连接;我们把携带SYN标识的称为同步报文段
    • FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段
  • 16位窗口大小:后面再说
  • 16位校验和:发送端填充,CRC校验。接收端校验不通过,则认为数据有问题。此处的检验和不光包含TCP首部,也包含TCP数据部分。
  • 16位紧急指针:标识哪部分数据是紧急数据;
  • 40字节头部选项:暂时忽略;
TCP的特点
  1. 有连接
  2. 可靠传输(最核心的特性)
  3. 面向字节流
  4. 全双工
  5. 缓冲区
  6. 大小限制

可靠传输是内核实现的,写代码是感知不到的。

TCP对数据传输提供的管控机制,主要体现在两个方面:安全和效率。

这些机制和多线程的设计原则类似:保证数据传输安全的前提下,尽可能的提高传输效率。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

命令执行漏洞【2】vulhub远程命令执行漏洞复现

1.vulhub安装启动靶场环境 &#xff08;1&#xff09;s2-061开启靶场 &#xff08;2&#xff09;s2-059开启靶场 2.漏洞复现 &#xff08;1&#xff09;s2-061漏洞复现 github获取漏洞利用工具 开始利用 &#xff08;2&#xff09;s2-059漏洞复现 在linux特有临时目录/tmp下…

C#实现TFTP客户端

1、文件结构 2、TftpConfig.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace TftpTest {public class TftpConfig{}/// <summary>/// 模式/// </summary>public enum Modes{…

Linux论坛搭建

1.安装httpd服务 1.1安装httpd软件 [rootlocalhost yum.repos.d]# dnf install httpd 1.2.修改httpd的配置 [rootlocalhost yum.repos.d]# vim /etc/httpd/conf/httpd.conf 1.3.启动这个httpd服务,并查看它的状态 [rootlocalhost yum.repos.d]# systemctl start httpd [ro…

JavaEE——spring MVC请求处理

目录 主要目的&#xff1a; 1. Spring web 项目搭建 2. 添加依赖 3. 配置插件 4. 配置设置类 5. 编写controller层类 6. 编写测试的http请求 主要目的&#xff1a; 创建一个spring web项目&#xff1b; 创建控制类&#xff1b; 掌握如何配置MVC&#xff1b; 编写htt…

【机器学习-18】特征筛选:提升模型性能的关键步骤

一、引言 在机器学习领域&#xff0c;特征筛选是一个至关重要的预处理步骤。随着数据集的日益庞大和复杂&#xff0c;特征的数量往往也随之激增。然而&#xff0c;并非所有的特征都对模型的性能提升有所贡献&#xff0c;有些特征甚至可能是冗余的、噪声较大的或者与目标变量无关…

Django框架之python后端框架介绍

一、网络框架及MVC、MTV模型 1、网络框架 网络框架&#xff08;Web framework&#xff09;是一种软件框架&#xff0c;用于帮助开发人员构建Web应用程序和Web服务。它提供了一系列预先编写好的代码和工具&#xff0c;以简化开发过程并提高开发效率。网络框架通常包括以下功能…

常用组件(启停活动页面、活动之间传递信息、收发应用广播、操作后台服务)

启停活动页面 Activity的启动和结束 页面跳转可以使用startActivity接口&#xff0c;具体格式为startActivity(new Intent(this, 目标页面.class));。 关闭一个页面可以直接调用finish();方法即可退出页面。 Activity的生命周期 页面在安卓有个新的名字叫活动&#xff0c;因…

充电机是什么?其技术原理和行业应用

充电机是一种能够为电池充电的设备,通常由一个变压器和整流器组成。变压器将电网中的交流电转换为直流电,而整流器则将直流电转换为稳定的直流电,这种直流电可以被用来给电池充电。 充电机可以分为很多种不同类型,包括输入输出式、输入输出隔离式和车载充电机等。不同类型的充…

GoLand 2021.1.3 下载与安装

当前环境&#xff1a;Windows 8.1 x64 1 浏览器打开网站 https://www.jetbrains.com/go/download/other.html 找到 2021.1.3 版本。 2 解压 goland-2021.1.3.win.zip 到 goland-2021.1.3.win。 3 打开 bin 目录下的 goland64.exe&#xff0c;选择 Evaluate for free -- Evalu…

论文解读-面向高效生成大语言模型服务:从算法到系统综述

一、简要介绍 在快速发展的人工智能&#xff08;AI&#xff09;领域中&#xff0c;生成式大型语言模型&#xff08;llm&#xff09;站在了最前沿&#xff0c;彻底改变了论文与数据交互的方式。然而&#xff0c;部署这些模型的计算强度和内存消耗在服务效率方面带来了重大挑战&a…

ABS8-ASEMI新能源专用整流桥ABS8

编辑&#xff1a;ll ABS8-ASEMI新能源专用整流桥ABS8 型号&#xff1a;KBL410 品牌&#xff1a;ASEMI 封装&#xff1a;ABS-4 最大重复峰值反向电压&#xff1a;800V 最大正向平均整流电流(Vdss)&#xff1a;1A 功率(Pd)&#xff1a;小功率 芯片个数&#xff1a;4 引脚…

夜神、雷电、android studio手机模拟器资源占用情况

夜神、雷电、android studio手机模拟器内存资源占用情况 由于开发电脑只有16G内存&#xff0c;出于开发需要和本身硬件资源的限制&#xff0c;对多个手机模拟器进行了机器资源占用&#xff08;主要是内存&#xff09;的简单比较。 比较的模拟器包括&#xff1a; 1. Android S…

MATLAB 向量

MATLAB 向量 向量是一维数字数组。MATLAB允许创建两种类型的向量 行向量 列向量 行向量 行向量通过将元素集括在方括号中并使用空格或逗号定界元素来创建。 示例 r [7 8 9 10 11] MATLAB将执行上述语句并返回以下结果- r 7 8 9 10 11 列向量 列向量 通过将元素集括在方…

操作系统安全:Linux安全审计,Linux日志详解

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

区块链技术与应用学习笔记(10-11节)——北大肖臻课程

目录 10.分岔 ①什么是分叉&#xff1f; ②导致分叉的原因&#xff1f; ③在比特币新共识规则发布会会导致什么分叉&#xff1f; 什么是硬分叉&#xff1f; 硬分叉例子&#xff1f; 什么是软分叉&#xff1f; 软分叉和硬分叉区别&#xff1f; 软分叉实例 11.问答 转…

【从后端日志文件中过滤出sql语句】

从后端日志文件中过滤出sql语句 why?思路日志文件的格式 结果 why? 为什么会有这种需求&#xff1f;&#xff0c;mysql数据不小心被删了完全可以从备份数据恢复&#xff0c;或者从binlog中恢复&#xff0c;但是如果前面这两种方法没办法处理&#xff08;没有备份数据库文件、…

科技云报道:走入商业化拐点,大模型“开箱即用”或突破行业困局

科技云报道原创。 大模型加速狂飙&#xff0c;AI商业化却陷入重重困境。 一方面&#xff0c;传统企业不知道怎么将AI融入原始业务&#xff0c;另一方面&#xff0c;AI企业难以找到合适的商业化路径。 纵观海外AI玩家&#xff0c;已经有许多企业趟出了自己的商业化道路。 微…

59、回溯-括号生成

思路&#xff1a; 括号是成对出现&#xff0c;首先左括号可以放n个&#xff0c;右括号也可以放n个。如果当前左括号放了3了&#xff0c;右括号放了4个&#xff0c;错了&#xff0c;如果左括号放了5个&#xff0c;右括号放了4个。可以&#xff0c;继续放右括号即可。所以可以设…

贪吃蛇项目实践!(上)

大家好&#xff0c;今天我带着大家从0构建起贪吃蛇项目的高楼大厦~ 要实现这个游戏&#xff0c;我们需要实现哪些功能呢&#xff1f; 实现基本的功能&#xff1a; • 贪吃蛇地图绘制 • 蛇吃⻝物的功能&#xff08;上、下、左、右⽅向键控制蛇的动作&#xff09; • 蛇撞墙死…

matlab保存示波器数据

再重新运行一下示波器 然后就可以在工作区看见&#xff08;这里没有运行所以没有&#xff09; 将保存到文件夹中方便后续绘图