网络编程..

1.互联网

有了互联网的出现 我们就可以足不出户的实现看电影、购物等等操作
我们认知中可能的互联网模型
在这里插入图片描述
较为真实的互联网模型
在这里插入图片描述
那么数据是如何从一个设备传递到另外一个设备的呢?

2.网络互联模型

统共有三种:
在这里插入图片描述

3.TCP/IP协议

在这里插入图片描述
TCP/IP是一群协议 里面不仅仅包括TCP和IP两种协议 还有其他很多的协议 这不过这两种协议是最早通过的协议 所以以他们的名字命名整个的协议家族

4.网络分层

由于我们现在是学习阶段 所以主要用的是学习研究的网络互联模型 那么该模型的具体分层是怎样的呢
在这里插入图片描述

5.HTTP请求过程

在这里插入图片描述
我们可以看到 http请求是经历了一系列的装箱、拆箱的过程 最后才传递给指定主机的
具体的过程 可以参考一下我讲的:
首先HTTP请求从应用层发送给运输层的话 那么运输层就会为其添加TCP首部
接着到达网络层的时候 该层会为其提供IP首部
接着到达数据链路层的时候 该层会为其提供首尾的mac地址
以此类推……
我们可能会有这些疑惑?
1.有人认为不需要经历那么多层才将数据发送到目标主机手中 这是错误的
首先运输层在提供了端口号 端口号用于识别同一台主机上的应用 如果同一台主机上存在多种应用的话 那么使用端口号就可以清楚的知道数据将发送给哪一个应用
还有网络层提供了ip信息 这样我们才能够知道数据最终发送的目标ip是什么
还有数据链路层提供了mac地址 这个mac地址就是用于标识网卡的 如果一台设备上存在多个网卡的话 那么我到底是发送给谁呢 只有清楚的知道mac地址 我才能够清楚的指导发送给哪一个网卡
2.那么为什么客户端、服务器端的层数那么多 而路由器的层数却那么少呢
这是因为路由器的作用就在于寻找接下来到目标主机的最短路径 而ip作为主机的标识 是由网络层提供的 我们只需要拆箱到网络层即可获取到ip信息 所以这就是为什么路由器不需要提供5层的原因

6.TCP vs UDP

在运输层中 有两种常见的协议 分别是TCP和UDP
这两种协议的不同点如下所示
在这里插入图片描述
TCP连接性体现在两台设备之间需要拥有一个管道进行连接 而UDP则不需要 这样的特点造就了TCP的每一个连接只能是一对一的通信 而UDP却可以进行一对多的通信
下图是TCP首部占用的空间大小明细
在这里插入图片描述
下图则是UDP首部占用的空间大小明细
在这里插入图片描述
对比之下 我们就可以发现 UDP的首部占用较小 TCP的首部占用较大
由于TCP是可靠传输 所以他的传输效率肯定是较慢 资源消耗肯定是较大
而且诸如浏览器、文件传输、邮件发送等都需要依赖TCP的可靠传输 因为TCP不丢包的缘故 所以可以保证接收到的文件、邮件等不会出现残缺

但是视频、直播这种需要实现实时互动的东西 一定使用的是UDP协议 不然的话 可能会产生诸如前几秒丢包的东西在当前展示 这就不是我们所希望的实时效果

7.TCP-三次握手-建立连接

TCP的三次握手和四次挥手都是为了建立或者释放连接 而UDP是不涉及连接的 所以UDP是不涉及建立连接和释放连接时的三次握手和四次挥手的
在这里插入图片描述
SYN = 1表示发送方想要建立连接 比如在第一次握手中表示客户端想要建立连接 第二次握手中表示服务器想要建立连接
ACK = 1表示接收方确认了发送方的连接请求 比如在第二次握手中表示服务器确认了客户端的连接请求 而第三次握手中则表示客户端确认了服务器的连接请求
seq = x是用于标志发送方发送的消息 即消息的序列号 有个特点就是发送方发送的消息是逐次递增1的(也不一定 因为连接建立以后 1的位置就要替换成所发送数据的字节数)
ack = x + 1表示接收方下一次想要接收的序列号(但是ack值中不一定是+1 在建立连接的过程中 由于没有发送数据 所以+1 在连接建立以后 就真正开始发送数据了 所以建立连接以后+1位置就要替换成所发送的数据占用的字节数 但是有一点是没变的 就是他一定是下一条希望接收到的消息的序列号)
同步表示连接请求的意思
整体的意思就是:
第一次握手中 客户端发送了一条消息给服务器 消息中 SYN = 1表示客户端想要建立连接 seq = x表示这条消息的序列号
第二次握手中 服务器发送了消息给客户端 消息中 SYN = 1表示服务器也想要建立连接 ACK = 1表示服务器确认了客户端的连接请求 seq = y表示这条消息的序列号 ack = x + 1表示服务器下一次希望接收到的客户端的消息的序列号
第三次握手中 客户端发送了消息给服务器 消息中 ACK = 1表示客户端确认了服务器的连接请求 seq = x + 1表示该条消息的序列号 ack = y + 1表示客户端下一次希望接收到的服务器的消息的序列号

8.TCP-四次挥手-释放连接

在这里插入图片描述
FIN = 1表示发送方想要关闭连接
ACK = 1表示接收方确认了发送方的关闭连接请求
seq = u标志了发送方所发送的消息 即消息的序列号 并且是逐条递增的 递增的量取决于你处于哪一个阶段 如果你处于建立或者关闭连接的阶段 那么递增量为1 如果你处于连接已建立后的阶段 那么递增量为接收方所接受的数据所占用的字节数
ack = v表示接收方下一次希望接收到的发送方发送的消息的序列号
第一次挥手中 客户端向服务器发送了一条消息 消息中 FIN = 1表示客户端想要关闭连接 ACK = 1表示客户端确认了服务器的消息 seq = u标志了这条消息 ack = v表示客户端下一次希望接收的服务器的消息的序列号
第二次挥手中 服务器向客户端发送了一条消息 消息中 ACK = 1表示服务器确认了客户端的关闭连接请求 seq = v标志了这条消息 ack = u + 1表示服务器下一次希望接收到的客户端的消息的序列号
第三次挥手中 客户端向服务器发送了一条消息 消息中 FIN = 1表示服务器希望关闭连接 ACK = 1也表示服务器确认了客户端发送的关闭连接请求 seq = w标志了这条消息 ack = u + 1表示服务器下一次希望收到的客户端的消息的序列号
第四次挥手中 客户端向服务器发送了一条消息 消息中 ACK = 1表示客户端确认了服务器的关闭连接请求 seq = u + 1标志了这条消息 ack = w + 1表示客户端下一次希望收到的服务器的消息的序列号

9.HTTP补充

平时如果想要访问域名的话 比如www.baidu.com 那么你首先得知道相关的ip地址 那如何获取指定域名的关联ip地址呢 就是从dns服务器手中获取 一台主机会关联多个dns服务器 如果你询问的这台服务器不知道的话 那么他就会在dns服务器中进行询问 直到知道为止 而且这次知道了就会对这个ip地址进行缓存

10.Socket编程

1.用代码模拟三次握手

注意:要先运行服务器 在运行客户端 不然的话 会报ConnectExcpetion 因为你只有先让服务器处于监听状态 监听客户端发送过来的连接请求才是正确的
编写服务器代码的流程:
首先设置一个ServerSocket 用于开启服务器的监听状态
接着设置一个Socket 用于服务器和客户端之间建立连接 一般创建了之后就会建立连接 如果没有收到连接请求的话 那么就会陷入阻塞状态
接着定义了一个ByteArrayOutputStream 用于进行字节输出的 然后他最后会将数据储存到缓存区中
接着定义了一个字节输入流(需要通过socket获取 因为这样才能够知道读取的对象是谁 socket对象显然是有关于客户端的) 用于读取客户端发送过来的数据
并且用一个数组进行装载
然后调用ByteArrayOutputStream的toByteArray 将缓存区中的数据储存到字节数组中
接着我们可以通过Socket对象获取到发送方客户端的ip以及发送的数据
最后需要关闭所定义的资源(资源就是实现了AutoCloseable接口的类)
编写客户端代码的流程:
首先定义一个Socket 并且需要指定接收方服务器的端口以及ip地址
接着我们需要发送数据给接收方 期间需要定义一个字节输出流(需要通过socket获取 这个socket显然是有关于服务器的)
发送数据以后 需要关闭之前定义的资源

public class TCPServer {public static void main(String[] args) throws IOException {// 定义一个服务器相关的Socket对象 指定服务器的端口号 服务器的ip默认就是所在主机的ip 并且让服务器处于监听状态ServerSocket serverSocket = new ServerSocket(222);// 然后通过以上的服务器Socket对象获取Socket对象 起到一个阻塞状态 如果没有接收到连接请求的话 那么就会一直处于阻塞状态 一旦接收到了连接请求的话 那么就会解除阻塞状态 并且建立服务器和客户端之间的连接Socket socket = serverSocket.accept();// 我们指定一下输出的载体为数组 也就是定义一个字节数组输出流ByteArrayOutputStream baos = new ByteArrayOutputStream();// 然后定义一个字节输入流InputStream is = socket.getInputStream();// 需要定义一个字节数组作为输入的载体byte[] buffer = new byte[8192];int len = 0;// 用于统计有效的输入字节数while((len = is.read(buffer)) != -1) {baos.write(buffer, 0, len);}// 然后我们需要将通过baos输出到服务器缓存中的数据移动到数组中byte[] bytes = baos.toByteArray();String string = new String(bytes, "UTF-8");System.out.format("服务器接收到了来自%s的数据:%s%n", socket.getInetAddress(), string);serverSocket.close();socket.close();baos.close();is.close();}
}
public class TCPClient {public static void main(String[] args) throws UnknownHostException, IOException {// 定义一个Socket对象 并且指定接收方服务器的ip地址以及端口号Socket socket = new Socket("127.0.0.1", 222);// 接着创建一个字节输出流 用于向指定服务器进行字节的输出String string = "哈哈哈";OutputStream os = socket.getOutputStream();// 通过socket对象获取字节输出流 意图是在向指定socket对象进行输出操作os.write(string.getBytes("UTF-8"));// 由于Socket和OutputStream都实现了AutoCloseable接口 所以都属于资源 所以需要关闭 这边我们就进行手动关闭操作了socket.close();os.close();}
}

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

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

相关文章

【Linux笔记】动静态库的封装和加载

一、静态库的封装 我们在学习C语言阶段其实就已经知道一个可执行程序的形成过程分为预处理、编译、汇编、链接这四个阶段,而且也知道我们程序中使用的各种库其实是在链接的阶段加载的。 可我们那时候并不知道库是怎么被加载的,或者库是怎么形成的&…

《PCI Express体系结构导读》随记 —— 第II篇 第4章 PCIe总线概述(12)

接前一篇文章:《PCI Express体系结构导读》随记 —— 第II篇 第4章 PCIe总线概述(11) 4.2 PCIe体系结构的组成部件 PCIe总线作为处理器系统的局部总线,其作用与PCI总线类似,主要目的是为了连接处理器系统中的外部设备…

CNN应用Keras Tuner寻找最佳Hidden Layers层数和神经元数量

介绍: Keras Tuner是一种用于优化Keras模型超参数的开源Python库。它允许您通过自动化搜索算法来寻找最佳的超参数组合,以提高模型的性能。Keras Tuner提供了一系列内置的超参数搜索算法,如随机搜索、网格搜索、贝叶斯优化等。它还支持自定义…

.NET高级面试指南专题六【线程安全】5种方法解决线程安全问题

前言 多线程编程相对于单线程会出现一个特有的问题,就是线程安全的问题。所谓的线程安全,就是如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且…

备战蓝桥杯---动态规划(基础1)

先看几道比较简单的题&#xff1a; 直接f[i][j]f[i-1][j]f[i][j-1]即可&#xff08;注意有马的地方赋值为0&#xff09; 下面是递推循环方式实现的AC代码&#xff1a; #include<bits/stdc.h> using namespace std; #define int long long int a[30][30]; int n,m,x,y; …

机器学习---学习与推断,近似推断、话题模型

1. 学习与推断 基于概率图模型定义的分布&#xff0c;能对目标变量的边际分布&#xff08;marginal distribution&#xff09;或某些可观测变量 为条件的条件分布进行推断。对概率图模型&#xff0c;还需确定具体分布的参数&#xff0c;称为参数估计或学习问 题&#xff0c;…

AcWing 1224 交换瓶子(简单图论)

[题目概述] 有 N 个瓶子&#xff0c;编号 1∼N&#xff0c;放在架子上。 比如有 5 个瓶子&#xff1a; 2 1 3 5 4 要求每次拿起 2 个瓶子&#xff0c;交换它们的位置。 经过若干次后&#xff0c;使得瓶子的序号为&#xff1a; 1 2 3 4 5 对于这么简单的情况&#xff0c;显然&a…

第5章 数据库操作

学习目标 了解数据库&#xff0c;能够说出数据库的概念、特点和分类 熟悉Flask-SQLAlchemy的安装&#xff0c;能够在Flask程序中独立安装扩展包Flask-SQLAlchemy 掌握数据库的连接方式&#xff0c;能够通过设置配置项SQLALCHEMY_DATABASE_URI的方式连接数据库 掌握模型的定义…

Kafka集群安装与部署

集群规划 准备工作 安装 安装包下载&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1BtSiaf1ptLKdJiA36CyxJg?pwd6666 Kafka安装与配置 1、上传并解压安装包 tar -zxvf kafka_2.12-3.3.1.tgz -C /opt/moudle/2、修改解压后的文件名称 mv kafka_2.12-3.3.1/ kafka…

【C++】引用与内联

个人主页 &#xff1a; zxctsclrjjjcph 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 文章目录 1. 前言2. 引用2.1 引用概念2.2 引用使用场景2.3 引用特性2.4 引用和指针的区别2.5 传值、传引用效率比较2.5.1 值和引用的作为返回值类型的性能比较 3. 内联函数3.1 …

Ansible copy模块 复制文件使用 主服务器 给副服务器 复制文件使用 指定文件权限 覆盖备份等

目录 参数复制文件然后进行同时复制操作 给定内容生成文件&#xff0c;并制定权限验证 关于覆盖先查看当前内容覆盖并备份查看文件权限 还有有没有备份查看文件内容 参数 这个模块用于将文件复制到远程主机&#xff0c;同时支持给定内容生成文件和修改权限等。   其相关选项…

【iOS分类、关联对象】如何使用关联对象给分类实现一个weak的属性

如何使用关联对象给分类实现一个weak的属性 通过关联对象objc_setAssociatedObject中的策略policy可知&#xff0c;并不支持使用weak修饰对象属性&#xff1a; typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) {OBJC_ASSOCIATION_ASSIGN 0, //assignOBJC_ASSOCIATION…

Android:Volley框架使用

3.15 Volley框架使用 Volley框架主要作为网络请求,图片加载工具。当应用数据量小、网络请求频繁,可以使用Volley框架。 框架Github地址:https://github.com/google/volley Volley框架的简单使用,创建项目Pro_VolleyDemo。将Github上下载Volley框架源代码,volley-master.zi…

Linux中ps/kill/execl的使用

ps命令&#xff1a; ps -aus或者ps -ajx或者 ps -ef可以查看有哪些进程。加上 | grep "xxx" 可以查看名为”xxx"的进程。 ps -aus | grep "xxx" kill命令&#xff1a; kill -9 pid 杀死某个进程 kill -l 查看系统有哪些信号 execl函数&#…

JavaScript滚动事件

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 滚动是网页交互不可或缺的一部分。监听页面和元素的滚动事件,可以帮助…

跟着cherno手搓游戏引擎【22】CameraController、Resize

前置&#xff1a; YOTO.h: #pragma once//用于YOTO APP#include "YOTO/Application.h" #include"YOTO/Layer.h" #include "YOTO/Log.h"#include"YOTO/Core/Timestep.h"#include"YOTO/Input.h" #include"YOTO/KeyCod…

力扣刷题之旅:进阶篇(五)—— 动态规划(DP)的妙用

力扣&#xff08;LeetCode&#xff09;是一个在线编程平台&#xff0c;主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目&#xff0c;以及它们的解题代码。 --点击进入刷题地址 引言&#xff1a; 在算法的世界中&#xff0c;动态规划&#xff…

[HTTP协议]应用层的HTTP 协议介绍

目录 1.前言 2.使用fiddler抓包来观察HTTP协议格式 3.HTTP协议的基本格式 2.1请求 2,1.1首行 2.1.2请求头 2.1.3空行 2.2响应 2.2.1首行 2.2.2响应头 键值对 ​编辑2.2.3空行 2.2.4载荷(响应正文) 3.认识URL 3.1关于URL encode 1.前言 我们在前面的博客中,简单的…

力扣231. 2 的幂(数学,二分查找,位运算)

Problem: 231. 2 的幂 文章目录 题目描述思路即解法复杂度Code 题目描述 思路即解法 思路1&#xff1a;位运算 1.易验证2的幂为正数&#xff1b; 2.易得2的幂用二进制表示只能有一个位为数字1 3.即将其转换为二进制统计其二进制1的个数 思路2&#xff1a;数学 当给定数n大于1时…

DNS 域名系统——应用层

目录 1 域名系统 DNS 1.1 域名系统 1.2 互联网的域名结构 1.2.1 顶级域名 TLD(Top Level Domain) (1) 国家顶级域名 nTLD (2) 通用顶级域名 gTLD (3) 基础结构域名 (infrastructure domain) 1.3 域名服务器 1.3.1 域名服务器的四种类型 &#xff08;1…