【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 三次握手和四次挥手


相关实践学习
基于函数计算快速搭建Hexo博客系统
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
相关文章
|
4天前
|
机器学习/深度学习 自然语言处理 数据可视化
数据代码分享|PYTHON用NLP自然语言处理LSTM神经网络TWITTER推特灾难文本数据、词云可视化
数据代码分享|PYTHON用NLP自然语言处理LSTM神经网络TWITTER推特灾难文本数据、词云可视化
18 1
|
2天前
|
数据可视化 算法 数据挖掘
R语言SIR模型网络结构扩散过程模拟SIR模型(Susceptible Infected Recovered )代码实例
R语言SIR模型网络结构扩散过程模拟SIR模型(Susceptible Infected Recovered )代码实例
10 0
|
4天前
|
网络协议 Java 网络架构
Java基础教程(18)-Java中的网络编程
【4月更文挑战第18天】Java网络编程简化了底层协议处理,利用Java标准库接口进行TCP/IP通信。TCP协议提供可靠传输,常用于HTTP、SMTP等协议;UDP协议则更高效但不保证可靠性。在TCP编程中,ServerSocket用于监听客户端连接,Socket实现双进程间通信。UDP编程中,DatagramSocket处理无连接的数据报文。HTTP编程可以通过HttpURLConnection发送请求并接收响应。
|
4天前
|
机器学习/深度学习 PyTorch TensorFlow
TensorFlow、Keras 和 Python 构建神经网络分析鸢尾花iris数据集|代码数据分享
TensorFlow、Keras 和 Python 构建神经网络分析鸢尾花iris数据集|代码数据分享
15 0
|
5天前
|
传感器 存储 监控
编写Arduino代码:构建物联网设备,实现上网行为管理软件对网络的实时监控
使用Arduino和ESP8266/ESP32等Wi-Fi模块,结合传感器监控网络活动,本文展示了如何编写代码实现实时监控并自动将数据提交至网站。示例代码展示如何连接Wi-Fi并检测网络状态,当连接成功时,通过HTTP POST请求将“Network activity detected.”发送到服务器。通过调整POST请求的目标URL和数据,可将监控数据上传至所需网站进行处理和存储。
28 0
|
5天前
|
SQL Java 数据库
java代码中调用dao层查询接口,代码没有返回数据,打印出的sql查出了数据
java代码中调用dao层查询接口,代码没有返回数据,打印出的sql查出了数据
11 1
|
5天前
|
安全 Java 开发者
Java编程:深入探索其原理、特性与实战代码
Java编程:深入探索其原理、特性与实战代码
10 1
|
6天前
|
存储 算法 Java
滚雪球学Java(20):Java泛型与枚举:提升代码灵活性与可读性
【4月更文挑战第9天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
20 1
滚雪球学Java(20):Java泛型与枚举:提升代码灵活性与可读性
|
9天前
|
Java 测试技术 持续交付
云效产品使用常见问题之通过流水线构建的java代码,在docker文件里拿到失败如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
11天前
|
监控 Java 开发者
深入理解 Java 网络编程和 NIO
【4月更文挑战第19天】Java网络编程基于Socket,但NIO(非阻塞I/O)提升了效率和性能。NIO特点是非阻塞模式、选择器机制和缓冲区,适合高并发场景。使用NIO涉及通道、选择器和事件处理,优点是高并发、资源利用率和可扩展性,但复杂度、错误处理和性能调优是挑战。开发者应根据需求选择是否使用NIO,并深入理解其原理。