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

本文涉及的产品
.cn 域名,1个 12个月
简介: 文章目录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 三次握手和四次挥手


相关文章
|
15天前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
43 24
|
11天前
|
Java 编译器 数据库
Java 中的注解(Annotations):代码中的 “元数据” 魔法
Java注解是代码中的“元数据”标签,不直接参与业务逻辑,但在编译或运行时提供重要信息。本文介绍了注解的基础语法、内置注解的应用场景,以及如何自定义注解和结合AOP技术实现方法执行日志记录,展示了注解在提升代码质量、简化开发流程和增强程序功能方面的强大作用。
41 5
|
11天前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
39 5
|
13天前
|
Java API 开发者
Java中的Lambda表达式:简洁代码的利器####
本文探讨了Java中Lambda表达式的概念、用途及其在简化代码和提高开发效率方面的显著作用。通过具体实例,展示了Lambda表达式如何在Java 8及更高版本中替代传统的匿名内部类,使代码更加简洁易读。文章还简要介绍了Lambda表达式的语法和常见用法,帮助开发者更好地理解和应用这一强大的工具。 ####
|
17天前
|
Java API Maven
商汤人像如何对接?Java代码如何写?
商汤人像如何对接?Java代码如何写?
29 5
|
10天前
|
安全 Java API
Java中的Lambda表达式:简化代码的现代魔法
在Java 8的发布中,Lambda表达式的引入无疑是一场编程范式的革命。它不仅让代码变得更加简洁,还使得函数式编程在Java中成为可能。本文将深入探讨Lambda表达式如何改变我们编写和维护Java代码的方式,以及它是如何提升我们编码效率的。
|
15天前
|
Java
Java将OffsetDateTime格式化为 yyyy-MM-dd HH:mm:ss 如何写代码?
Java将OffsetDateTime格式化为 yyyy-MM-dd HH:mm:ss 如何写代码?
24 0
|
5月前
|
安全 Java Linux
(七)Java网络编程-IO模型篇之从BIO、NIO、AIO到内核select、epoll剖析!
IO(Input/Output)方面的基本知识,相信大家都不陌生,毕竟这也是在学习编程基础时就已经接触过的内容,但最初的IO教学大多数是停留在最基本的BIO,而并未对于NIO、AIO、多路复用等的高级内容进行详细讲述,但这些却是大部分高性能技术的底层核心,因此本文则准备围绕着IO知识进行展开。
179 1
|
5月前
|
Java 大数据
如何在Java中进行网络编程:Socket与NIO
如何在Java中进行网络编程:Socket与NIO
|
7月前
|
监控 Java 开发者
深入理解 Java 网络编程和 NIO
【4月更文挑战第19天】Java网络编程基于Socket,但NIO(非阻塞I/O)提升了效率和性能。NIO特点是非阻塞模式、选择器机制和缓冲区,适合高并发场景。使用NIO涉及通道、选择器和事件处理,优点是高并发、资源利用率和可扩展性,但复杂度、错误处理和性能调优是挑战。开发者应根据需求选择是否使用NIO,并深入理解其原理。
76 1