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

news2024/10/7 20:36:29

目录

    • 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:1234
	position: "10080"
}

响应:
[
    {
		name:魏家凉皮
		image:1.jpg
		distance:"1km
		rate:96%
		star:4.7
    },
    {
		name:杨国福琳辣烫
		image:2.jpg,
		distance:1km
		rate: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.coloradmin.cn/o/1624692.html

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

相关文章

物联网:从电信物联开发平台AIoT获取物联设备上报数据示例

设备接入到电信AIoT物联平台后&#xff0c;可以在平台上查询到设备上报的数据。 下面就以接入的NBIOT物联远传水表为例。 在产品中选择指定设备&#xff0c;在数据查看中可以看到此设备上报的数据。 示例中这组数据是base64位加密的&#xff0c;获取后还需要转换解密。 而我…

[iOS]CocoaPods安装和使用

1.了解brew、rvm、ruby、gem、cocaspods之间的关系 在 macOS 环境中&#xff0c;Brew、RVM、Ruby、Gem 和 CocoaPods 之间存在以下关系&#xff1a; Homebrew (Brew)&#xff1a;Homebrew 是 macOS 上的包管理器&#xff0c;用于安装和管理各种开源软件包。它使您能够轻松地从…

ARK Invest:比特币,一种被低估且独特的避险资产

由于 2008 年全球金融危机&#xff0c;人们对政府和金融机构的信任度下降。此后&#xff0c;欧洲主权债务危机、美联储对 COVID19 的应对措施以及美国主要地区性银行的倒闭等事件暴露了依赖中心化机构的弊端。 随着技术创新的加速影响&#xff0c;信任度的下降使人们开始质疑传…

【C++】双指针算法:和为s的两个数字

1.题目 虽然在牛客上是个中等题&#xff0c;但我感觉是比较简单的。大家在看完这篇文章后可以看看我的上一篇文章&#xff1a;有效三角形的个数。本文章的题目的解法只是有效三角形的个数这道题目的一个环节。看懂这篇文章后可以更好的解决有效三角形个数那道题目&#xff01; …

AI 重写人类DNA,开源基因编辑器问世;安卓版Gemini新增多项功能

&#x1f989; AI新闻 &#x1f680; AI 重写人类DNA&#xff0c;开源基因编辑器问世 摘要&#xff1a;初创公司 Profluent 最新宣布&#xff0c;开发出世界首个完全由 AI 设计的基因编辑器&#xff0c;并成功应用于人类细胞 DNA&#xff0c;这一技术可谓是分子生物学的一大突…

Oracle之RMAN联机和脱机备份(二)

rman脱机备份,首先使用rman登入数据库服务器,然后关闭数据库后,启动数据库到mount状态,在执行backup database指定备份整个数据库。 1、启动mount归档模式 sys@ORCL>archive log list; Database log mode Archive Mode Automatic archival Enabl…

文本向量化模型新突破——acge_text_embedding勇夺C-MTEB榜首

在人工智能的浪潮中&#xff0c;以GPT4、Claude3、Llama 3等大型语言模型&#xff08;LLM&#xff09;无疑是最引人注目的潮头。这些模型通过在海量数据上的预训练&#xff0c;学习到了丰富的语言知识和模式&#xff0c;展现了出惊人的能力。在支撑这些大型语言模型应用落地方面…

网络爬虫之爬虫原理

** 爬虫概述 Python网络爬虫是利用Python编程语言编写的程序&#xff0c;通过互联网爬取特定网站的信息&#xff0c;并将其保存到本地计算机或数据库中。 """ 批量爬取各城市房价走势涨幅top10和跌幅top10 """ ​ from lxml import etree impor…

Oceanbase体验之(一)运维管理工具OCP部署(社区版4.2.2)

资源规划建议 ocp主机1台 内存:64G CPU1:2C及以上 硬盘大于500G observer服务器3台 内存32G CPU&#xff1a;4C以上 硬盘大于1T 建议存储硬盘与操作系统硬盘隔开实现IO隔离 一、OBD、OCP安装包准备 [rootobserver /]# chown -R admin:admin /software/ [rootobserver /]# …

云LIS系统概述JavaScript+前端框架JQuery+EasyUI+Bootstrap医院云HIS系统源码 开箱即用

云LIS系统概述JavaScript前端框架JQueryEasyUIBootstrap医院云HIS系统源码 开箱即用 云LIS&#xff08;云实验室信息管理系统&#xff09;是一种结合了计算机网络化信息系统的技术&#xff0c;它无缝嵌入到云HIS&#xff08;医院信息系统&#xff09;中&#xff0c;用于连…

30 OpenCV 点多边形测试

文章目录 点多边形测试pointPolygonTest示例 点多边形测试 pointPolygonTest pointPolygonTest( InputArray contour,// 输入的轮廓 Point2f pt, // 测试点 bool measureDist // 是否返回距离值&#xff0c;如果是false&#xff0c;1表示在内面&#xff0c;0表示在边界上&a…

汽车信息安全--如何理解TrustZone(2)

目录 1.概述 2 如何切换安全状态 3 TrustZone里实现了什么功能&#xff1f; 4. 与HSM的比较 1.概述 汽车信息安全--如何理解TrustZone(1)-CSDN博客讲解了什么是Trustzone&#xff0c;下面我们继续讲解与HSM的区别。 2 如何切换安全状态 在引入安全扩展后&#xff0c;Arm…

【canvas】前端创造的图片粒子动画效果:HTML5 Canvas 技术详解

前端创造的图片粒子动画效果&#xff1a;HTML5 Canvas 技术详解 我们将深入探讨如何通过 HTML5 的 Canvas 功能&#xff0c;将上传的图片转换成引人入胜的粒子动画效果。这种效果将图片分解成小粒子&#xff0c;并在用户与它们交互时产生动态变化。我们将分步骤详细解析代码&a…

vue快速入门(四十三)axios模块的安装与引入

步骤很详细&#xff0c;直接上教程 上一篇 在项目目录打开终端 输入以下命令安装axios npm i axios重新打开项目即可完成按照 测试 源码 main.js import Vue from vue import App from ./App.vue//全局引入axios // 引入axios import axios from axios; // 挂载到vue原型…

HarmonyOS har制作与引用

1. HarmonyOS har制作与引用 1.1 介绍 HAR&#xff08;Harmony Archive&#xff09;是静态共享包&#xff0c;可以包含代码、C库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP&#xff0c;不能独立安装运行在设备上&#…

Linux 进程概念和状态

目录 一、冯诺依曼体系结构 二、操作系统 1.概念 2.理解操作系统的管理 硬件和管理 为什么要有操作系统 三、进程的概念 PCB&#xff1a; 进程的删除和子进程的创建 删除 创建子进程 四、进程的状态 七种状态&#xff1a; 实验查看部分状态&#xff1a; R&#x…

2.7设计模式——Proxy 代理模式(结构型)

意图 为其它对象提供一种代理以控制这个对象的访问。 结构 Proxy保存一个引用使得代理可以访问实体&#xff1b;提供一个与Subject的接口相同的接口&#xff0c;使代理可以用来替代实体&#xff1b;控制实体的存取&#xff0c;并可能负责创建和删除它&#xff1b;其他功能依赖…

【【gitlab解决git Clone 出现 Permission denied, please try again.】】

【gitlab解决git Clone 出现 Permission denied, please try again.】 问题解决随便找一个地方 点击右键输入ssh -keygen -C "邮件"显示结果输入 登录gitlab然后再次git Clone就可以了。 问题 git clone的时候出现 Permission denied, please try again 解决 随便…

ChatGPT付费创作系统V2.8.4独立版 WEB+H5+小程序端 (新增Pika视频+短信宝+DALL-E-3+Midjourney接口)

小狐狸GPT付费体验系统最新版系统是一款基于ThinkPHP框架开发的AI问答小程序&#xff0c;是基于国外很火的ChatGPT进行开发的Ai智能问答小程序。当前全民热议ChatGPT&#xff0c;流量超级大&#xff0c;引流不要太简单&#xff01;一键下单即可拥有自己的GPT&#xff01;无限多…

【draw.io的使用心得介绍】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…