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


相关文章
用MASM32按Time Protocol(RFC868)协议编写网络对时程序中的一些有用的函数代码
用MASM32按Time Protocol(RFC868)协议编写网络对时程序中的一些有用的函数代码
|
5天前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
16 5
|
7天前
|
Java API 开发者
探索Java中的Lambda表达式:简洁与强大的代码实践
本文深入探讨Java中Lambda表达式的定义、用法及优势,通过实例展示其如何简化代码、提升可读性,并强调在使用中需注意的兼容性和效率问题。Lambda作为Java 8的亮点功能,不仅优化了集合操作,还促进了函数式编程范式的应用,为开发者提供了更灵活的编码方式。
|
3天前
|
Java 开发者
探索Java中的Lambda表达式:简化你的代码之旅##
【8月更文挑战第62天】 Java 8的发布为开发者带来了诸多新特性,其中最引人注目的无疑是Lambda表达式。这一特性不仅让代码变得更加简洁,还极大地提升了开发的效率。本文将通过实际示例,展示如何利用Lambda表达式来优化我们的代码结构,同时探讨其背后的工作原理和性能考量。 ##
|
6天前
|
Java API 开发者
探索Java中的Lambda表达式:简化代码,提升效率
【9月更文挑战第27天】在Java 8中引入的Lambda表达式为编程带来了革命性的变化。通过简洁的语法和强大的功能,它不仅简化了代码编写过程,还显著提升了程序的执行效率。本文将深入探讨Lambda表达式的本质、用法和优势,并结合实例演示其在实际开发中的应用。无论你是Java新手还是资深开发者,都能从中获得启发,优化你的代码设计。
|
5天前
|
安全 C#
某网络硬盘网站被植入传播Trojan.DL.Inject.xz等的代码
某网络硬盘网站被植入传播Trojan.DL.Inject.xz等的代码
|
7天前
|
Java Linux Python
Linux环境下 代码java调用python出错
Linux环境下 代码java调用python出错
20 3
|
6天前
|
存储 Java 索引
使用java代码实现左右括号查找
使用java代码实现左右括号查找
完成切换网络+修改网络连接图标提示的代码框架
完成切换网络+修改网络连接图标提示的代码框架
|
5天前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
18 2
下一篇
无影云桌面