【Java网络编程01】网络原理初识

【Java网络编程01】网络原理初识

1. 网络通信基础概念

网络通信:网络互连的目的就是网络通信,即网络数据传输,再直白点而言就是不同主机的不同进程之间基于网络进行数据的传输交互。
那么,在组建的网络上有各种各样的主机,我们如何确定数据的传送方和接收方主机呢?这就需要用到IP地址了

1.1 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

127.*的IP地址用于本地环回测试,通常是127.0.0.1
本机环回主要用于本机到本机的网络通信(系统内部为了提升性能,不会走网络的方式进行传输)对于网络编程程序而言,常见的开发方式都是本机到本机的网络通信

IP地址解决了在网络通信过程中标识源主机和目的主机的问题,但是我们如何确定数据是由源主机上的哪个进程发出的以及由目的主机上哪个进程进行接收呢?这就要用到我们 端口号 的概念了

1.2 端口号

端口号:IP地址用于定位网络上的主机,而端口号用于定位主机上特定的进程。例如在收发快递的过程中,不仅需要有收件人的收货地址(IP地址),也需要有收货人联系方式(端口号)
格式:端口号是一个0-65535范围的数字,在网络通信中,进程可以通过绑定一个端口号进行数据的传输
新的问题
现在我们已经可以根据IP地址和端口号确定网络数据收发双方了,但是网络通信依靠二进制数据进行传输,传输的内容可以是文本、视频、音频等等不同类型,因此收发双方必须使用一致的数据格式和编解码方式,于是就引出了 **协议 **的概念。

1.3 协议

协议:是网络协议的简称,协议就是网络通信过程中全部的网络设备都需要遵守的一组规定,例如如何建立连接、如何识别对方。只有遵守这个约定,计算机之间才能互相通信交流,协议通常由以下三部分构成:

  1. 语法:即数据与控制信息的结构与格式
  2. 语义:需要发出哪种控制信息,完成何种动作以及做出何种响应?
  3. 时序:事件实现顺序的详细说明

协议(protocol)最终体现为在网络上传输的 数据包格式
作用:
image.png
计算机设备之间的传输媒介通常是光/电信号,使用光的频率和高低电平来表示0/1信号,要想传递信息,就需要统一通信双方使用的数据格式

  • 计算机制造厂商有很多
  • 计算机的操作系统也有很多
  • 计算机网络设备也有很多
  • 如何让不同厂商制造出的不同操作系统的计算机之间可以互相正常通信?,这就需要有人站出来制定一个统一的标准,这就是协议

知名协议默认端口号
系统端口号为0-65535,其中:0-1023为知名端口号,这些端口号被预留给服务器程序用于绑定特定的应用层协议,如:

  • 21端口号:预留给SSH服务器绑定SSH协议
  • 22端口号:预留给FTP服务器绑定FTP协议
  • 23端口号:预留给Telnet服务器绑定Telnet协议
  • 80端口号:预留给HTTP服务器绑定HTTP协议
  • 443端口号:预留给HTTPS服务器绑定HTTPS协议

1.4 五元组

在TCP/IP协议中,使用五元组来标识一个网络通信

  1. 源IP:标识源主机
  2. 源端口号:标识源主机上发送数据的进程
  3. 目的IP:标识目标主机
  4. 目的端口号:标识目的主机中接收数据的进程
  5. 协议号:标识发送进程与接收进程之间的数据格式

在Windows中我们可以打开cmd输入命令netstat -ano查看五元组信息:
image.png

1.5 协议分层

协议分层:对于网络协议来说,往往分成几个层次来定义
分层的作用:网络通信过程中所涉及到的细节是非常多的,如果只用一个协议来描述,那么这个协议就会变的十分复杂,需要确定好方方面面的内容,因此设计分层的概念是十分有必要的!
分层最大的好处:提供面向接口编程的实现,定义好相邻两层之间的接口规范,实现方将接口功能实现,而调用方只需要调用接口使用提供的服务。

  • 对于提供方而言,利用封装思想,隐藏内部实现细节,只开放提供的服务即可
  • 对于使用方而言,无需关心提供方如何实现,只需要调用接口使用提供的服务即可
  • 某一层的协议被替换后,对于其他层无影响(无痛替换)

image.png
两套协议标准
最常见的协议分层体系模型有两种,一种是OSI七层模型,另一种是TCP/IP五层(或四层)模型

  • OSI七层体系模型:由物理层、数据链路层、网络层、传输层、会话层、表示层、应用层,但是这种方案过于复杂,因此没有落地实现,只是"理想中的方案"

  • TCP/IP五层协议:

    名称作用代表协议
    应用层负责应用程序间的沟通SMTP、FTP、HTTP等协议
    传输层负责两台主机之间的数据传输TCP、UDP等协议
    网络层负责地址管理和路由选择IP、ARP、ICMP协议
    数据链路层负责设备间数据帧的传送和识别网卡层
    物理层负责光/电信号的传输硬件层

网络设备所在分层

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

注意:这只是传统意义上的交换机和路由器,事实上随着网络设备技术的发展,也出现了很多3层、4层交换机,4层路由器。

1.6 封装和分用

封装和分用是网络传输数据过程中,最核心的流程
我们通过使用QQ传送一个"hello"消息为例讲解网络传输的过程,并体会TCP/IP五层协议各自的工作流程
封装流程

  1. 应用层(应用程序)

    接收方QQ客户端从消息输入框中获取到用户输入的"hello",然后就会把这个字符串封装构造成一个应用层的数据包,我们可以理解为QQ的程序内部内置了一个应用层协议,应用层数据包就是根据这个协议而封装成的,我们假设此应用层协议为:发送方QQ号;接收方QQ号;发送时间;消息正文
    image.png
    此时应用程序就会调用操作系统提供API,把这个数据包交给传输层

  2. 传输层

    传输层会把上述应用层数据包作为一个整体,然后依据选用的传输层协议,封装成传输层数据包,这里我们假设使用UDP协议,就会在整个应用层数据包前拼接UDP报头成UDP数据包。
    image.png
    其中应用层数据包以一个整体作为UDP数据报的载荷部分,封装为传输层数据包后就要进一步调用网络层提供的API,将数据包交给网络层进行处理

  3. 网络层

    网络层最核心的协议就是IP协议,会把传输层数据包进一步封装成IP数据包,具体做法是将传输层数据包作为一个整体为载荷部分,前部拼接一个IP协议报头。

    image.png
    封装成IP数据包后调用下层数据链路层提供API,并将IP数据包交给数据链路层进行处理。

  4. 数据链路层

    数据链路层涉及到的核心协议就是以太网了,会把上层的IP数据包当作整体为载荷部分,并在前头添加以太网帧头,尾部添加以太网帧尾,封装成以太网帧
    image.png
    然后调用下层物理层提供的API,将以太网数据帧交给物理层

  5. 物理层

    将上述这样的以太网数据帧,二进制结构(0101数据串)转换成光信号/电信号/电磁波信号然后进行发送

以上的这些层层封装数据包的过程就成为 **封装 **,而封装的逆过程就被称为 **分用 **
我们暂且不考虑中间过程,假定数据包已经传送到了接收方B的网卡,B如何处理的过程就是分用的过程。
分用流程

  1. B的物理层将接收到的光/电/电磁波信号转化为数字信号(0101二进制串),得到一个以太网帧,进一步把这个以太网帧交给数据链路层处理。

  2. 数据链路层会按照协议,使用相同的以太网帧格式解析,去掉以太网帧头和以太网帧尾,取出其中载荷部分交给上层网络层

  3. 网络层会按照IP协议进行解析,去掉IP首部,取出其中载荷部分再交给上层传输层

  4. 传输层根据指定的UDP协议进行解析,去掉UDP报头首部,取出其中载荷部分再交给上层应用层

  5. 应用层中的QQ应用程序就会按照QQ内部应用层协议进行解析数据,QQ程序拿到相关信息后就会在窗口弹出提示,并把消息内容、发送人、发送时间都显示在屏幕上。

1.7 其他概念

再来谈谈网络编程中的其他重要概念
客户端VS服务器端
客户端:在网络通信过程中主动发起请求的一方,称为"客户端"
服务器端:在网络通信过程中被动接受请求的一方,称为"服务器端"

需要注意一个程序在不同的场景中,可能是客户端,也可能是服务器端,例如在如下分布式系统中,客户端请求入口服务器,此时入口服务器是接收请求方,是服务器端(Server),但是入口服务器如果需要负载均衡,则需要请求分布式服务器A和B,此时入口服务器又作为了客户端(Client)

image.png
请求VS响应:
客户端发送给服务器端的就是请求(Request)
服务器端返回给客户端的就是响应(Response)
客户端与服务器端交互有很多种模式:

  1. “一问一答型”:一个请求对应一个响应,这是最常见的,在网站开发中(Web开发)中经常使用
  2. “一问多答型”:一个请求对应多个响应,主要应用于"下载"场景中
  3. “多问一答型”:多个请求对应一个响应,主要应用于"上传"场景中
  4. “多问多答型”:多个请求对应多个响应,主要应用于"远程桌面控制"场景中

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Conda】超详细的linux-conda环境安装教程

背景 最近被python各个版本环境整的头晕目眩,本来就不是专长做python的,切换各种版本着实不好操作,因此想到了conda这个好工具,以下是对conda的相关理解和搭建的详细过程,做个记录。 Conda简介 Conda是在Windows、m…

3.Eureka注册中心

3.Eureka注册中心 假如我们的服务提供者user-service部署了多个实例,如图: 大家思考几个问题: order-service在发起远程调用的时候,该如何得知user-service实例的ip地址和端口?有多个user-service实例地址&#xff0…

Redis - redis.windows.conf配置文件及RDB和AOF数据持久化方案

Redis - redis.windows.conf配置文件及RDB和AOF数据持久化方案 Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。 Redis支持两种方式的持久化…

Vue 的 事件修饰符and按键修饰符

1、事件修饰符概览 修饰符说明 .prevent阻止默认事件 .stop阻止冒泡.once事件只触发一次 .capture 添加事件侦听器时使用事件捕获模式.self只有点击当前元素本身时才会触发回调.passive事件的默认行为立即执行,无需等待事件回调执行完毕(不常用).native 将vue组件…

【单例模式】保证线程安全实现单例模式

📄前言:本文是对经典设计模式之一——单例模式的介绍并讨论单例模式的具体实现方法。 文章目录 一. 什么是单例模式二. 实现单例模式1. 饿汉式2. 懒汉式2.1 懒汉式实现单例模式的优化(一)2.2 懒汉式实现单例模式的优化&#xff08…

蓝桥杯官网填空题(01串的熵)

问题描述 答案提交 这是一道结果填空的题, 你只需要算出结果后提交即可。本题的结果为一 个整数, 在提交答案时只填写这个整数, 填写多余的内容将无法得分。 import java.util.*;public class Main {public static void main(String[] args) {for(double zero1;zero<2333…

开始学习vue2(Vue方法)

一、过滤器 过滤器&#xff08;Filters&#xff09;是 vue 为开发者提供的功能&#xff0c;常用于文本的格式 化。过滤器可以用在两个地方&#xff1a;插值表达式 和 v-bind 属性绑定。 过滤器应该被添加在 JavaScript 表达式的尾部&#xff0c;由“管道符 ”进行 调用&#…

【Linux】常见指令(二)

前言 常见指令第二部分。 文章目录 一、指令&#xff08;下&#xff09;重定向>&#xff1a;输出重定向>>&#xff1a;追加输出<&#xff1a;输入重定向 10. more—显示文本文件内容11.less—逐屏浏览文本文件内容12. head13. tail管道 |14. date—时间指令在这里插…

5个程序员可以接私活的平台和一些建议

22年之前我从没有接触过程序员外包接单&#xff0c;也没有任何的私活接单经验&#xff0c;就纯纯看自己瞎摸索&#xff0c;通过Google搜索&#xff0c;在各类程序员私活接单平台上摸爬滚打&#xff0c;硬是杀出一条血路&#xff0c;从一开始的年入3k到现在每月稳定收入1w&#…

STL第四讲

第四讲 万用Hash Function 左侧的是设计为类并重载调用运算符&#xff0c;右侧是一般函数的形势&#xff1b; 但是右侧形势在创建容器时更麻烦&#xff1b; 具体例子&#xff1a; 第三种形势&#xff1a;struct hash 偏特化形式 tuple 自C03引入&#xff1b; 关于源码解读的…

Xcode 15 libarclite 缺失问题

升级到Xcode 15运行项目报错&#xff0c;报错信息如下&#xff1a; SDK does not contain libarclite at the path /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator.a; try increasing the minimum d…

2024年学鸿蒙开发有前途吗?

随着科技的不断发展和智能设备的普及&#xff0c;鸿蒙系统作为华为自主研发的操作系统&#xff0c;正逐渐受到市场的关注。2024年&#xff0c;学鸿蒙开发是否有前途&#xff0c;成为了很多开发者和学生关心的问题。本文将从多个角度分析鸿蒙系统的发展前景&#xff0c;以及学习…

elment-plus如何引入scss文件实现自定义主题色

elment-plus如何引入scss文件实现自定义主题色&#xff01;如果您想修改elementPlus的默认主题色调&#xff0c;使用自定义的色调&#xff0c;可以考虑使用官方提供的解决办法。 第一步你需要在项目内安装sass插件包。 npm i sass -D 如图&#xff0c;安装完成后&#xff0c;你…

Redisson 分布式锁解决主从一致性问题的原理

目录 一、主从不一致产生原因 二、Redisson 解决主从一致性的原理 一、主从不一致产生原因 1. Redis 主从集群&#xff1a;主从读写分离&#xff0c;主节点将数据同步给从节点 主节点&#xff1a;增删改从节点&#xff1a;读 2. 主从同步存在延迟&#xff0c;若主节点宕机…

Borze(与连续元素有关的题目)

总结&#xff1a;碰到与连续元素有关的题目&#xff0c;可以考虑在某种条件下加i&#xff1b;之类的。

valgrind使用

文章目录 简介安装如何使用valgrind来检测内存错误&#xff1f;如何使用其它的工具&#xff1f;总结 简介 Valgrind是一个工具集&#xff0c;包含了许多调试与性能分析的工具。其中使用最多的是Memcheck&#xff0c;它能帮你检测C/C中的内存问题&#xff0c;避免程序崩溃或不可…

JS之打地鼠案例

需要素材的同学可以私信我 效果图&#xff1a; 上代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8"><title></title><style>* {margin: 0;padding: 0;}.box {position: relative;width: 320px;heigh…

【Java程序员面试专栏 专业技能篇】MySQL核心面试指引(三):性能优化策略

关于MySQL部分的核心知识进行一网打尽,包括三部分:基础知识考察、核心机制策略、性能优化策略,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 本篇Blog为第三部分:性能优化策略,子节点表示追问或同级提问 读写分离 分布式数据库的…

【学网攻】 第(4)节 -- 交换机划分Vlan

文章目录 【学网攻】 第(1)节 -- 认识网络 【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口 前言 网络已经成为了我们生活中不可或缺的一部分&#xff0c;它连接了世界各地的人们&#xff0c;让信息和资源得以自由流动。随着互联网的发展&am…