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

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.然后客服端接受服务器返回的处理过的请求,自此完成交互

  • 32
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
网络编程基本概念和相关知识包括以下内容: 1. IP 地址:IP(Internet Protocol)地址是用于在网络上唯一标识设备的地址。IP 地址分为 IPv4 和 IPv6 两种格式,IPv4 地址由四个字节组成,而 IPv6 地址由八个字节组成,用于实现设备之间的通信。 2. 口号口号用于标识网络应用程序中的进程或服务,范围是从 0 到 65535。其中,0 到 1023 是被标准化的口号,用于常见的网络服务,如 HTTP(口号80)、FTP(口号21)等。 3. 套接字:套接字(Socket)是网络编程中的一种抽象概念,用于描述网络通信的一。套接字提供了一组方法和属性,用于建立、发送和接收数据。 4. TCP 和 UDP:TCP(Transmission Control Protocol)和 UDP(User Datagram Protocol)是两种常见的网络传输协议。TCP 提供可靠的、面向连接的通信,确保数据的有序性、完整性和可靠性;UDP 则是无连接的通信协议,适用于实时性要求较高的场景。 5. 客户服务器:在网络通信中,客户是发起连接请求的一方,服务器是接受请求并提供服务的一方。客户服务器之间通过套接字进行通信。 6. HTTP 和 HTTPS:HTTP(Hypertext Transfer Protocol)是一种用于传输超文本的协议,常用于 Web 应用程序中。HTTPS 是基于 HTTP 的安全传输协议,使用了 SSL/TLS 加密来保护数据的安全性。 7. 网络安全性:网络安全性涉及到数据传输的保密性、完整性和身份验证等问题。常见的网络安全技术包括加密算法、数字证书、防火墙、访问控制等。 以上是网络编程的一些基本概念和相关知识,了解这些内容可以帮助你理解和应用网络编程技术。在实际开发中,还需要深入学习和实践,以更好地应对各种网络通信需求和挑战。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值