网络编程基本概念(一篇文章掌握基本内容的详细概念,IP,端口号,协议,协议分层,封装和分用,客户端和服务端,请求和回应,两台主机的通信)

news2025/2/2 3:41:42

IP地址

概念
IP地址主要⽤于标识⽹络主机、其他⽹络设备(如路由器)的⽹络地址。简单说,IP地址⽤于定位主机的⽹络地址。
就像我们发送快递⼀样,需要知道对⽅的收货地址,快递员才能将包裹送到⽬的地。

IP的格式
IP地址是⼀个32位的⼆进制数,通常被分割为4个“8位⼆进制数”(也就是4个字节),如:
01100100.00000100.00000101.00000110。
通常⽤“点分⼗进制”的⽅式来表⽰,即a.b.c.d的形式(a,b,c,d都是0~255之间的⼗进制整数)。
如:100.4.5.6。

端口号

概念
在⽹络通信中,IP地址⽤于标识主机⽹络地址,端⼝号可以标识主机中发送数据、接收数据的进程。
简单说:端⼝号⽤于定位主机中的进程。
类似发送快递时,不光需要指定收货地址(IP地址),还需要指定收货⼈(端⼝号)。

格式
端⼝号是0~65535范围的数字,在⽹络通信中,进程可以通过绑定⼀个端⼝号,来发送及接收⽹络数据。

协议

有了IP地址和端⼝号,可以定位到⽹络中唯⼀的⼀个进程,但还存在⼀个问题,⽹络通信是基于⼆进制0/1数据来传输,如何告诉对⽅发送的数据是什么样的呢?
⽹络通信传输的数据类型可能有多种:图⽚,视频,⽂本等。同⼀个类型的数据,格式可能也不同,如发送⼀个⽂本字符串“你好!”:如何标识发送的数据是⽂本类型,及⽂本的编码格式呢?
基于⽹络数据传输,需要使⽤协议来规定双⽅的数据格式。

概念
协议,⽹络协议的简称,⽹络协议是⽹络通信(即⽹络数据传输)经过的所有⽹络设备都必须共同遵从的⼀组约定、规则。如怎么样建⽴连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。
协议(protocol)最终体现为在⽹络上传输的数据包的格式。

为什么需要协议呢:

计算机之间的传输媒介是光信号和电信号。通过"频率"和"强弱"来表⽰0和1这样的信息。要想传递各种不同的信息,就需要约定好双⽅的数据格式.

计算机⽣产⼚商有很多;
计算机操作系统,也有很多;
计算机⽹络硬件设备,还是有很多;
如何让这些不同⼚商之间⽣产的计算机能够相互顺畅的通信?
就需要有⼈站出来,约定⼀个共同的标准,⼤家都来遵守,这就是⽹络协议;

五元组
在TCP/IP协议中,⽤五元组来标识⼀个⽹络通信:
1. 源IP:标识源主机
2. 源端⼝号:标识源主机中该次通信发送数据的进程
3. ⽬的IP:标识⽬的主机
4. ⽬的端⼝号:标识⽬的主机中该次通信接收数据的进程
5. 协议号:标识发送进程和接收进程双⽅约定的数据格式

协议分层

什么是协议分层
协议分层类似于打电话时,定义不同的层次的协议.

就好像boss给高层思想,高层给中层指令,中层 给下层任务.老板不需要知道下层干什么.(不然一个人不可能什么事情都干完)

分层的作⽤
为什么需要⽹络协议的分层
分层最⼤的好处,类似于⾯向接⼝编程:定义好两层间的接⼝规范,让双⽅遵循这个规范来对接。
在代码中,类似于定义好⼀个接⼝,⼀⽅为接⼝的实现类(提供⽅,提供服务),⼀⽅为接⼝的使⽤
类(使⽤⽅,使⽤服务):
• 对于使⽤⽅来说,并不关⼼提供⽅是如何实现的,只需要使⽤接⼝即可
• 对于提供⽅来说,利⽤封装的特性,隐藏了实现的细节,只需要开放接⼝即可。
这样能更好的扩展和维护

OSI七层模型

OSI:即Open System Interconnection,开放系统互连
• OSI七层⽹络模型是⼀个逻辑上的定义和规范:把⽹络从逻辑上分为了7层。
• OSI七层模型是⼀种框架性的设计⽅法,其最主要的功能使就是帮助不同类型的主机实现数据传
输;

OSI?七层模型划分为以下七层:

OSI?七层模型既复杂⼜不实⽤:所以OSI七层模型没有落地、实现。
实际组建⽹络时,只是以OSI七层模型设计中的部分分层,也即是以下TCP/IP五层(或四层)模型来实现。

TCP/IP五层(或四层)模型

TCP/IP是⼀组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。
TCP/IP通讯协议采⽤了5层的层级结构,每⼀层都呼叫它的下⼀层所提供的⽹络来完成⾃⼰的需求。

• 应⽤层:负责应⽤程序间沟通,如简单电⼦邮件传输(SMTP)、⽂件传输协议(FTP)、⽹络远程访问协议(Telnet)等。我们的⽹络编程主要就是针对应⽤层。
• 传输层:负责两台主机之间的数据传输。如传输控制协议(TCP),能够确保数据可靠的从源主机发送到⽬标主机。
• ⽹络层:负责地址管理和路由选择。例如在IP协议中,通过IP地址来标识⼀台主机,并通过路由表的⽅式规划出两台主机之间的数据传输的线路(路由)。路由器(Router)⼯作在⽹路层。
• 数据链路层:负责设备之间的数据帧的传送和识别。例如⽹卡设备的驱动、帧同步(就是说从⽹线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就⾃动重发)、数据差错校验等⼯作。有以太⽹、令牌环⽹,⽆线LAN等标准。交换机(Switch)⼯作在数据链路层。
• 物理层:负责光/电信号的传递⽅式。⽐如现在以太⽹通⽤的⽹线(双绞?线)、早期以太⽹采⽤的的同轴电缆(现在主要⽤于有线电视)、光纤,现在的wifi⽆线⽹使⽤电磁波等都属于物理层的概念。物理层的能⼒决定了最⼤传输速率、传输距离、抗⼲扰性等。集线器(Hub)⼯作在物理层。

物理层我们考虑的⽐较少。因此很多时候也可以称为TCP/IP四层模型。

⽹络设备所在分层

• 对于⼀台主机,它的操作系统内核实现了从传输层到物理层的内容,也即是TCP/IP五层模型的下四层;
• 对于⼀台路由器,它实现了从⽹络层到物理层,也即是TCP/IP五层模型的下三层;
• 对于⼀台交换机,它实现了从数据链路层到物理层,也即是TCP/IP五层模型的下两层;
• 对于集线器,它只实现了物理层;

⽹络分层对应
⽹络数据传输时,经过不同的⽹络节点(主机、路由器)时,⽹络分层需要对应。
以下为同⼀个⽹段内的两台主机进⾏⽂件传输:

TCP/IP通讯过程

封装和分⽤

• 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在⽹络层叫做数据报
(datagram),在链路层叫做帧(frame)。
• 应⽤层数据通过协议栈发到⽹络上时,每层协议都要加上⼀个数据⾸部(header),称为封装
(Encapsulation)。
• ⾸部信息中包含了⼀些类似于⾸部有多⻓,载荷(payload)有多⻓,上层协议是什么等信息。
• 数据封装成帧后发到传输介质上,到达⽬的主机后每层协议再剥掉相应的⾸部,根据⾸部中的"上层协议字段"将数据交给对应的上层协议处理。
下图为数据封装的过程: 

客⼾端和服务端

服务端:在常⻅的⽹络数据传输场景下,把提供服务的⼀⽅进程,称为服务端,可以提供对外服务

客⼾端:获取服务的⼀⽅进程,称为客⼾端。

常⻅的客⼾端服务端模型
最常⻅的场景,客⼾端是指给⽤⼾使⽤的程序,服务端是提供⽤⼾服务的程序:
1. 客⼾端先发送请求到服务端
2. 服务端根据请求数据,执⾏相应的业务处理
3. 服务端返回响应:发送业务处理结果
4. 客⼾端根据响应数据,展⽰处理结果(展⽰获取的资源,或提⽰保存资源的处理结果

请求

客户端发给服务端的语句.

回应

服务端根据客户端发过来的东西,进行回应,然后给客户端

两台主机间的通信

我们这里模拟两台电脑之间的通信

服务端代码

import javax.imageio.stream.ImageInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class TcpEchoServer {
    ServerSocket serverSocket = null;

    public TcpEchoServer(int port) throws IOException {
        this.serverSocket = new ServerSocket(port);
    }
   public void start() throws IOException {
       System.out.println("服务器启动");
        while(true){
            Socket clientSocket = serverSocket.accept();
            processConnection(clientSocket);
        }
   }

    private void processConnection(Socket clientSocket) {
        try(InputStream inputStream = clientSocket.getInputStream();
            OutputStream outputStream = clientSocket.getOutputStream()){
while(true){
    Scanner scanner = new Scanner(inputStream);
    if (!scanner.hasNext()){
        break;
    }
    String request = scanner.next();
    String respond = process(request);
    PrintStream printStream = new PrintStream(outputStream);
    printStream.println(respond);
    printStream.flush();//这里要加这个,不然如果只有一个请求,不会马上执行,就需要多个请求才会执行.如果加了flush,就可以马上执行;(至于为什么一个不执行:是因为效率)
    System.out.printf("[%s:%d] req: %s, resp: %s\n", clientSocket.getInetAddress(),clientSocket.getPort(),request,respond);
}
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public String process(String request) {
        return request;
    }

    public static void main(String[] args) throws IOException {
        TcpEchoServer tcpEchoServer = new TcpEchoServer(9001);
        tcpEchoServer.start();
        
    }
}

客户端代码

import com.sun.corba.se.spi.activation.Server;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;

public class TcpEchoClient {
    Socket socket =null;
    String serverIP ;
    int port;
    public TcpEchoClient(String serverIP,int port) throws IOException {
        socket = new Socket(serverIP,port);
        }
        public void start(){
        Scanner scannerConsole = new Scanner(System.in);
            try(InputStream inputStream = socket.getInputStream();
                OutputStream outputStream = socket.getOutputStream()){
               while(true) {
                   System.out.print("-> ");
                   String request = scannerConsole.next();
                   PrintStream printStream = new PrintStream(outputStream);
                   printStream.println(request);
                   printStream.flush();
                   Scanner scannerNetwork = new Scanner(inputStream);
                   String respone = scannerNetwork.next();
                   System.out.println(respone);
               }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }

    public static void main(String[] args) throws IOException {
        TcpEchoClient tcpEchoClient = new TcpEchoClient("127.0.0.1",9001);
        tcpEchoClient.start();
    }
    }



下面我们来一步步解析这段代码是如何交互的:

1.首先服务端得先启动,创建服务端的端口号.

2.服务端创建完毕后,客户端就可以启动

3.客户端开始给服务端传递请求 

然后客户端将请求传递过去(这里我们使用PrintStream,方便传递,然后还要使用flush,不然一次数据太少了,他不会传递,会等到数据累计多了才传递,所以我们为了无论多少数据都传递,就得使用flush,这个是优化问题)

4.TCP协议,得用accept接收.

接受到客户端发过来的Socket之后,就可以正常使用了,通过Scanner将客户端的请求数据输入到服务器中.

然后服务器将客户端的代码通过process方法处理请求

服务端将处理好的请求还给客服端.

5.然后客服端接受服务器返回的处理过的请求,自此完成交互

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1555357.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python环境下基于小波变换和机器学习的地震信号处理和识别

天然地震是由地球板块之间的碰撞或挤压引起的自然现象,这种碰撞或挤压导致板块边缘位移和板块内部破裂。非天然地震是指由人类活动引起的地面震动活动,比如矿震、核试验以及人工爆破等。随着社会经济的不断发展,人工爆破在生产生活中得到了广…

OSX-02-Mac OS应用开发系列课程大纲和章节内容设计

本节笔者会详细介绍下本系统专题的大纲,以及每个专题章节的组织结构。这样读者会有一个全局的概念。 在开始前还是在再介绍一下下面这个框架图,因为比较重要,在这里再冗余介绍一下。开发Apple公司相关产品的软件时,主要有两个框架…

【Canvas与艺术】五角星光芒四射的效果展示

【关键点】 三一渐变式光芒的实现。 【效果】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>光芒四射</title><st…

网络安全新视角:数据可视化的力量

在当今数字化时代&#xff0c;网络安全已成为各大企业乃至国家安全的重要组成部分。随着网络攻击的日益复杂和隐蔽&#xff0c;传统的网络安全防护措施已难以满足需求&#xff0c;急需新型的解决方案以增强网络防护能力。数据可视化技术&#xff0c;作为一种将复杂数据转换为图…

IDEA报错:java.nio.charset.MalformedInputException: Input length = 1

今天启动Springboot项目的时候报错&#xff1a; 一、问题 java.nio.charset.MalformedInputException: Input length 1和Input length 2 二、原因 是因为你的配置文件里面有中文或者是你的编码格式不正确导致 三、解决方案 解决方案一&#xff1a; 改变你的编码格式改为UT…

JAVA8 新特性StreamAPI使用

一、使用StreamAPI&#xff0c;操作两个队伍中名字&#xff0c;需求如下&#xff1a; 1、第一个队伍名字为3个字的成员姓名 2、第一个队伍筛选名字为3个字之后的前三个成员 3、第二个队伍筛选姓张的成员 4、第二个队伍筛选姓张的之后跳过前两个成员 5、将两个队伍合并成一个队伍…

利用HIVE的窗口函数进行SQL查询中出现的问题记录

student_info部分数据 score_info部分数据 course_info 1、问题复现 --完整SQL selectsti.stu_id,sti.stu_name,concat_ws(",",collect_set(ci.course_name)) over(partition by sti.stu_id) fromstudent_info sti left joinscore_info sci onsti.stu_idsci.stu_id l…

标题:基于uQRCode的Vue前端二维码生成组件技术探究

摘要&#xff1a;随着移动互联网的普及&#xff0c;二维码作为信息传递的媒介在各类应用中得到了广泛使用。前端开发中&#xff0c;二维码生成功能已成为一个常见的需求。本文将深入探讨如何使用uQRCode库在Vue前端框架中封装一个二维码生成组件&#xff0c;该组件可适用于所有…

银河麒麟服务器操作系统安装SQLite数据库

SQLite&#xff0c;是一款轻型的数据库&#xff0c;是遵守ACID的关系型数据库管理系统&#xff0c;它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的&#xff0c;而且已经在很多嵌入式产品中使用了它&#xff0c;它占用资源非常的低&a…

Servlet基础 管理员注册页面

管理员注册页面 index.jsp <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <% String path request.getContextPath(); String basePath request.getScheme()"://"request.getServerName()":&quo…

linux基础命令篇: centos7虚拟机网络配置——NAT模

linux基础命令篇&#xff1a; centos7虚拟机网络配置——NAT模式 1搞清楚NAT模式概念 在网络地址转换&#xff08;NAT&#xff09;模式下&#xff0c;虚拟机与宿主机共享一个IP地址。虚拟机的所有网络流量都会通过宿主机的IP地址进行转换&#xff0c;然后发送到外部网络。这意…

小型分布式文件存储系统GoFastDfs应用简介

前言 最近稍微留意了一下各个文件存储系统的协议&#xff0c;发现minio是LGPLV3, 而fastdfs 是GPL3,这些协议其实对于商业应用是一个大坑。故而寻找一些代替品。 go-fastdfs就是其中之一&#xff0c;官网在&#xff1a; go-fastdfs 具体应用 其实可以直接查看官网教程的。 下…

【学习】JMeter和Postman两种测试工具的主要区别有哪些

Postman和JMeter都是常用的API测试工具&#xff0c;但它们之间存在一些不同之处。以下是Postman和JMeter的主要区别&#xff1a; 语言支持 Postman是一个基于Chrome的应用程序&#xff0c;因此它使用JavaScript作为编程语言。这意味着你可以使用JavaScript来编写测试脚本和断…

【蓝桥杯选拔赛真题50】C++简易炸弹超人 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解析

目录 C简易炸弹超人 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 C简易炸弹超人 第十四届蓝桥杯青少年创意编程大赛C选拔赛真题 一、题目要求 1、编程实现 有一块矩形游戏场地&#x…

k8s局域网通过operator部署rabbitmq

参考&#xff1a;Installing RabbitMQ Cluster Operator in a Kubernetes Cluster | RabbitMQ 1、下载cluster-operator.yml wget https://github.com/rabbitmq/cluster-operator/releases/download/v2.7.0/cluster-operator.yml 2、拉取对应的镜像&#xff0c;这里的版本是根…

【动态规划】1223. 掷骰子模拟

作者推荐 视频算法专题 LeetCode1223. 掷骰子模拟 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数。 不过我们在使用它时有个约束&#xff0c;就是使得投掷骰子时&#xff0c;连续 掷出数字 i 的次数不能超过 rollMax[i]&#xff08;i 从 1 开始编号&#xff09…

跃然纸上的灵感再现,手绘风格的开源绘图白板工具:Excalidraw

Excalidraw&#xff1a;即绘即思&#xff0c;直观呈现未来流程图&#xff01;- 精选真开源&#xff0c;释放新价值。 概览 在撰写文章或构建演示案例的过程中&#xff0c;为了增强视觉表现力和信息传达深度&#xff0c;适时融入图表或图形显得至关重要。Excalidraw作为一款基于…

mysql之MyBatis核心工作原理

MyBatis核心工作原理 一、源码环境 1.手动编译源码 工欲善其事必先利其器。为了方便我们在看源码的过程中能够方便的添加注释&#xff0c;我们可以自己来从官网下载源码编译生成对应的Jar包&#xff0c;然后上传到本地maven仓库&#xff0c;再引用这个Jar。大家可以自行去官…

Java 扫描某包下所有类的注解并获得注解值

背景 &#xff1a; 需求 需要获取某个包下的所有的注解 并不是全部项目的 所以 只用针对某个包 进行扫描 获取注解 数据就行 百度了一圈 spring boot 没有自带的 获取注解集合的方法 在看 php 中 hyperf 框架 看到了 这个方法 就是因为 我需求是 php 和java 合体 微服务开发 …

从代码生成工具看技术手段升级

从代码生成工具看技术手段升级 过去现在在日常工作中&#xff0c;你会用到代码生成工具吗&#xff1f;最喜欢哪一种呢&#xff1f;你一般使用代码生成工具来做什么&#xff1f;面对尚处于“成长期”的代码生成工具&#xff0c;你有哪些期待和诉求呢&#xff1f; 过去 在过去的…