当前位置: 首页 > article >正文

Socket篇(学习前言)

目录

一、计算机网络

二、网络编程

三、网络编程三要素

1. IP地址

1.1. 简介

1.2. IP地址分为两大类

IPv4

IPv6

1.3. IP地址形式

1.4. DOS常用命令

1.5. 特殊IP地址

2. 端口

2.1. 简介

2.2. 端口号

2.3. 端口类型

周知端口

注册端口

动态端口

3. 协议

3.1. 简介

3.2. 网络通信协议有两套参考模型

OSI参考模型

TCP/IP参考模型

两种参考模型对比

3.3. 传输层中的2个常见协议

协议一:UDP协议

简介

特点

应用场景

协议二:TCP协议

简介

特点

TCP三次握手确立连接

TCP四次挥手断开连接

应用场景

四、InetAddress

1. 简介

2. 常用方法

3. 代码示例

InetAddressDemo01

InetAddressDemo

五、URL

1. 简介

2. API

3. 示例代码

六、TCP/UDP的简介与区别

1. 简介

2. TCP、UDP区别

2.1. 连接

2.2. 安全

2.3. 传输效率

2.4. 连接数量

2.5. 首部

2.6. 可靠

2.7. 面向方式

3. TCP的三次握手与四次挥手

3.1. TCP的三次握手

3.2. TCP的四次挥手

3.3. 为什么握手要三次、挥手要四次?

4. TCP和UDP的使用场景

4.1. TCP的使用场景

4.2. UDP的使用场景

4.3. TCP维护可靠的通信方式


一、计算机网络

计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,

在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统

二、网络编程

在网络通信协议下,不同计算机上运行的程序,可以进行数据传输。

三、网络编程三要素

1. IP地址

1.1. 简介

要想让网络中的计算机能够互相通信,必须为每台计算机指定一个标识号,通过这个标识号来指定要接收数据的计

算机和识别发送的计算机,而IP地址就是这个标识号,也就是设备的标识。

1.2. IP地址分为两大类

IPv4

IPv4是给每个连接在网络上的主机分配一个32bit地址。

按照TCP/IP规定,IP地址用二进制来表示,每个IP地址长32bit,也就是4个字节。

例如:

一个采用二进制形式的IP地址是“11000000 10101000 00000001 01000010”,这么长的地址,处理起来非常

费劲。

为了方便使用,IP地址经常被写成十进制的形式,中间使用符号“.”分隔不同的字节。

于是,上面的IP地址可以表示为“192.168.1.66”。

IPv4地址的这种表示法叫做“点分十进制表示法”

IPv6

由于互联网的蓬勃发展,IP地址的需求量愈来愈大,但是网络地址资源有限,使得IP的分配越发紧张。

为了扩大地址空间,通过IPv6重新定义地址空间,采用128位地址长度,每16个字节一组,分成8组十六进制数,

这样就解决了网络地址资源数量不够的问题,每个整数用四个十六进制位表示, 数之间用冒号( :)分开,

IPv6的这种表示法叫作“冒分十六进制表示法”

1.3. IP地址形式

IP地址形式可分为 公网地址、私有地址(局域网使用)

例如:

我们经常看到的 192.168. 开头的就是常见的局域网地址,范围为 192.168.0.0--192.168.255.255,专门为组织

机构内部使用

1.4. DOS常用命令

ipconfig:查看本机IP地址

ping IP地址:检查网络是否连通

1.5. 特殊IP地址

127.0.0.1:是回送地址,可以代表本机地址,一般用来测试使用

2. 端口

2.1. 简介

就是设备上应用程序的唯一标识,标识正在计算机设备上运行的进程(程序)!

2.2. 端口号

就是用两个字节表示的整数,它的取值范围是0~65535,其实就是端口,是端口的 id 值!

其中:

0~1023之间的端口号用于一些知名的网络服务和应用,

普通的应用程序需要使用1024以上的端口号

一个设备中,不能出现2个应用程序的端口号一样,如果一样会出现端口冲突错误!

2.3. 端口类型

周知端口

周知端口:0~1023,被预先定义的知名应用占用(如:HTTP占用 80,FTP占用21)

注册端口

注册端口:1024~49151,分配给用户进程或某些应用程序(如:Tomcat占 用8080,MySQL占用3306)

动态端口

动态端口:49152到65535,之所以称为动态端口,是因为它 一般不固定分配某种进程,而是动态分配

3. 协议

3.1. 简介

计算机网络中,连接和通信的规则被称为网络通信协议

3.2. 网络通信协议有两套参考模型

OSI参考模型

OSI参考模型:世界互联协议标准,全球通信规范,由于此模型过于理想化,未能在因特网上进行广泛推广

TCP/IP参考模型

TCP/IP参考模型(或TCP/IP协议):事实上的国际标准

两种参考模型对比

3.3. 传输层中的2个常见协议

协议一:UDP协议
简介

UDP(User Datagram Protocol):用户数据报协议

特点
  1. UDP是无连接的、不可靠的通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说:当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据
  2. 每个数据包的大小限制在64KB内 ,由于使用UDP协议消耗系统资源小,通信效率高<所以通常都会用于音频、视频和普通数据的传输。例如:视频会议通常采用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。但是在使用UDP协议传送数据时,由于UDP协议的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议.

3. 可以广播发送 ,发送数据结束时无需释放资源,开销小,速度快

应用场景

语音通话,视频会话等

协议二:TCP协议
简介

TCP(Transmission Control Protocol) :传输控制协议

特点
  1. TCP协议是面向连接的、可靠的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数

据,它提供了两台计算机之间可靠无差错的数据传输。在TCP连接中必须要明确客户端与服务器端,由客户端

向服务端发出连接请求,每次连接的创建都需要经过“三次握手”正因为采用TCP协议,传输数据前会采用

“三次握手”方式建立连接,点对点通信,所以TCP协议是可靠的通信协议

    • 三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠
      • 第一次握手,客户端向服务器端发出连接请求,等待服务器确认
      • 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求
      • 第三次握手,客户端再次向服务器端发送确认信息,确认连接
    • 完成三次握手,连接建立后,客户端和服务器就可以开始进行数据传输了由于这种面向连接的特性,TCP协议可以保证传输数据的安全,所以应用十分广泛。例如:上传文件、下载文件、浏览网页等
  1. 还有在TCP协议下进行网络通信,在连接中可进行大数据量的传输,同时,连接、发送数据都需要确认,且传

输完毕后,还需释放已建立的连接,通信效率相对 UDP协议 较低

TCP三次握手确立连接

TCP四次挥手断开连接

应用场景

正因为TCP协议具有三次握手、四次挥手特点,一般应用于对信息安全要求较高的场景,

例如:文件下载、金融等数据通信

四、InetAddress

1. 简介

Java提供InetAddress类来封装IP地址或域或名。

InetAddress类有两个子类:Inet4Address和Inet6Address,分别用于封装4个字节的IP地址和6个字节的IP地址。

InetAddress内部对地址数字进行隐藏,用户不需要了解实现地址的细节,只需了解如何调用相应的方法即可。

InetAddress类无构造方法,因此不能直接创建其对象,而是通过该类的静态方法创建一个InetAddress对象或InetAddress数组。

2. 常用方法

方法

功能描述

public static InetAddress getLocalHost()

获取本机对应的InetAddress对象

public static InetAddress getByName(String host)

根据主机获得对应的InetAddress对象,参数host可以是IP地址或域名

public static InetAddress[] getAllByName(String host)

根据主机获得对应的InetAddress对象

public static InetAddress getByAddress(byte[] addr)

获取addr所封装的IP地址对应的Inet Address对象

public String getCanonicalHostName()

获取此IP地址的全限定域名

public bytes[] getHostAddress()

获取该InetAddress对象对应的IP地址字符串

public String getHostName()

获得该InetAddress对象的主机名称

public boolean isReachable(int timeout)

判断是否可以到达该地址

3. 代码示例

InetAddressDemo01

/**
    目标:InetAddress类概述(了解)
         一个该类的对象就代表一个IP地址对象。

    InetAddress类成员方法:
         static InetAddress getLocalHost()
            * 获得本地主机IP地址对象。
         static InetAddress getByName(String host)
            * 根据IP地址字符串或主机名获得对应的IP地址对象。
         String getHostName()
            * 获得主机名。
         String getHostAddress()
            * 获得IP地址字符串。
 */
public class InetAddressDemo01 {
    public static void main(String[] args) throws Exception {
        // 1.获取本机地址对象。
        InetAddress ip1 = InetAddress.getLocalHost();
        System.out.println(ip1.getHostName());
        System.out.println(ip1.getHostAddress());

        // 2.获取域名ip对象
        InetAddress ip2 = InetAddress.getByName("www.baidu.com");
        System.out.println(ip2.getHostName());
        System.out.println(ip2.getHostAddress());

        // 3.获取公网IP对象。
        InetAddress ip3 = InetAddress.getByName("112.80.248.76");
        System.out.println(ip3.getHostName());
        System.out.println(ip3.getHostAddress());

        // 4.判断是否能通: ping  5s之前测试是否可通
        System.out.println(ip3.isReachable(5000));
    }
}

结果如下:

WIN-C9R1GLESKTK
192.168.136.1
www.baidu.com
120.232.145.185
112.80.248.76
112.80.248.76
true

InetAddressDemo

public class InetAddressDemo2 {
    public static void main(String[] args) {
        try {
            //获取本机地址信息
            InetAddress localIp = InetAddress.getLocalHost();
            System.out.println("localIp.getCanonicalHostName()="
                    + localIp.getCanonicalHostName());
            System.out.println("localIp.getHostAddress()="
                    + localIp.getHostAddress());
            System.out.println("localIp.getHostName()="
                    + localIp.getHostName());
            System.out.println("localIp.toString()=" + localIp.toString());
            System.out.println("localIp.isReachable(5000)="
                    + localIp.isReachable(5000));
            System.out.println("====================================");//获取指定域名地址信息
            InetAddress baiduIp = InetAddress.getByName("www.baidu.com");
            System.out.println("baiduIp.getCanonicalHostName()="
                    + baiduIp.getCanonicalHostName());
            System.out.println("baiduIp.getHostAddress()="
                    + baiduIp.getHostAddress());
            System.out.println("baiduIp.getHostName()="
                    + baiduIp.getHostName());
            System.out.println("baiduIp.toString()=" + baiduIp.toString());
            System.out.println("baiduIp.isReachable(5000)="
                    + baiduIp.isReachable(5000));
            System.out.println("====================================");
            //获取指定原始IP地址信息
            InetAddress ip = InetAddress.getByAddress(new byte[]{127, 0, 0, 1});
            // InetAddress ip = InetAddress.getByName("127.0.0.1");
            System.out.println("ip.getCanonicalHostName()="
                    + ip.getCanonicalHostName());
            System.out.println("ip.getHostAddress()= " + ip.getHostAddress());
            System.out.println("ip.getHostName()=" + ip.getHostName());
            System.out.println("ip.toString()=" + ip.toString());
            System.out.println("ip.isReachable(5000)="
                    + ip.isReachable(5000));
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

结果如下:

localIp.getCanonicalHostName()=WIN-C9R1GLESKTK
localIp.getHostAddress()=192.168.136.1
localIp.getHostName()=WIN-C9R1GLESKTK
localIp.toString()=WIN-C9R1GLESKTK/192.168.136.1
localIp.isReachable(5000)=true
====================================

五、URL

1. 简介

URL: Uniform Resource Locator 统一资源定位符

  • 表示统一资源定位符,指向万维网上的“资源”的指针。用于区分、定位资源
  • 一个标准的URL必须包括:protocol(方案或协议)、host(主机)、port(端口)、path(路径)、parameter( 查询参数)、、anchor(锚点)
  • 在www上,每一信息资源都有统一且唯一的地址
  • 如:http://www.google.com:80/index.html ,分四部分组成:协议、存放资源的主机域名、端口号、资源

文件名

2. API

构造器

说明

URL(String spec)

从 String表示形成一个 URL对象

常用方法

说明

String getProtocol()

获取此 URL的协议名称

String getHost()

获取此 URL的主机名(如适用)

int getPort()

获取此 URL的端口号

String getPath()

获取此 URL的路径部分

String getFile()

获取此 URL的文件名

String getQuery()

获取参数

String getRef()

获取锚点

3. 示例代码

public class URLTest01 {
    public static void main(String[] args) throws MalformedURLException {
        URL url = new URL("http://www.baidu.com:80/index.html?uname=dream&age=18#a");
        // 获取四个值:协议、域名、端口、请求资源
        System.out.println("协议:" + url.getProtocol());
        System.out.println("域名|IP:" + url.getHost());
        System.out.println("端口:" + url.getHost());
        System.out.println("请求资源1:" + url.getPath());
        System.out.println("请求资源2:" + url.getFile());
        // 参数
        System.out.println("参数:" + url.getQuery());
        // 锚点
        System.out.println("锚点:" + url.getRef());
    }
}

结果如下:

协议:http
域名|IP:www.baidu.com
端口:www.baidu.com
请求资源1:/index.html
请求资源2:/index.html?uname=dream&age=18
参数:uname=dream&age=18
锚点:a

六、TCP/UDP的简介与区别

1. 简介

  • TCP(Transmission Control Protocol):传输控制协议,是一种面向连接的、可靠的、基于字节流的传输

层通信协议。由IETF的RFC 793定义。

  • UDP(User Datagram Protocol):用户数据报协议,是一种面向无连接,不可靠、以数据报文段的形式传

输的传输层通信协议。由RFC 768描述了UDP。

TCP报文格式

UDP报文格式

2. TCP、UDP区别

2.1. 连接

TCP面向连接(如打电话先拨号建立连接)

UDP无连接,即发送数据报前不用建立连接(古代写信,无法彼此建立连接,且无法保证信件是否会丢失)

2.2. 安全

TCP提供可靠的服务,通过TCP连接发送的数据,无差错、不丢失、不重复按序到达。

UDP尽最大努力交付,不保证可靠的传输服务。

2.3. 传输效率

TCP传输效率低、UDP传输效率高

2.4. 连接数量

TCP连接只能一对一、点对点通信。

UDP连接支持一对一、一对多、多对一和多对多的交互通信。

2.5. 首部

TCP报文首部20个字节,UDP报文首部8个字节

2.6. 可靠

TCP的逻辑通信是全双工的可靠信道,UDP则是不可靠信道。

2.7. 面向方式

TCP面向字节流,实际上是把TCP数据看成一串无结构的字节流,由于连接的问题,当网络出现波动时,连接可能

出现波动问题。UDP面向报文。UDP没有阻塞控制,因此网络出现拥堵不会使源主机的发送速率降低。

3. TCP的三次握手与四次挥手

3.1. TCP的三次握手

三次握手是TCP用来确保连接可靠建立的方式

  • 第一次握手:A给B发短信说:“B,你现在有空吗?”
  • 第二次握手:B此时收到了A的信息,然后对A说:“我有空,你呢?有空吗?”
  • 第三次握手:A此时收到了A的信息,然后说:“我也有空,那我给你说个事。”

在三次握手之后,A和B都能确定这么一件事:双方的通信可以流畅的进行。这样,双方就可以开始进行正常的对 话了。

3.2. TCP的四次挥手

四次挥手是TCP用来确保连接可靠关闭的方式:

  • 第一次挥手:A给B发短信说,“B,我要准备吃饭了?”
  • 第二次挥手:B此时收到了A的信息,然后先对A说:“我知道了。”
  • 第三次挥手:B对A说:“我也要准备吃饭了。”然后放下了手机
  • 第四次挥手:A此时收到了B的确认信息,然后向B发送一个包说:“好的,知道了。”这时才放下手机去吃饭

在四次挥手之后,A和B都能确定这么一件事:

双方的通信都可以正常关闭,这样,双方就可以确定对方已经完全知道了自己要确认关闭连接。

3.3. 为什么握手要三次、挥手要四次?

三次握手是客户端与服务端建立通信的过程。

  • 第一次:客户端向服务端发送请求,确认服务端是否能够收到请求。
  • 第二次:服务端向客户端响应,告诉客户端,我已经收到你的请求。并且准备号接受其他亲亲贵
  • 第三次:客户端再次发送请求,告诉服务端,我已经收到了你的回复麻,并且我也准备好了。

四次挥手是客户端与服务端结束通信的过程。

  • 第一次:客户端向服务端发送结束的请求。
  • 第二次:服务端向客户端响应,收到你的结束请求了。
  • 第三次:服务端向客户端发起,服务端收到这样的请求后,会区处理所有的现有数据请求,在现有的数据请求处理完成以后,会正式回复客户端的结束请求。
  • 第四次:客户端向服务端发起,表示已经收到了你的结束请求。

4. TCP和UDP的使用场景

4.1. TCP的使用场景

相对于UDP,TCP实现了数据传输过程中的各种控制,可以进行丢包时的重发控制,还可以对次序乱掉的分包进行

顺序控制。在对可靠性要求较高的情况下,可以使用TCP。

(特别是需要可靠连接,比如付费、加密数据等等方向都需要依靠TCP)

4.2. UDP的使用场景

当对网络通讯质量要求不高时,要求网络通讯速度能尽量快,这时就可以使用UDP。

在日常生活中,常见使用UDP协议的应用,比如QQ语音、QQ视频、TFTP等。

  • 包总量较小的通信(DNS,SNMP)
  • 视频、音频等多媒体通信(即时通信)
  • 广播通信
  • 对数据安全性无特殊要求
  • 网络负担非常重,但对响应速度要求高

4.3. TCP维护可靠的通信方式

  1. 数据分片:在发送端对用户数据进行分片,在接收端进行重组,由TCP确定分片的大小并控制分片和重组。
  2. 到达确认:接收端接收到分片数据时,根据分片数据序号向发送端发送一个确认包。
  3. 超时重发:发送方在发送分片后计时,若超时却没有收到相应的确认包,将会重发对应的分片。
  4. 滑动窗口:TCP连接双方的接收缓冲空间大小都固定,接收端只能接受缓冲区能容纳的数据。
  5. 失序处理:TCP的接收端需要重新排序接收到的数据。
  6. 重复处理:如果传输的TCP分片出现重复,TCP的接收端需要丢弃重复的数据。
  7. 数据效验:TCP通过保持它首部和数据的检验和来检测数据在传输过程中的任何变化。新排序接收到的数据。
  8. 重复处理:如果传输的TCP分片出现重复,TCP的接收端需要丢弃重复的数据。
  9. 数据效验:TCP通过保持它首部和数据的检验和来检测数据在传输过程中的任何变化。

http://www.kler.cn/a/381812.html

相关文章:

  • lxml 解析xml\html
  • Next.js 14 性能优化:从首屏加载到运行时优化的最佳实践
  • ROSboard:为您的机器人提供强大的Web可视化工具
  • Doris 资源软硬限详解
  • 微服务篇-深入了解 XXL-JOB 分布式任务调度的具体使用(XXL-JOB 的工作流程、框架搭建)
  • 第十五章 C++ 数组
  • RabbitMQ自动发送消息工具(自动化测试RabbitMQ)
  • 群控系统服务端开发模式-应用开发-文件上传功能开发
  • qt QStandardItemModel详解
  • Hms?: 1渗透测试
  • 2DGameEngine(webGL)----初始化工程
  • SD-WAN技术怎样与运营商网络无缝集成
  • Apache HTTP Server中级操作指南
  • 100种算法【Python版】第47篇——堆排序
  • Pytest-Bdd-Playwright 系列教程(5):仅执行测试用例的收集阶段
  • 有色金属价格的上涨通常受到多种因素的影响,以下是一些主要因素:
  • 在 Google Chrome 上查找并安装 SearchGPT 扩展
  • Pytorch cuda版本选择(高效简洁版)
  • HTB:Sense[WriteUP]
  • scala的属性访问权限
  • Go:struct结构体和继承
  • Jest进阶知识:整合 TypeScript - 提升单元测试的类型安全与可靠性
  • 【面试经典150】day 10
  • 【07】Maven项目多环境打包配置
  • SpringBoot+ClickHouse集成
  • PostgreSQL和MySQL在MVCC