【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: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.mfbz.cn/a/574446.html

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

相关文章

从0开始用C写贪吃蛇(基于链表)

目录 1. 游戏背景 2. 游戏效果演示​编辑​编辑​编辑 3. 实现目标 4. 技术要点 5. 控制台程序 5.1 设置控制台窗口的长宽和名字 5.2 控制台屏幕上的坐标COORD 6.Win32 API 6.1 GetStdHandle 6.2 GetConsoleCursorInfo 6.3 CONSOLE_CURSOR_INFO 6.4 SetConsole…

CSS 之 transition过渡动画

一、简介 ​ CSS 制作 Web 动画有两种方式&#xff1a; 帧动画&#xff08;Keyframe Animation&#xff09;和过渡动画&#xff08;Transition Animation&#xff09;。针对不同的业务场景中&#xff0c;我们应该选择不同的动画方式&#xff0c;通常来说&#xff1a;对于交互元…

iOS runtime

—参考文章— 暂时没有 一、如何在Xcode中使用runtime Xcode默认是不建议开发者使用runtime的&#xff0c;所以在Xcode直接使用runtime的语法是会报错误的。 如果要在Xcode中使用runtime的语法&#xff0c;是需要配置一下才可以使用&#xff0c;配置方法如下图&#xff1a; 首…

开源向量数据库比较:Chroma, Milvus, Faiss,Weaviate

语义搜索和检索增强生成(RAG)正在彻底改变我们的在线交互方式。实现这些突破性进展的支柱就是向量数据库。选择正确的向量数据库能是一项艰巨的任务。本文为你提供四个重要的开源向量数据库之间的全面比较&#xff0c;希望你能够选择出最符合自己特定需求的数据库。 什么是向量…

Microsoft Edge浏览器:高效、简洁、个性化的网页浏览体验

Microsoft Edge是微软公司推出的一款网络浏览器&#xff0c;它是基于Chromium开源项目开发的&#xff0c;因此与Google Chrome有很多相似之处。以下是一些使用Microsoft Edge的心得体会&#xff1a; 1. 界面简洁&#xff1a;Microsoft Edge的界面设计非常简洁&#xff0c;用户…

Spring Boot集成RabbitMQ快速入门Demo

1.什么是RabbitMQ&#xff1f; RabbitMQ是一款使用Erlang语言开发的&#xff0c;基于AMQP协议的消息中间件&#xff0c;作为一款优秀的消息系统&#xff0c;RabbitMQ有高并发、可扩展等优势&#xff0c;并适用于大型系统中各个模块之间的通信。 RabbitMQ的特点为&#xff1a; 持…

微信小程序按钮点击时的样式hover-class=“hover“

小程序的button组件很好用&#xff0c;按钮点击的时候会显示点击状态&#xff0c;默认的就是颜色加深 但是我们改变了button的背景色之后&#xff0c;就看不出点击效果了&#xff0c;解决起来也很简单 关键代码就是小程序的 hover-class 属性&#xff0c;需要注意的是&#xff…

Mysql(数据库)知识详解【6】~{锁,架构}

数据库锁和架构是两个不同的概念&#xff0c;但它们都与数据库管理系统&#xff08;DBMS&#xff09;的性能和并发控制有关。 数据库锁&#xff1a; 数据库锁是一种同步机制&#xff0c;用于控制多个事务对共享资源的访问。锁可以确保数据的一致性和完整性&#xff0c;防止多个…

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

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

【stomp 实战】spring websocket源码分析之握手请求的处理

上一节【搭建一套websocket推送平台】我们通过一个项目&#xff0c;实现了一套推送平台。由于spring框架对于websocket的支持和stomp协议的良好封装&#xff0c;我们很容易地就实现了websocket的消息推送功能。虽然搭建这么一套推送系统不难&#xff0c;但是如果不了解其底层原…

Linux中手工创建一个用户

当我们需要新创建一个用户时&#xff0c;有两种方法 1.使用命令添加用户 2.去配置文件里面添加用户 1&#xff0c;使用useradd命令&#xff1a; [rootlocalhost /]# useradd tmg 然后给它设置一个密码 [rootlocalhost etc]# passwd tmg Changing password for user tmg. N…

linux 系统文件目录颜色及特殊权限对应的颜色

什么决定文件目录的颜色和背景&#xff1f; 颜色 说明 栗子 权限白色表示普通文件 蓝色表示目录 绿色表示可执行文件 浅蓝色链接文件 黄色表示设备文件 红色 表示压缩文件 红色闪烁表示链接的文件有问题 灰色 表示其它文件 可以用字符表示文件的类型&am…

新风口下的必应bing国内广告投放该怎么做?

必应Bing作为全球搜索引擎市场的重要参与者&#xff0c;正逐渐显现出其在国内市场的独特价值和潜力。随着互联网生态的多元化发展&#xff0c;必应Bing凭借其高质量用户群和精准投放能力&#xff0c;成为了企业寻求新增长点的新风口。 一、洞察先机&#xff0c;精准定位市场 …

【Flink入门修炼】2-3 Flink Checkpoint 原理机制

如果让你来做一个有状态流式应用的故障恢复&#xff0c;你会如何来做呢&#xff1f; 单机和多机会遇到什么不同的问题&#xff1f; Flink Checkpoint 是做什么用的&#xff1f;原理是什么&#xff1f; 一、什么是 Checkpoint&#xff1f; Checkpoint 是对当前运行状态的完整记…

YOLOv8+PyQt5输电线路缺陷检测(目前最全面的类别检测,可以从图像、视频和摄像头三种路径检测)

1.效果视频&#xff1a;YOLOv8PyQt5输电线路缺陷检测&#xff08;目前最全面的类别检测&#xff0c;可以从图像、视频和摄像头三种路径检测&#xff09;_哔哩哔哩_bilibili 资源包含可视化的输电线路缺陷检测系统&#xff0c;可识别图片和视频当中出现的五类常见的输电线路缺陷…

web前端学习笔记2

2. 网页穿上美丽外衣 2.1 什么是CSS CSS (Cascading Style Sheets,层叠样式表),是一种用来为结构化文档(如 HTML 文档或 XML 应用)添加样式(字体、间距和颜色等)的计算机语言,CSS 文件扩展名为 .css。 CSS样式包括对字体、颜色、边距、高度、宽度、背景图片、网页定位…

4.8 Python dict字典

Python dict字典详解 Python字典&#xff08;dict&#xff09;是一种无序的、可变的序列&#xff0c;它的元素以“键值对&#xff08;key-value&#xff09;”的形式存储。相对地&#xff0c;列表&#xff08;list&#xff09;和元组&#xff08;tuple&#xff09;都是有序的序…

Python中ArcPy按照分幅条带与成像日期拼接每个8天间隔内的遥感影像

本文介绍基于Python中的ArcPy模块&#xff0c;将大量遥感影像文件按照分幅条带编号与成像时间加以分组&#xff0c;并将同一分幅的遥感影像加以每个8天时间间隔内的镶嵌拼接的方法。 首先&#xff0c;来看一下本文具体的需求。我们现有一个文件夹&#xff0c;其中含有大量的.ti…

配置有效的防爬虫技术保护网站

本文主要介绍了防爬虫的概念、目的以及一些有效的防爬虫手段。防爬虫是指网站采取各种技术手段阻止爬虫程序对其数据进行抓取的过程。为了保护网站的数据和内容的安全性&#xff0c;防止经济损失和恶意竞争&#xff0c;以及减轻服务器负载&#xff0c;网站需要采取防爬虫机制。…

NIKKE胜利女神妮姬1.5周年(PC)怎么注册?账号注册教程一看就懂

游戏的世界观了一些轻科幻、末世和废土背景&#xff0c;剧情中也探讨了一些深刻的主题&#xff0c;比如NIKKE的人权问题。虽然整体剧情表现得连贯&#xff0c;但本质上有一些俗套情节&#xff0c;特别是在序章的玛丽安之死后&#xff0c;剧情逐渐失去了原有的紧张感&#xff0c…
最新文章