网络通信.

news2025/4/6 22:24:39

1.物理层:网络通信的基础设施 运快递的公路

2.数据链路层 两个相邻的节点之间如何传输 两个集散点之间的传输

3.网络层 两个点之间的路径规划 物流公司规划快递的路径

4.传输层 两个点之间的通信(不考虑路径规划) 卖家发货 只考虑起点和终点

5.应用层 数据传输过去之后 具体如何使用 快递拿到之后如何使用

网络编程的主要工作 写应用层的代码 处理应用层的协议数据

从5到1往下传输 每次传输都会依次添加报头 就称为封装 QQ1发送

从1到5往上传输 每次传输都会解析去掉报头 QQ2接收

传输层提供两种协议

TCP:有连接,可靠传输,面向字节流,全双工

UDP:无连接,不可靠传输,面向数据报,半双工

可靠传输:数据对方有没有接收到,发送方有感知 打电话就是可靠的,可以知道对方有没有听到

不可靠传输:数据对方有没有接收到,不管,也不知道 微信就是不可靠的,不知道对方有没有看到我的消息

全双工:双向通信 一个管道 A->B B->A 同时进行

半双工:单向通信 一个管道 要么A->B 要么B->A 不能同时进行

UDP

UDP的Socket API

DatagramSocket和DatagramPaclet 核心类

socket类本质相当于文件 构造一个DatagramSock对象,相当于打开了一个内核中的socket文件

打开后就可以传输数据了

传输数据已 DatagramPacket为基本单位

InetSocketAddress类 IP地址+端口号

send发送数据 receive接收数据 close关闭数据

DatagramOacket 表示一个UDP数据报 UDP是面向数据报的协议

DatagramSocket

send、receive、close

DatagramOacket

DatagramSocket:对应一个socket文件

DatagramPacket:对应一个UDP数据报构造方法

1.只包含缓冲区 用于接收数据的时候,构造了一个空的数据报

2.包含缓冲区和一个InetAddress(客户端IP和端口号)

3.包含缓存区和服务器IP和服务器端口号

程序要进行网络通信,需要一个端口号

端口号相当于用来在网络上区分进行的身份标识符

分配端口号有 1.手动指定 2.系统自动分配

TCP

TCP两个核心类

ServerSocket 服务器使用socket

accept没有参数 返回值是一个Socket对象

功能是等待服务器和客户端建立连接,建立成功后则会把这个连接获取到进程中。接下来就通过Scoket返回的对象来进行交互

Scoket服务器和客户端都使用socket

通过socket对象就可以进行发送接收数据

socket内部包含了输入流对象(接收) 输出流对象 (发送)

ServerSocket只是在服务器这把使用,连接

accpet把操作系统内核建立好的连接拿到应用程序中

Socket:客户端和服务器都要使用,负责给这个客人提供服务

Socket对象中能获取到InputStream(接收)和OutputStream(发送)

服务器客户端工作流程

1.客户端读取用户输入

2.构造请求发送给服务器

3.读取请求并解析

4.根据请求计算响应

5.把响应数据返回客户端

6.读取服务器返回的响应

7.把响应数据展示给用户

应用层协议 自定义协议

DNS协议 域名解析 域名网址

sougou.com就是搜狗的域名

域名可以通过DNS系统自动转换成对应的IP地址

当电脑能使用qq,但打不开网页,多半是DNS挂了

8,8,8,8

114,114,114,114

明确传递的信息 数据的组织格式

分隔符

固定长度

xnm

json

protibuffer

传输层协议

UDP

UDP报头包含 源端口号、目的端口号、DUP长度、校验和均是2字节

UDP载荷 完整的应用层数据报

UDP长度是64kb 所以UDP一次只能传64kb的数据 缺陷

TCP

有连接 可靠传输 面向字节流 全双工

TCP机制

确认应答 延时重传 连接管理 滑动窗口 流量控制 拥塞控制 延时应答 捎带应答

前三个是保证了TCP的可靠性

滑动窗口提高传输效率的机制 本质就是把等待ACK的时间重叠 减少等待时间

但是和无可靠性的UDP相比,效率还是要差些。

TCP面向字节流

面向字节流指的是读写载荷数据的时候,是按照字节流方式读取的。

TCP本身仍然是一个一个数据报方式传输的

面向字节流核心问题是粘包问题

如何一个TCP连接里面只传一个应用数据报,不会发送粘包

如果一个TCP连接里,传输多个应用层数据报,这时候容易区分不清,哪个是整体的应用层数据,就会发生粘包问题

解决粘包问题就是在应用层明确包的边界

使用分隔符或约定长度等等。就是自定义协议

高频题

操作系统 进程和线程的区别

网络 TCP的三次握手和四次挥手

数据结构 哈希表

三次握手

A发送SYN

B发送SYN和ACK

客户端发送ACK

客户端发送 尝试建立连接的请求 syn,同步报文段

服务段发送 syn同步报文段和ack,确认报文段

客户端发送 ack

三次握手的意义在于保证可靠性的机制

在正式通信前,先确定好通信链路是否畅通,如果不畅通后续大概率丢包

为啥要握三次

握手三次是在验证通信双方的发送能力和接收能力是否正常

三次握手B返回ACK和SYN都是内核收到A的SYN立即返回的

协商重要参数

四次挥手

A发送FIN

B发送ACK

B发送FIN

A发送ACK

B发送ACK和FIN之间会有不知道的时间间隔。

B是代码人员调用close菜发送FIN

TCP状态

1.LISTEN服务器状态

服务器启动完毕,绑定端口成功(手机开机状态,随时可以接听电话)

2.ESTABLISHED

连接建立好了,可以进行后续通信。(电话号码接通,对方已接听)接下来可以进行说话了

3.CLOSE_WAIT

等待代码中调用close方法,发送FIN

4.TIME_WAIT

主动发起FIN的一方,会进入TIME_WAIT

主动一方收到FIN后,返回ACK进入TIME_WAIT

防止最后一个ACK丢失,当接受端返回ack等待一段时间后,发起端才断开连接

TCP和UDP区别

如何需要关注可靠性优先考虑TCP

如果传输单个数据报比较大 优先考虑TCP UDP上限是64kb

如果可靠性要求不高,但性能要求高 优先考虑UDP

如果需要广播 一个放松N个接收 如直播就优先考虑UDP

从浏览器中输入URL开始,最终看到网页,中间都发生了什么?

浏览器是客户端,输入URL就会访问对应的服务器

1.应用层角度:1.DNS解析 2.构造HTTP请求

2.传输层角度:TCP协议 1.三次握手建立连接 2.传输数据(确定应答,超时重传,滑动窗口,流量控制,拥塞控制)

3.网络层角度:网络数据报转发过程.一跳一跳的方式来转发(路由表匹配规则,下一跳相关内容)

4.数据链路层角度:以太网数据帧,mc地址,mac在转发过程中如何变化,MTU,MTU影响到的IP分包

5.物理层角度:上诉数据会转成“光信号”“电信号”进行编码,传输

6.总结:发送过程中,涉及到从上到下,封装,接收方,涉及到从下到上的分用。

客户端给服务器发送请求的过程

后面服务器根据请求计算响应,把响应按照类似的流程转发给客户端

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

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

相关文章

C++ 特殊类及单例模式

文章目录 1. 前言2. 不能被拷贝的类3. 不能被继承的类4. 只能在堆上创建对象的类5. 只能在栈上创建对象的类6. 只能创建一个对象的类(单例模式) 1. 前言 在实际场景中,我们在编写类的过程中总会遇到一些特殊情况,比如设计一个类不…

【Godot4.0】自定义A*寻路拓展类TileMapAStar2D及其使用

概述 Godot提供的AStar2D和AStarGrid2D基本可以解决所有2D的A*寻路问题: 前者提供了基础的A*寻路支持,但是需要手动处理很多内容后者针对基于方形图块的A*寻路,进行了很多自动化的工作,用起来十分简便。但是不使用于六边形、iso…

C++for语句(2)

11.乘方计算 给出一个整数a和一个正整数n&#xff08;-1000000<a<1000000,1<n<100000&#xff09;&#xff0c;求乘方&#xff0c;即乘方的结果。最终结果的绝对值不超过1000000。 输入 一行&#xff0c;包含两个整数a和n&#xff08;-1000000<a<1000000,1…

网站安全监测:守护网络空间的坚实防线

随着互联网技术的飞速发展和广泛应用&#xff0c;网站已成为企业、机构和个人展示形象、提供服务、传递信息的重要平台。然而&#xff0c;与此同时&#xff0c;网站也面临着日益严重的安全威胁。黑客攻击、数据泄露、恶意软件等安全问题频发&#xff0c;给网站运营者带来了巨大…

redis发布订阅与stream类型

发布订阅 redis发布订阅(pub/sub)是一种消息通信模式&#xff1b;发送者(pub)发送消息&#xff0c;订阅者(sub)接收消息。redis客户端可以订阅任意数量的频道。 基础命令&#xff1a; 语法 redis publish命令基本语法如下&#xff1a; redis 127.0.0.1:6379> PUBLISH ch…

若你有才能,最好能遇上识才之人,高俅发迹的故事很好诠释了千里马与伯乐的关系

若你有才能&#xff0c;最好能遇上识才之人&#xff0c;高俅发迹的故事很好诠释了千里马与伯乐的关系 其实&#xff0c;“千里马”和“伯乐”都是中国古代传说里的角色。伯乐是古代一个善于相马&#xff08;识别马的好坏&#xff09;的人&#xff0c;而“千里马”则是指一匹能跑…

解决:由于找不到xinput1_3.dll,无法继续执行代码问题的方法

xinput1_3.dll文件的丢失是一个常见的问题&#xff0c;它会导致一些游戏应用程序无法正常运行或出现错误。为了解决这个问题&#xff0c;我们可以采取多种方法。下面将介绍几种常用的xinput1_3.dll丢失的解决方法&#xff0c;通过采用合适的方法&#xff0c;我们可以轻松解决该…

跳绳计数,YOLOV8POSE

跳绳计数&#xff0c;YOLOV8POSE 通过计算腰部跟最初位置的上下波动&#xff0c;计算跳绳的次数

Redis数据结构对象之字符串对象

字符串对象 字符串对象的编码可以是int、raw或者embstr 如果一个字符串对象保存的是整数值&#xff0c;并且这个整数值可以用long类型来表示&#xff0c;那么字符串对象会将整数值保存在字符串对象结构的ptr属性里面(将void *转换成long)&#xff0c;并且将字符串对象的编码设…

zookeeper快速入门四:在java客户端中操作zookeeper

系列文章&#xff1a; zookeeper快速入门一&#xff1a;zookeeper安装与启动-CSDN博客 zookeeper快速入门二&#xff1a;zookeeper基本概念-CSDN博客 zookeeper快速入门三&#xff1a;zookeeper的基本操作 先启动zookeeper服务端。 在maven引入zookeeper依赖。 <depende…

代码算法训练营day10 | 232.用栈实现队列、225. 用队列实现栈

day10: 232.用栈实现队列225. 用队列实现栈 232.用栈实现队列 题目链接 状态&#xff1a; 文档&#xff1a;programmercarl.com 思路&#xff1a; 用栈实现队列。要先明白两者的区别。 栈&#xff1a;单开门&#xff0c;先进后出&#xff0c;只有一端能进出。 队列&#xff1a;…

【晴问算法】入门篇—贪心算法—区间不相交问题

题目描述 给定n个开区间&#xff0c;从中选择尽可能多的开区间&#xff0c;使得这些开区间两两没有交集。 输入描述 输出描述 输出一个整数&#xff0c;表示最多选择的开区间个数。 样例1输入 4 1 3 2 4 3 5 6 7 输出 3 解释 最多选择(1,3)、(3,5)、(6,7)三个区间&#xff0c;它…

从零到一构建短链接系统(三)

1.根据数据库表&#xff0c;利用在线网站https://jully.top/generator/ 根据数据库Info自动生成代码 2.在entity中创建UserDO Data TableName("t_user") public class UserDO { /** * id */ private Long id; /** * 用户名 */ private String username; /** * 密码…

图解Kafka架构学习笔记(一)

本文参考尚硅谷大数据技术之Kafka。 消息队列 &#xff08;1&#xff09;点对点模式&#xff08;一对一&#xff0c;消费者主动拉取数据&#xff0c;消息收到后消息清除&#xff09; 点对点模型通常是一个基于拉取或者轮询的消息传送模型&#xff0c;这种模型从队列中请求信息…

[嵌入式系统-40]:龙芯1B 开发学习套件 -10-PMON启动过程start.S详解

目录 一、龙芯向量表与启动程序的入口&#xff08;复位向量&#xff09; 1.1 复位向量&#xff1a; 1.2 代码执行流程 1.3 计算机的南桥 VS 北桥 二、PMON代码执行流程 三、Start.S详解 3.1 CPU初始化时所需要的宏定义 &#xff08;1&#xff09;与CPU相关的一些宏定义…

node.js快速入门-day03

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;给自己一个梦想&#xff0c;给世界一个惊喜。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章目录 web服务器创建…

brpc之ResourcePool

简介 ResourcePool用于管理资源&#xff0c;负责资源的分配以及回收 结构 BlockGroup&#xff1a;资源池中包含多个BlockGroup&#xff0c;最多65536个 Block&#xff1a;一个BlockGroup中包含多个Block&#xff0c;最多(1<<16)个&#xff1b;1个Block中包含BLOCK_NITE…

代码随想录算法训练营第二十二天 | 235. 二叉搜索树的最近公共祖先, 701.二叉搜索树中的插入操作, 450.删除二叉搜索树中的节点

这道题和寻找二叉树的最近祖先可以用同一套解法&#xff0c;也就是说&#xff0c;考虑当你站在一个节点上的时候&#xff0c;应该干啥&#xff1a;看当前节点是不是指定的孩子p&#xff0c;q&#xff0c;然后检查左子树有无指定节点&#xff0c;检查右子树有无指定节点&#xf…

HashMap底层是如何实现的?

1、典型回答 不同的JDK 版本&#xff0c;HashMap 的底层实现是不一样的&#xff0c;总体来说&#xff1a;在JDK 1.8 之前(不包含JDK 1.8)&#xff0c;HashMap 使用的是数组 链表实现的&#xff0c;而JDK 1.8之后(包含JDK 1.8)使用的是数组 链表或红黑树实现的 HashMap 在JD…

鸿蒙Next 支持数据双向绑定的组件:Checkbox--Search--TextInput

Checkbox $$语法&#xff0c;$$绑定的变量发生变化时&#xff0c;会触发UI的刷新 Entry Component struct MvvmCase { State isMarry:boolean falseStatesearchText:string build() {Grid(){GridItem(){Column(){Text("checkbox 的双向绑定")Checkbox().select($$…