Socket网络编程入门

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: Socket网络编程入门

什么是网络编程


什么是网络?


在计算机领域中,网络是信息传输、接受、共享的虚拟平台。


通过它把各个点、面、体的信息联系到一起,从而实现这些资源的共享。


什么是网络编程?


网络编程从大的方面就是说对信息的发送接收。


通过操作相应API调度计算机资源硬件,并且利用管道(网线)进行数据交互的过程。


更为具体的涉及:网络模型、套接字、数据包。


7层网络模型-OSI

互联网的本质就是一系列的网络协议,这个协议就叫OSI协议(一系列协议),按照功能不同,分工不同,人为的分层七层。实际上这个七层是不存在的。没有这七层的概念,只是人为的划分而已。区分出来的目的只是让我们明白哪一层是干什么用的。


每一层都运行不同的协议。


实际上也可以把它划成五层、四层。


七层划分为:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层


五层划分为:应用层、传输层、网络层、数据链路层、物理层


四层划分为:应用层、传输层、网络层、网络接口层

1654699138199.png

应用层

用户使用的都是应用程序,均工作于应用层,大家都可以开发自己的应用程序,数据多种多样,必须规定好数据的组织形式 。


应用层功能:规定应用程序的数据格式。


比如TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了”应用层”。

1654699164710.png

表示层

表示层的用途是提供一个可供应用层选择的服务的集合,使得应用层可以根据这些服务功能解释数据的含义。表示层以下各层只关心如何可靠地传输数据,而表示层关心的是所传输数据的表现方式、它的语法和语义。表示服务的例子有统一的数据编码、数据压缩格式和加密技术等。

1654699186061.png

会话层

会话层任务是:向两个实体的表示层提供建立和使用连接的方法。将不同实体之间的表示层的连接称为会话。因此会话层的任务就是组织和协调两个会话进程之间的通信,并对数据交换进行管理。

1654699204325.png

传输层

传输层是通信子网和资源子网的接口和桥梁,起到承上启下的作用。


该层的主要任务是:向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输。


传输层的作用是向高层屏蔽下层数据通信的细节,即向用户透明地传送报文。


该层常见的协议:TCP/IP中的TCP协议、Novell网络中的SPX协议和微软的NetBIOS/NetBEUI协议。


传输层提供会话层和网络层之间的传输服务,这种服务从会话层获得数据,并在必要时,对数据进行分割。然后,传输层将数据传递到网络层,并确保数据能正确无误地传送到网络层。因此,传输层负责提供两节点之间数据的可靠传送,当两节点的联系确定之后,传输层则负责监督工作。综上,传输层的主要功能如下:


传输连接管理:提供建立、维护和拆除传输连接的功能。传输层在网络层的基础上为高层提供面向连接面向无连接的两种服务。

1654699230851.png

网络层

网络层的作用是在网络与网络相互连接的环境中,将数据从发送端主机发送到接受端主机。


举例:


我在学校教室中,我想找隔壁班的妹子,我通知小弟去告诉她,说有个帅哥找你。而小弟就是网关IP地址就是我所处的教室,MAC地址就是我在教室的某个位置。

1654699259788.png

数据链路层、物理层

早期的时候,数据链路层就是来对电信号来做分组的。以前每个公司都有自己的分组方式,非常的乱,后来形成了统一的标准,即以太网协议Ethernet。


通信传输实际上是通过物理的传输介质实现的。数据链路层的作用就是在这些同构传输介质互连的设备之间进行数据处理。


物理层中,将数据的 0 、1转换为电压和脉冲光传输给物理的传输介质,而相互直连的设备之间使用地址实现传输。这种地址被称为 MAC 地址,也可称为物理地址或硬件地址。采用 MAC 地址信息的首部附加到从网络层转发过来的数据上,将其发送到网络。


网络层与数据链路层都是基于目标地址将数据发送给接收端的,但是网络层负责将整个数据发送给最终目标地址。而数据链路层则只负责发送一个分段内的数据。

1654699279526.png

OSI七层网络模型 TCP/IP四层概念模型 对应网络协议
应用层(Application) 应用层 HTTP、TFTP, FTP, NFS, WAIS、SMTP
表示层(Presentation) 应用层 Telnet, Rlogin, SNMP, Gopher
会话层(Session) 应用层 SMTP, DNS
传输层(Transport) 传输层 TCP, UDP
网络层(Network) 网络层 IP, ICMP, ARP, RARP, AKP, UUCP
数据链路层(Data Link) 数据链路层 FDDI, Ethernet, Arpanet, PDN, SLIP, PPP
物理层(Physical) 数据链路层 IEEE 802.1A, IEEE 802.2到IEEE 802.11

OSI的封包与解包过程

1654699326253.png

Socket与TCP、UDP


什么是Socket

  • 简单来说是IP地址与端口的结合协议(RFC 793)
  • 一种地址与端口的结合描述协议。
  • TCP/IP 协议的相关API的总称;是网络API的集合实现。
  • 在计算机通信领域,Socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 Socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。


Socket的作用与组成

  • 在网络传输中用于唯一标识两个端点之间的连接。
  • 端点:包括(IP + Port)
  • 四个要素:客户端地址、客户端端口、服务器地址、服务器端口。


Socket流程

1654699356930.png

服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept开始阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。


Socket 之 TCP

  • TCP是面向连接的通信协议
  • 通过三次握手建立连接,通讯完成时要拆除连接


  • 第一次握手:客户端发送带有 SYN 标志的连接请求报文段,然后进入 SYN_SEND 状态,等待服务端确认。
  • 第二次握手:服务端接受到客户端的 SYN 报文段后,需要发送 ACK 信息对这个 SYN 报文段进行确认。同时,还要发送自己的 SYN 请求信息。服务端会将上述信息放到一个报文段(SYN+ACK 报文段)中,一并发送给客户端,此时服务端进入 SYN_RECV 状态。
  • 第三次握手:客户端接收到服务端的 SYN+ACK 报文段后,会向服务端发送 ACK 确认报文段,这个报文段发送完毕后,客户端和服务端都进入 ESTABLEISHED 状态,完成 TCP 三次握手。4

1654699382278.png

  • 由于TCP是面向连接的所以只能用于端到端的通讯。


Socket 之 UDP

  • UDP是面向无连接的通讯协议。
  • UDP数据包括目标端口号和源端口号信息。
  • 由于通讯不需要连接,所以可以实现广播发送,并不局限于端到端。

1654699429435.png

Client-Server Application

  • TCP/IP 协议中,两个进程间通信的主要模式为:CS模型。
  • 主要目的:协同网络中的计算机资源、服务模式、进程间数据共享。
  • 常见的:HTTPFTPSMTP


Socket TCP 基础代码实战

客户端代码:

/**
 * @author Jack
 */
public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket();
        // 超时时间
        socket.setSoTimeout(3000);
        // 连接本地,端口2000;超时时间3000ms
        socket.connect(new InetSocketAddress(Inet4Address.getLocalHost(), 2000), 3000);
        System.out.println("已发起服务器连接...");
        System.out.println("客户端信息:" + socket.getLocalAddress() + " P:" + socket.getLocalPort());
        System.out.println("服务器信息:" + socket.getInetAddress() + " P:" + socket.getPort());
        try {
            // 发送接收数据
            todo(socket);
        } catch (Exception e) {
            System.out.println("异常关闭");
        }
        // 释放资源
        socket.close();
        System.out.println("客户端已退出~");
    }
    private static void todo(Socket client) throws IOException {
        // 构建键盘输入流
        InputStream in = System.in;
        BufferedReader input = new BufferedReader(new InputStreamReader(in));
        // 得到Socket输出流,并转换为打印流
        OutputStream outputStream = client.getOutputStream();
        PrintStream socketPrintStream = new PrintStream(outputStream);
        // 得到Socket输入流,并转换为BufferedReader
        InputStream inputStream = client.getInputStream();
        BufferedReader socketBufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        boolean flag = true;
        do {
            // 键盘读取一行
            String str = input.readLine();
            // 发送到服务器
            socketPrintStream.println(str);
            // 从服务器读取一行
            String echo = socketBufferedReader.readLine();
            if ("bye".equalsIgnoreCase(echo)) {
                flag = false;
            } else {
                System.out.println(echo);
            }
        } while (flag);
        // 资源释放
        socketPrintStream.close();
        socketBufferedReader.close();
    }
}

服务端代码:

/**
 * @author jack
 */
public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(2000);
        System.out.println("服务器准备就绪...");
        System.out.println("服务器信息:" + server.getInetAddress() + " P:" + server.getLocalPort());
        // 等待客户端连接
        for (; ; ) {
            // 得到客户端
            Socket client = server.accept();
            // 客户端构建异步线程
            ClientHandler clientHandler = new ClientHandler(client);
            // 启动线程
            clientHandler.start();
        }
    }
    /**
     * 客户端消息处理
     */
    private static class ClientHandler extends Thread {
        private Socket socket;
        private boolean flag = true;
        ClientHandler(Socket socket) {
            this.socket = socket;
        }
        @Override
        public void run() {
            super.run();
            System.out.println("新客户端连接:" + socket.getInetAddress() + " P:" + socket.getPort());
            try (// 得到打印流,用于数据输出;服务器回送数据使用
                 PrintStream socketOutput = new PrintStream(socket.getOutputStream());
                 // 得到输入流,用于接收数据
                 BufferedReader socketInput = new BufferedReader(new InputStreamReader(
                         socket.getInputStream()))) {
                do {
                    // 服务器拿到拿到一条数据
                    String str = socketInput.readLine();
                    if ("bye".equalsIgnoreCase(str)) {
                        flag = false;
                        // 回送
                        socketOutput.println("bye");
                    } else {
                        // 打印到屏幕。并回送数据长度
                        System.out.println(str);
                        socketOutput.println("服务器收到了,你发送的长度为 :" + str.length());
                    }
                } while (flag);
            } catch (Exception e) {
                System.out.println("连接异常断开");
            } finally {
                // 连接关闭
                if (socket != null) {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            System.out.println("客户端已退出:" + socket.getInetAddress() + " P:" + socket.getPort());
        }
    }
}

运行结果:

1654699499767.png

1654699518814.png

报文、协议、Mac地址、IP、端口

报文段

  • 报文段是指TCP/IP协议网络传输过程中,起着路由导航作用。
  • 用于查询各个网络路由网段、IP地址、交换协议等IP数据包。
  • 报文在传输过程中会不断地封装成分组、包、帧来传输。


传输协议

  • 协议顾名思义,一种规定,约束。
  • 约定大于配置,在网络传输中依然适用;网络的传输流程是很健壮的稳定的,得益于基础的协议构成。
  • 简单来说: A -> B 的传输数据,B能识别,反之 B -> A 的传输数据 A也能识别,这就是协议。


Mac地址

  • Media Access Control 或者 Medium Access Control。
  • 意译为媒体访问控制,或称为物理地址、硬件地址。
  • 用来定义网络设备位置。
  • 通常被固化在每个以太网网卡(NIC,Network Interface Card)。MAC(硬件)地址长48位(6字节),采用十六进制格式。
  • 比如:44-45-53-54-00-00 。

1654699549062.png

IP地址

  • 互联网协议地址(Internet Protocol Address)。
  • 是分配给网络上使用网际协议的设备的数字标签。
  • 常见的IP地址分为IPv4,IPv6
  • IP地址由32位二进制数组成,常以XXX.XXX.XXX.XXX形式出现,每组XXX代表小于或等于255的10进制数。
  • IP地址分为A、B、C、D、E五大类,其中E类属于特殊保留地址。


IP地址 - IPv4

  • 总数量:4,294,967,296个(即232):42亿个;最终于2011年2月3日用尽。
  • 如果主机号都是1,那么这个地址为直接广播地址。
  • IP地址 "255.255.255.255" 为受限广播地址。


IP地址 - IPv6

  • 总共有128位长,IPv6地址的表达形式,一般采用32个十六进制。
  • 由两个逻辑部分组成:一个64位的网络前缀和一个64位的主机地址,主机地址通常根据物理地址自动生成,叫做EUI-64。
  • 2001:0db8:85a3:0000:1319:8a2e:0370:7344
  • IPv4可以转换为IPv6,但IPv6不一定能转换为IPv4。


端口

  • 如果把IP地址比做一间房子,端口就是出入这间房子的门或者窗户。
  • 外界的信息飞到不同窗户也就是给不同的人传递信息。
  • 0-49151号端口都是特殊端口。

1654699577556.png

  • 计算机之间依照互联网传输层 TCP/IP 协议的协议通信,不同协议都对应不同的端口。
  • 49152到65535号端口属于“动态端口”范围,没有端口可以被正式占用。
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3天前
|
分布式计算 网络协议 Python
Python网络编程:socket编程
Socket 编程是网络编程的重要部分,主要用于在不同计算机之间进行通信。Python 提供了一个非常强大的 socket 库,使得网络编程变得简单和灵活。本篇博文将详细介绍 Python 的 socket 编程,包括基础概念、核心组件、常用功能,并附上一个综合的示例及其运行结果。
|
1天前
|
网络协议 Java
一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例
这篇文章全面讲解了基于Socket的TCP网络编程,包括Socket基本概念、TCP编程步骤、客户端和服务端的通信过程,并通过具体代码示例展示了客户端与服务端之间的数据通信。同时,还提供了多个案例分析,如客户端发送信息给服务端、客户端发送文件给服务端以及服务端保存文件并返回确认信息给客户端的场景。
一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例
|
17天前
|
机器学习/深度学习 人工智能 TensorFlow
神经网络入门到精通:Python带你搭建AI思维,解锁机器学习的无限可能
【8月更文挑战第3天】踏入人工智能领域,神经网络是开启智慧之门的钥匙。它不仅是一种技术,更是模仿人脑学习与推理的思维方式。从理解神经元间的连接到构建神经网络的基本概念,再到使用Python与TensorFlow搭建手写数字识别模型,每一步都揭示着机器学习的奥秘。随着深入学习,我们将探索更高级的主题,比如深度神经网络、卷积神经网络和循环神经网络,以及如何优化模型性能。掌握背后的数学原理,将帮助我们设计更高效准确的模型。在这个旅程中,Python将是我们的得力助手,引领我们探索AI世界的无限可能。
23 2
|
3天前
|
运维 网络协议 API
入门网络,少不了这份详细的网络基础学习指南!
入门网络,少不了这份详细的网络基础学习指南!
|
9天前
|
监控 安全 网络虚拟化
智能家居安全入门:保护你的网络家园
在数字化浪潮的推动下,智能家居设备已走进千家万户,带来便捷的同时,也引入了新的安全隐患。本文将带你了解智能家居安全的基本知识,教你如何打造一道坚固的数字防线,保卫你的网络家园免受黑客侵害。
21 0
|
24天前
|
网络协议 安全 网络安全
震惊!Python Socket竟能如此玩转网络通信,基础到进阶全攻略!
【7月更文挑战第27天】在网络通信中, Python Socket编程是基石。Socket是程序间数据传输的端点, Python的`socket`模块简化了网络通信的实现。
32 0
|
24天前
|
网络协议 Python
告别网络编程迷雾!Python Socket编程基础与实战,让你秒变网络达人!
【7月更文挑战第27天】在网络编程的广阔天地中,Socket编程常被视为一道难关。但用Python这把钥匙,我们可以轻松入门。Socket作为网络通信的基石,在Python中通过`socket`模块封装了底层细节,简化了开发过程。以下是一个基本的TCP服务器与客户端的示例,展示了如何建立连接、收发数据及关闭连接。为了应对实际场景中的并发需求,我们还可以借助多线程技术来提升服务器处理能力。掌握了这些基础知识后,你将逐步揭开网络编程的神秘面纱,踏上编程高手之路!
23 0
|
24天前
|
网络协议 Python
深度剖析Python Socket:从入门到精通,网络编程不再是难题!
【7月更文挑战第27天】在Python中,Socket编程是网络通信的核心。本文从Socket基础概念入手,介绍其作为网络通信端点的作用,并区分TCP(面向连接)与UDP(无连接)。通过示例代码展示如何创建TCP服务器及客户端:服务器监听12345端口,接收并回显客户端消息;客户端则连接服务器并发送消息,接收服务器回应。代码涵盖socket创建、连接管理及数据收发等关键步骤,并强调异常处理与数据编码的重要性。掌握这些基础知识,即可轻松开展网络编程项目。
40 0
|
4天前
|
SQL 安全 网络安全
网络安全与信息安全:保护数字世界的基石
【8月更文挑战第16天】在数字化时代,网络安全与信息安全的重要性日益凸显。本文将深入探讨网络安全漏洞、加密技术以及安全意识等关键领域,旨在为读者提供全面的知识分享和实践指导。我们将从网络攻击的常见类型及其防御措施出发,进一步讨论加密技术在保障数据安全中的作用,并强调提升个人和企业的安全意识的必要性。通过分析真实案例,本文旨在帮助读者构建更加坚固的网络安全防线,共同守护我们的数字生活。
|
4天前
|
SQL 安全 网络安全
网络安全与信息安全:漏洞、加密技术与安全意识的探讨
【8月更文挑战第16天】在数字化时代,网络安全与信息安全成为维护社会稳定和保护个人隐私的重要议题。本文将深入探讨网络安全漏洞的成因、影响及防范措施,介绍加密技术的基本原理和应用,并强调提升公众的安全意识在构建网络防线中的重要性。通过分析当前网络安全面临的挑战,提出加强技术防护和提高用户安全意识的双重策略,旨在为读者提供全面的网络安全知识分享。
23 9