【Java】从Java代码到网络编程,三次握手又该如何理解

简介: 文章目录1 网络编程的相关概念1.1 网络、网络通信与IP地址1.2 IPv4与IPv61.3 域名和端口号2 网络协议2.1 网络通信协议2.2 TCP和UDP2.3 三次握手写在最后

1 网络编程的相关概念

1.1 网络、网络通信与IP地址

1️⃣ 网络通信


网络通信指的是两台设备之间通过网络实现数据传输,即,将数据通过网络从一台设备传输到另一台设备;

java.net 包下提供了一系列的接口和类,供程序员使用,用于完成网络通信。




2️⃣ 网络


什么是网络?

两台或者多台设备通过一定的物理设备连接起来构成了网络。 根据网络覆盖的范围大小不同,网络有如下分类:


局域网:覆盖范围最小,仅仅覆盖一个卧室一个机房等;

城域网:覆盖范围较大,可以覆盖一个城市;

广域网:覆盖范围最大,可以覆盖全国,甚至全球。代表就是万维网。

3️⃣ IP地址


概念:ip地址是用于唯一标识网络中的每台计算机/主机的序列;

查看ip地址:ipconfig

ip地址的表示:xx.xx.xx.xx 每个xx的范围(0-255);

ip地址的组成:网络地址+主机地址,例如:192.167.25.68;

1.2 IPv4与IPv6

什么是IPv6?

答:IPv6是互联网工程任务组设计的用于替代IPv4的下一代IP协议,其地址数量号称可以为全世界的每一粒沙子编上一个地址。由于IPv4最大的问题在于网络地址资源有限,严重限制了互联网的应用和发展。IPv6的使用,不仅能解决网络地址资源数量的问题,而且也解决了多种接入设备连接互联网的障碍。


IPv4与IPv6的区别

答:对于IPv4,ip地址是由4个字节表示的,每个字节8位,1个字节的范围为0-255(0到2的8次方-1);而IPv6则使用128位表示地址,占16字节,是IPv4地址的四倍!


🐱 IPv4地址的分类:



A 类地址: (0.0.0.0~127.255.255.255)

A 类地址第 1 字节为网络地址,其它 3 字节为主机地址。

A 类地址范围:1.0.0.1 ~ 126.255.255.254。

A 类地址中的私有地址:10.X.X.X(10.0.0.0 ~ 10.255.255.255)。

A 类地址中的保留地址:127.X.X.X,用作循环测试用的。

B 类地址: (128.0.0.0~191.255.255.255)

B 类地址第 1,2 字节为网络地址,其它 2 字节为主机地址。

B 类地址范围:128.0.0.1 ~ 191.255.255.254。

B 类地址中的私有地址:172.16.0.0 ~ 172.31.255.255。

B 类地址中的保留地址:169.254.X.X

C 类地址: (192.0.0.0~223.255.255.255)

C 类地址第 1,2,3 字节为网络地址,其它 1 字节为主机地址。

C 类地址范围:192.0.0.1 ~ 223.255.255.254。

C 类地址中的私有地址:192.168.X.X。

D 类地址: (224.0.0.0~239.255.255.255)

D 类地址不分网络地址和主机地址。

D 类地址范围:224.0.0.1 ~ 239.255.255.254。

E 类地址: (240.0.0.0~247.255.255.255)

E 类地址不分网络地址和主机地址。

E 类地址范围:240.0.0.1 ~ 255.255.254

————————————————

IPv4地址分类参考:IPV4地址划分

特别地,127.0.0.1 表示本机地址


1.3 域名和端口号

🐱 域名:


域名相对来说比较好记,将ip地址映射成了域名。例如:www.baidu.com。而这一映射关系则与HTTP协议有关,这里不再赘述,后续将会开始计算机网络专栏,供大家学习。


🐟 端口号:


端口号用于标识计算机某个特定的网络程序, 以整数的形式表示,范围:0~65535(两个字节表示端口)。其中,0 ~ 1024已经被占用了,例如:ssh 22、ftp 21、smtp 25、http 80。

常见的网络程序端口号:


tomcat:8080

mysql:3306

oracle:1521

sqlserver:1433

❓ 如何理解域名和端口


答:看示意图,百度主机的IP地址为:110.242.68.3,用户想要访问主机,则需要直到百度主机的IP地址,但是对于用户而言,这不容易记忆,于是,IP地址映射成了域名:www.baidu.com,用户可以通过域名来访问该主机。

可是,主机访问上了,而主机提供了多种服务,且其并不知道用户需要做什么。于是,有了端口号,根据不同的端口,可以标识不同的用户需要哪种服务。例如:IP + 端口25,则访问的是百度主机的邮件服务。




2 网络协议

2.1 网络通信协议

协议(Tcp/Ip)


TCP/IP是(Transmission Control Protocol/Internet Protocol)的简写,中文译名:传输控制协议/因特网互联协议,又叫网络通讯协议。 这个协议是Internet最基本的协议,Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的,数据进入协议栈时的封装过程示意图如下:



拿到用户数据后,首先经过应用层,增加Appl首部,知道是由哪个应用传输出来的。而后,经过传输层,进行TCP、IP首部的添加,最后经过以太网驱动后会将数据封装为一串序列。当需要查看该用户数据的时候,则相当于要逆向拆封,最终解释成用户数据。当然TCP/IP协议肯定没有这么简单,如果有需求,可以去查看TCP相关的书籍。


那么,网络协议该如何理解呢?

其实,协议就是数据在网络编程中的一种组织形式, 接收和回复数据都需要按照规定好的协议方式进行。

比如,人和人的交流:两个人见面打招呼,互相说“你好!”这样的行为,就是依靠语言完成的,我们可以简单理解为:语言其实本身也是一种协议,只有相同的语言,我们才能进行正常的交流。试想一下,我国的方言交流,和普通话与方言交流的场景… …



2.2 TCP和UDP

TCP协议:传输控制协议


使用TCP协议前,需要先建立TCP连接,形成传输数据通道;

传输前,采用“三次握手”方式,是可靠的;

TCP协议进行通信的两个应用进程:客户端、服务端;

在连接中可以进行 大数据量的传输;

传输完毕,需要释放已建立的连接,效率低。

UDP协议:用户数据协议


将数据、源、目的封装成数据包,不需要建立连接;

每个数据包的大小限制在64K内,不适合传输大量数据;

无需连接,所有是 不可靠的;

发送数据结束时无需释放资源,速度快;

🐰TCP与UDP的区别是什么?


答:TCP 数据传输就是两个人隔空对话,差了一点距离,所以需要对方反复确认听见了自己的话。可以理解成,TCP就像生活中的打电话,需要确认对方是否在听后,才能进行接下来的对话。而UDP更像是发短信,完全不需要确认对方是否阅读,是否把你拉黑,只需要管好自己是否成功发送短信。


2.3 三次握手

❓ TCP三次握手如何理解?


答:TCP 三次握手就好比两个人在街上隔着50米看见了对方,但是因为雾霾等原因不能100%确认,所以要通过招手的方式相互确定对方是否认识自己。

张三首先向李四招手(syn),李四看到张三向自己招手后,向对方点了点头挤出了一个微笑(ack)。张三看到李四微笑后确认了李四成功辨认出了自己(进入estalished状态)。

bdedd596b0e240d7891c90f1b64ff2f1.gif



但是李四还有点狐疑,向四周看了一看,有没有可能张三是在看别人呢,他也需要确认一下。


所以李四也向张三招了招手(syn),张三看到李四向自己招手后知道对方是在寻求自己的确认,于是也点了点头挤出了微笑(ack),李四看到对方的微笑后确认了张三就是在向自己打招呼(进入established状态)。


于是两人加快步伐,走到了一起,相互拥抱。

9077a205fcee4cdaac7d328a0a0d89fa.gif



张三喊了一句话(data),李四听见了之后要向张三回复自己听见了(ack)。

如果张三喊了一句,半天没听到李四回复,张三就认为自己的话被大风吹走了,李四没听见,所以需要重新喊话,这就是tcp重传。


也有可能是李四听到了张三的话,但是李四向张三的回复被大风吹走了,以至于张三没听见李四的回复。


张三并不能判断究竟是自己的话被大风吹走了还是李四的回复被大风吹走了,张三也不用管,重传一下就是。


既然会重传,李四就有可能同一句话听见了两次,这就是「去重」。「重传」和「去重」工作操作系统的网络内核模块都已经帮我们处理好了,用户层是不用关心的。


三次握手参考文章及动图出处:跟着动画学习 TCP 三次握手和四次挥手


相关文章
|
1月前
|
JavaScript NoSQL Java
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
186 96
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
|
3天前
|
消息中间件 Java 应用服务中间件
JVM实战—1.Java代码的运行原理
本文介绍了Java代码的运行机制、JVM类加载机制、JVM内存区域及其作用、垃圾回收机制,并汇总了一些常见问题。
JVM实战—1.Java代码的运行原理
|
7天前
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
58 23
|
11天前
|
传感器 监控 Java
Java代码结构解析:类、方法、主函数(1分钟解剖室)
### Java代码结构简介 掌握Java代码结构如同拥有程序世界的建筑蓝图,类、方法和主函数构成“黄金三角”。类是独立的容器,承载成员变量和方法;方法实现特定功能,参数控制输入环境;主函数是程序入口。常见错误包括类名与文件名不匹配、忘记static修饰符和花括号未闭合。通过实战案例学习电商系统、游戏角色控制和物联网设备监控,理解类的作用、方法类型和主函数任务,避免典型错误,逐步提升编程能力。 **脑图速记法**:类如太空站,方法即舱段;main是发射台,static不能换;文件名对仗,括号要成双;参数是坐标,void不返航。
34 5
|
1月前
|
安全 网络协议 Java
Java网络编程封装
Java网络编程封装原理旨在隐藏底层通信细节,提供简洁、安全的高层接口。通过简化开发、提高安全性和增强可维护性,封装使开发者能更高效地进行网络应用开发。常见的封装层次包括套接字层(如Socket和ServerSocket类),以及更高层次的HTTP请求封装(如RestTemplate)。示例代码展示了如何使用RestTemplate简化HTTP请求的发送与处理,确保代码清晰易维护。
|
24天前
|
缓存 网络协议 Java
JAVA网络IO之NIO/BIO
本文介绍了Java网络编程的基础与历史演进,重点阐述了IO和Socket的概念。Java的IO分为设备和接口两部分,通过流、字节、字符等方式实现与外部的交互。
|
2月前
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
459 11
|
2月前
|
JSON Java 数据挖掘
利用 Java 代码获取淘宝关键字 API 接口
在数字化商业时代,精准把握市场动态与消费者需求是企业成功的关键。淘宝作为中国最大的电商平台之一,其海量数据中蕴含丰富的商业洞察。本文介绍如何通过Java代码高效、合规地获取淘宝关键字API接口数据,帮助商家优化产品布局、制定营销策略。主要内容包括: 1. **淘宝关键字API的价值**:洞察用户需求、优化产品标题与详情、制定营销策略。 2. **获取API接口的步骤**:注册账号、申请权限、搭建Java开发环境、编写调用代码、解析响应数据。 3. **注意事项**:遵守法律法规与平台规则,处理API调用限制。 通过这些步骤,商家可以在激烈的市场竞争中脱颖而出。
|
18天前
|
存储 监控 Java
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
143 60
【Java并发】【线程池】带你从0-1入门线程池
|
13天前
|
Java 调度
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
当我们创建一个`ThreadPoolExecutor`的时候,你是否会好奇🤔,它到底发生了什么?比如:我传的拒绝策略、线程工厂是啥时候被使用的? 核心线程数是个啥?最大线程数和它又有什么关系?线程池,它是怎么调度,我们传入的线程?...不要着急,小手手点上关注、点赞、收藏。主播马上从源码的角度带你们探索神秘线程池的世界...
82 0
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码