通信编程常用模型

TCP和UDP的区别

TCP(传输控制协议)和UDP(用户数据报协议)是两种常见的传输层协议,它们在数据通信中有一些关键的区别:

  • 连接导向 vs. 无连接:

    • TCP是一种连接导向的协议,它在通信开始前需要建立连接,然后在通信结束时释放连接。这确保了数据的可靠性和顺序性,因为数据包会按照发送的顺序被接收。
    • UDP是一种无连接的协议,通信不需要在开始前建立连接,也不会在结束时释放连接。每个数据包都独立处理,不保证它们的顺序和可靠性。
  • 可靠性:

    • TCP提供可靠的数据传输,通过使用确认机制、重传机制和流量控制来确保数据的完整性和正确性。
    • UDP不提供可靠性保证,数据包可能会丢失或乱序,但因此它的传输速度更快。
  • 流量控制:

    • TCP使用流量控制来防止发送方发送过多的数据,确保接收方来得及处理。这通过滑动窗口协议来实现。
    • UDP不提供流量控制,发送方会持续发送数据,不考虑接收方的处理能力。
  • 重传机制:

    • TCP具有重传机制,当发送的数据包丢失或损坏时,会进行重传,以确保数据的完整性。
    • UDP不具备重传机制,丢失的数据包将不会被重发。
  • 适用场景:

    • TCP适用于对数据可靠性要求较高的场景,如文件传输、网页浏览等。
    • UDP适用于对实时性要求较高、能容忍一定数据丢失的场景,如音视频传输、在线游戏等。

总体而言,TCP适用于对数据可靠性和顺序性要求较高的应用,而UDP适用于对实时性要求较高、能够容忍一定数据丢失的应用。

OSI网络模型与TCP/IP网络模型

OSI(开放系统互联)网络模型和TCP/IP网络模型是两种用于理解和设计计算机网络的框架。它们都是分层模型,但有一些区别。下面是对两者的详细讲解:

OSI网络模型(OSI Model):

  • 物理层(Physical Layer):

    • 确定数据如何在物理媒体上传输,包括电缆、光纤、无线信号等。
  • 数据链路层(Data Link Layer):

    • 在物理层之上提供点对点的数据传输,通过帧(Frame)管理和错误检测。
  • 网络层(Network Layer):

    • 处理数据包的路由和转发,为数据选择最佳路径,并提供逻辑地址(IP地址)。
  • 传输层(Transport Layer):

    • 提供端到端的通信,确保数据可靠地传输。TCP和UDP协议位于这一层。
  • 会话层(Session Layer):

    • 管理不同应用程序之间的对话,负责建立、维护和结束会话。
  • 表示层(Presentation Layer):

    • 处理数据的格式、编码和加密,确保一个系统的应用层能理解另一个系统发送的数据。
  • 应用层(Application Layer):

    • 提供网络服务给应用程序,包括文件传输、电子邮件、远程登录等。

TCP/IP网络模型:

  • 链路层(Link Layer):

    • 类似于OSI的物理层和数据链路层,处理物理媒体和数据帧。
  • 网络层(Internet Layer):

    • 类似于OSI的网络层,负责数据包的路由和转发。主要协议是IP(Internet Protocol)。
  • 传输层(Transport Layer):

    • 与OSI的传输层相对应,提供端到端的通信。包括TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)。
  • 应用层(Application Layer):

    • 将OSI的会话层、表示层和应用层合并为一个层,包含各种应用层协议,如HTTP、FTP、SMTP等。

区别和关系:

  • OSI模型是一个更通用的参考模型,而TCP/IP模型是实际应用中更常见的模型。
  • OSI模型包含更多的层次,而TCP/IP模型将它们合并成更少的层次。
  • TCP/IP模型的网络层相当于OSI模型的网络层和数据链路层的组合。
  • 两者都采用分层的设计思想,以提高网络设计的可维护性和可扩展性。

在实践中,TCP/IP模型更为流行,因为它是互联网的基础协议。许多网络设备和应用程序都直接基于TCP/IP模型进行设计和实现。

什么是DNS以及它是如何工作的

DNS(域名系统)是一种用于将人类可读的域名映射到计算机网络中的IP地址的系统。它充当了互联网上的“电话簿”,使用户能够使用易记的域名来访问网站,而不必记住复杂的IP地址。

DNS的工作原理:

  • 域名解析请求:

    • 当用户在浏览器中输入一个域名(例如www.example.com),操作系统会向本地DNS服务器发送一个域名解析请求。
  • 本地DNS服务器:

    • 本地DNS服务器通常由互联网服务提供商(ISP)或其他网络服务提供商提供。它负责缓存已解析的域名和相应的IP地址,以加快未来的解析速度。
    • 如果本地DNS服务器已经缓存了请求的域名和IP地址,它将直接返回结果给用户。
  • 根域名服务器:

    • 如果本地DNS服务器没有缓存所需的域名和IP地址,它将向根域名服务器发送解析请求。根域名服务器是DNS层次结构的最顶层,负责指导请求到达正确的顶级域名服务器。
  • 顶级域名服务器(TLD):

    • 根域名服务器返回一个指向正确顶级域名服务器的IP地址。比如,如果域名是www.example.com,那么顶级域名服务器就是.com域的DNS服务器。
    • 本地DNS服务器再次向顶级域名服务器发送解析请求。
  • 权限域名服务器:

    • 顶级域名服务器返回一个指向目标域名的权威域名服务器的IP地址。权威域名服务器是负责存储特定域名信息的服务器。
  • 域名解析并缓存:

    • 本地DNS服务器最终向权威域名服务器发送解析请求,并接收到与该域名相关联的IP地址。
    • 本地DNS服务器将解析得到的IP地址返回给用户,并在本地缓存中保存这个映射关系,以便将来的请求可以更快地获得解析结果。
  • 浏览器访问:

    • 用户的浏览器接收到IP地址后,就可以直接与目标服务器建立连接,开始获取网页或其他资源。

整个过程中,DNS系统采用了分布式的设计,将解析请求分发到多个不同层次的服务器,以提高系统的可靠性和效率。DNS的设计使得用户能够通过易记的域名来访问互联网,而无需关心底层的IP地址。

在浏览器输入一个网址,然后看到网页背后的网络活动的全过程

浏览器输入一个网址并查看网页的全过程涉及多个步骤,包括域名解析、建立连接、发送HTTP请求、接收HTTP响应等。以下是详细的步骤:

  • 域名解析:

    • 用户在浏览器中输入一个网址(例如www.example.com),浏览器首先检查本地DNS缓存是否包含该域名的IP地址。
    • 如果缓存中没有相应的IP地址,浏览器将发起一个DNS解析请求,向本地DNS服务器询问目标域名的IP地址。
  • DNS解析过程:

    • 本地DNS服务器首先检查自身的缓存,如果找到了目标域名的IP地址,则直接返回给浏览器。
    • 如果本地DNS服务器没有缓存,它将向根域名服务器发起请求,根域名服务器指导请求到达正确的顶级域名服务器。
    • 顶级域名服务器再次指导请求到达目标域名的权威域名服务器,最终获取目标域名对应的IP地址。
  • 建立TCP连接:

    • 一旦浏览器获取到目标域名的IP地址,它将使用HTTP协议中的TCP三次握手建立与目标服务器的连接。这是一个可靠的连接,确保数据的可靠传输。
  • 发送HTTP请求:

    • 浏览器通过建立的TCP连接向目标服务器发送HTTP请求。该请求包括请求行、请求头和请求体,其中请求行包含请求的方法(GET、POST等)和资源路径。
  • 服务器处理请求:

    • 目标服务器接收到HTTP请求后,根据请求的资源路径和方法进行处理。服务器可能会执行后端逻辑、查询数据库等操作,最终生成HTTP响应。
  • 服务器返回HTTP响应:

    • 服务器将生成的HTTP响应通过已建立的TCP连接发送回浏览器。响应包括响应状态行、响应头和响应体。
  • 浏览器渲染页面:

    • 浏览器接收到HTTP响应后,开始解析响应内容。如果响应的是HTML页面,浏览器将解析HTML、CSS和JavaScript,并渲染出最终的网页。
  • 关闭TCP连接:

    • 一旦页面渲染完成,浏览器与服务器之间的TCP连接可以关闭,释放资源。

在整个过程中,DNS解析、建立TCP连接、发送HTTP请求和接收HTTP响应是关键的步骤。这些步骤确保了浏览器能够从用户输入的域名获取到对应的网页,并将其呈现在用户界面上。

套接字:Socket

套接字(Socket)是一种用于在计算机之间进行通信的编程接口。它是实现网络通信的一种机制,允许不同计算机之间通过网络传输数据。套接字提供了一种标准化的接口,使应用程序能够利用网络进行数据交换。

1. 套接字类型:

  • 流套接字(Stream Socket): 提供面向连接的可靠数据流,使用TCP协议。在网络编程中,常用于客户端和服务器之间的通信。
  • 数据报套接字(Datagram Socket): 提供无连接的数据报服务,使用UDP协议。适用于一对一或一对多的简单通信。

2. 套接字通信流程:

  • 服务器端:

    • 创建套接字:使用socket()系统调用创建一个套接字。
    • 绑定地址:使用bind()绑定套接字到一个特定的IP地址和端口。
    • 监听连接请求(对于TCP流套接字):使用listen()开始监听连接请求。
    • 接受连接:使用accept()接受来自客户端的连接请求,创建一个新的套接字用于与客户端通信。
    • 与客户端通信:使用新创建的套接字进行数据的收发。
  • 客户端:

    • 创建套接字:使用socket()系统调用创建一个套接字。
    • 连接服务器:使用connect()连接到服务器的IP地址和端口。
    • 与服务器通信:使用套接字进行数据的收发。

3. 套接字地址:

  • 在套接字通信中,地址用于标识唯一的端点。IPv4套接字地址通常包括IP地址和端口号,形如(IP地址, 端口号)

4. 套接字选项:

  • 套接字提供了一些选项,可用于配置套接字的行为,例如设置套接字为非阻塞模式、启用或禁用地址重用等。

5. 阻塞与非阻塞套接字:

  • 阻塞模式: 默认情况下,套接字是阻塞的,当套接字执行某些操作时(如接收数据),程序会阻塞在那里等待操作完成。
  • 非阻塞模式: 在非阻塞模式下,套接字的某些操作会立即返回,而不会等待操作完成。这使得程序可以继续执行其他任务。

6. 关闭套接字:

  • 使用close()系统调用关闭套接字,释放相关资源。

7. 套接字编程接口:

  • 套接字编程接口包括各种编程语言的套接字库,如Python的socket模块、Java的java.net包等。

套接字是网络编程中非常重要的概念,它为应用程序提供了一种通用的接口,使它们能够通过网络进行通信。在实际应用中,套接字的使用范围涉及到多种网络通信场景,包括Web服务器、聊天应用、文件传输等。

TCP服务器-TCP客户端

Java TCP服务器端程序,它通过ServerSocket监听指定端口(这里是51234),等待客户端的连接。一旦有客户端连接成功,就创建一个与该客户端通信的Socket,并通过BufferedReader和PrintWriter进行数据的读取和写入。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {
    public static void main(String[] args) throws IOException {
        // ServerSocket 服务端套接字 - 主动绑定端口
        ServerSocket serverSocket = new ServerSocket(51234);
        System.out.println("等待连接...");
        // 阻塞等待客户端的连接
        Socket clientSocket = serverSocket.accept();
        System.out.println("连接成功!");
        // clientSocket 服务端建立与客户端的连接的负责人
        BufferedReader in = new BufferedReader(new
                InputStreamReader(clientSocket.getInputStream()));
        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
        String inputLine;
        while ((inputLine = in.readLine()) != null) {
            System.out.println("客户端说:" + inputLine);
            out.println(inputLine);
        }
        in.close();
        out.close();
        clientSocket.close();
        serverSocket.close();
    }
}

整个程序的主要逻辑是通过ServerSocket等待客户端连接,一旦有连接,就创建一个与客户端通信的Socket。通过BufferedReader读取客户端发送的数据,然后通过PrintWriter向客户端发送相同的数据。循环持续进行通信,直到客户端关闭连接。

Java TCP客户端程序,它连接到指定的服务器地址和端口(这里是localhost和51234),通过Socket与服务器建立连接。通过PrintWriter和BufferedReader进行数据的写入和读取,与服务器进行简单的交互。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class TCPClient {
    public static void main(String[] args) throws IOException {
        String serverHostname = "localhost";
        // 创建的客户端socket 需要指定服务端的IP地址+端口号 才可以连接服务端
        Socket socket = new Socket(serverHostname, 51234);
        // A 端的 socket 是客户端这边负责与服务端建立连接的
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
        String userInput;
        while ((userInput = stdIn.readLine()) != null) {
            out.println(userInput);// 发送给服务器
            System.out.println("服务器响应: " + in.readLine());// 接收服务器的一条数据
        }
        out.close();
        in.close();
        stdIn.close();
        socket.close();
    }
}

整个程序的主要逻辑是通过Socket连接到指定的服务器地址和端口,然后通过PrintWriter向服务器发送用户输入的数据。同时,通过BufferedReader从服务器接收响应数据,并将其打印到控制台。循环持续进行用户输入和服务器响应的交互,直到用户输入结束。

通信模型

客户端 - 服务器

客户端-服务器(Client-Server)通讯模型是一种计算机网络架构,其中有两种角色:客户端和服务器。这种模型被广泛用于构建分布式系统,其中客户端和服务器之间通过网络进行通信。以下是客户端-服务器通讯模型的详细讲解:

1. 角色说明:

  • 客户端(Client): 客户端是用户或应用程序发起请求的一方。它向服务器发出请求,并等待服务器的响应。客户端通常是一个终端用户的计算机或移动设备,也可以是其他服务器。
  • 服务器(Server): 服务器是接受并处理客户端请求的一方。它提供服务、资源或数据,并响应客户端的请求。服务器通常是一台具有高性能硬件和网络连接的计算机。

2. 通讯流程:

  • 连接建立: 客户端通过网络连接到服务器,建立通信通道。这可以通过套接字(Socket)等通信机制完成。
  • 请求-响应: 客户端向服务器发起请求,请求可以包含获取数据、执行操作等。服务器收到请求后,进行相应的处理,并返回响应给客户端。
  • 数据传输: 通常使用网络协议(如HTTP、TCP/IP)来传输数据。请求和响应的数据可以是文本、图像、音频等不同类型。
  • 连接释放: 一次请求-响应完成后,连接可能会保持开放(长连接)或关闭(短连接),具体取决于应用程序和协议的设计。

3. 特点与优势:

  • 分布式性: 客户端和服务器可以部署在不同的物理位置,形成分布式系统,提高系统的可扩展性和灵活性。
  • 集中管理: 服务器集中管理资源和服务,客户端通过请求来获取所需的服务或数据,实现资源的有效利用。
  • 可扩展性: 由于客户端和服务器是独立的实体,可以通过增加服务器数量来实现系统的横向扩展,提高系统的性能和吞吐量。

4. 通信协议:

  • 通信双方需要遵循相同的通信协议,以确保正确解释和处理数据。常见的通信协议包括HTTP、HTTPS、TCP/IP等。

5. 例子:

  • Web浏览器与Web服务器之间的通信就是一个经典的客户端-服务器模型。浏览器作为客户端向服务器发起HTTP请求,服务器收到请求后返回相应的HTML、CSS、JavaScript等资源,浏览器解析并显示页面。

6. 安全性考虑:

  • 安全性是客户端-服务器通讯模型的重要考虑因素。使用加密通信协议(如HTTPS)、身份验证和访问控制等措施可以提高通信的安全性。

客户端-服务器通讯模型是一种灵活且可扩展的网络架构,广泛用于构建各种应用,包括Web应用、数据库系统、即时通讯等。通过合理设计和优化,可以实现高效、稳定和安全的通信。

服务端-服务端

服务端-服务端通讯模型是一种网络架构,其中两个或多个服务器之间通过网络进行通信。这种模型用于构建分布式系统,其中不同服务器负责不同的任务或服务,并通过网络协同工作。以下是服务端-服务端通讯模型的详细讲解:

1. 角色说明:

  • 服务端1: 第一个服务端,负责提供特定的服务或执行特定的任务。
  • 服务端2: 第二个服务端,可能负责不同的服务或任务。
  • N个服务端: 模型可以包含多个服务端,它们相互之间进行通信和协作。

2. 通讯流程:

  • 连接建立: 不同服务端之间通过网络建立连接。这可以通过套接字(Socket)等通信机制完成。
  • 请求-响应: 服务端之间通过请求和响应进行通信。一个服务端可以向另一个服务端发起请求,请求可以包含获取数据、执行操作等。接收请求的服务端进行相应的处理,并返回响应。
  • 数据传输: 通常使用网络协议(如TCP/IP)来传输数据。请求和响应的数据可以是文本、二进制数据等不同类型。
  • 连接释放: 通信完成后,连接可能会保持开放(长连接)或关闭(短连接)。

3. 特点与优势:

  • 任务分工: 不同服务端可以负责不同的任务或服务,形成分布式系统,提高系统的可扩展性和效率。
  • 协同工作: 服务端之间可以协同工作,共同完成复杂的业务逻辑。例如,一个服务端可以提供数据存储服务,另一个服务端可以提供计算服务。
  • 负载均衡: 通过合理设计,可以实现负载均衡,确保各个服务端的负载相对均匀。

4. 通信协议:

  • 通信双方需要遵循相同的通信协议,以确保正确解释和处理数据。常见的通信协议包括TCP/IP。

5. 例子:

  • 一个常见的服务端-服务端通讯例子是分布式数据库系统。不同的数据库服务器可以负责存储不同部分的数据,而应用程序可以通过网络请求数据。

6. 安全性考虑:

  • 安全性在服务端-服务端通讯模型中同样重要。使用加密通信协议、身份验证、访问控制等手段可以提高通信的安全性。

服务端-服务端通讯模型在构建大规模、高可用性、分布式系统方面发挥着关键作用。通过合理设计和实施,可以实现系统的可扩展性、弹性和高效性。

你可能感兴趣的:(信息与通信,java)