计算机网络知识汇总

OSI七层模型

七层模型一般指开放系统互连参考模型,开放系统互连参考模型 (Open System Interconnect 简称OSI),OSI参考模型是具有7个层次的框架,自底向上的7个层次分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

背景:生活中每个地方都有自己的方言,而大家如果都将方言肯定就乱了,听不懂,为了让大家都能够畅通的交流通信,从而推出普通话标准,大家都用普通话标准,这样就能畅通无阻的通信了。而网络中的节点也是一样,任何网络中的节点只要都遵循这个模型,然后物理上连接起来,它们之间都可以互相通信。

TCP/IP

TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。 [1]

TCP/IP协议在一定程度上参考了OSI的体系结构。OSI模型共有七层,从下到上分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。但是这显然是有些复杂的,所以在TCP/IP协议中,它们被简化为了四个层次。只有四层体系结构的TCP/IP协议,与有七层体系结构的OSI相比要简单了不少,也正是这样,TCP/IP协议在实际的应用中效率更高,成本更低。

OSI是定义了一个理论的通信模型,而TCP/IP则是实现了这个理论,在这个基础上进行简化的一个通信协议。

OSI七层网络模型TCP/IP四层网络模型对应协议对应设备
应用层应用层HTTP、FTP、SFTP、TELNET、SMTP、WebSocket计算机
表示层
会话层
传输层传输层TCP、UDP防火墙
网络层网络层IP、ICMP、OSPF、EIGRP、IGMP路由器
数据链路层网络接口层SLIP、CSLIP、PPP、MTU交换机
物理层ISO2110、IEEE802集线器

应用层

应用层:应用层是TCP/IP协议的第一层,是直接为应用进程提供服务的。

(1)对不同种类的应用程序它们会根据自己的需要来使用应用层的不同协议,邮件传输应用使用了SMTP协议、万维网应用使用了HTTP协议、远程登录服务应用使用了有TELNET协议。 [1]

(2)应用层还能加密、解密、格式化数据。 [1]

(3)应用层可以建立或解除与其他节点的联系,这样可以充分节省网络资源。 [1]

HTTP

HTTP_百度百科 (baidu.com)

超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。超文本传输协议是一种用于分布式、协作式和超媒体信息系统的应用层协议,是万维网WWW(World Wide Web)的数据通信的基础。

通信过程

详情见TCP/IP通信过程。

报文格式

请求行 - 通用信息头 - 请求头 - 实体头 - 报文主体

状态行 - 通用信息头 - 响应头 - 实体头 - 报文主体

WebSocket

WebSocket_百度百科 (baidu.com)

是一个通信协议,WebSocket是一种在单个TCP连接上进行全双工通信的协议。

WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

WebSocket 是独立的、创建在 TCP 上的协议。
为了创建Websocket连接,需要通过浏览器发出请求,之后服务器进行回应,这个过程通常称为“握手”(handshaking)。Websocket 通过HTTP/1.1 协议的101状态码进行握手。

只需要进行一次握手连接,后续就可以通过这个连接一直通信。

与HTTP比较

WebSocket只需要进行一次握手连接,然后就可以进行通信。而HTTP一次握手只能通信一次,每次通信都需要进行握手。

WebSocket只在握手的时候是使用http协议,在连接创建后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小。而HTTP每次都要携带完整的头部,开销比较大。

实时性更强,由于服务端可以监控变化数据主动发送数据给客户端。而HTTP一般只能采用客户端轮询的方式实现,延迟更大。

更好的二进制支持。Websocket定义了二进制帧,相对HTTP,可以更轻松地处理二进制内容。

以下两点暂时没用到过:

可以支持扩展。Websocket定义了扩展,用户可以扩展协议、实现部分自定义的子协议。如部分浏览器支持压缩等。

更好的压缩效果。相对于HTTP压缩,Websocket在适当的扩展支持下,可以沿用之前内容的上下文,在传递类似的数据时,可以显著地提高压缩率。

传输层

传输层:作为TCP/IP协议的第二层,传输层在整个TCP/IP协议中起到了中流砥柱的作用。且在传输层中,TCP和UDP也同样起到了中流砥柱的作用。

TCP

TCP(传输控制协议)_百度百科 (baidu.com)

https://www.cnblogs.com/jojop/p/14111160.html

传输控制协议(TCP,Transmission Control Protocol)是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。

TCP是一对一进行通信,广播和多播不适合用TCP

网络层

网络层:网络层在TCP/IP协议中的位于第三层。在TCP/IP协议中网络层可以进行网络连接的建立和终止以及IP地址的寻找等功能。

网络接口层

网络接口层:在TCP/IP协议中,网络接口层位于第四层。由于网络接口层兼并了物理层和数据链路层所以,网络接口层既是传输数据的物理媒介,也可以为网络层提供一条准确无误的线路。

通信过程

TCP/IP协议工作原理和工作流程_tcp工作原理-CSDN博客

https://www.cnblogs.com/jojop/p/14111160.html

1、以web应用为例,在发送数据通信之前先进行三次握手:

①客户端发送SYN包

  • 应用层:客户端应用程序(如浏览器)请求建立连接。
  • 传输层:TCP 协议创建一个 SYN 数据段。这个数据段的 SYN 标志位被设置为 1,表示这是一个同步序列编号的请求,包含一个初始序列号(例如 seq = x)。
  • 网络层:IP 协议将 SYN 数据段封装成 IP 数据包,并添加 IP 头部信息(如源 IP 地址、目标 IP 地址)。
  • 链路层:链路层将 IP 数据包封装成数据帧,并添加链路层头部信息(如源 MAC 地址、目标 MAC 地址)。

发送数据:[链路层头部][IP 头部][TCP 头部 (SYN, seq = x)]

②服务端响应SYN-ACK包

  • 链路层:服务器的网卡接收到数据帧,并将其传递到网络层。
  • 网络层:IP 协议去除 IP 头部,并将 IP 数据包传递到传输层。
  • 传输层:TCP 协议识别 SYN 数据段,生成一个 SYN-ACK 数据段。这个数据段的 SYN 和 ACK 标志位被设置为 1,包含服务器的初始序列号(例如 seq = y)和对客户端序列号的确认号(ack = x + 1)。
  • 网络层:IP 协议将 SYN-ACK 数据段封装成 IP 数据包。
  • 链路层:链路层将 IP 数据包封装成数据帧。

发送数据:[链路层头部][IP 头部][TCP 头部 (SYN, ACK, seq = y, ack = x + 1)]

③客户端发送ACK包

  • 链路层:客户端的网卡接收到数据帧,并将其传递到网络层。
  • 网络层:IP 协议去除 IP 头部,并将 IP 数据包传递到传输层。
  • 传输层:TCP 协议识别 SYN-ACK 数据段,生成一个 ACK 数据段。这个数据段的 ACK 标志位被设置为 1,包含对服务器序列号的确认号(ack = y + 1)。
  • 网络层:IP 协议将 ACK 数据段封装成 IP 数据包。
  • 链路层:链路层将 IP 数据包封装成数据帧。

发送数据:[链路层头部][IP 头部][TCP 头部 (ACK, seq = x + 1, ack = y + 1)]

2、通信

原数据从应用层产生,然后往下经过每一层会根据协议封装数据,到了接收方这边从下往上经过每一层会根据对应的协议对数据进行拆包然后往上传递直到应用层收到原数据。

图上每一层虚线就是在数据封包和解包经过这一层都会遵守一样的协议进行数据的封包和解包,比如HTTP协议,但请求报文经过层层解包到了接收方的的应用层,会根据HTTP请求报文格式:请求行 - 通用信息头 - 请求头 - 实体头 - 报文主体 将数据进行提取,这就是HTTP协议的体现,应用层双方都按这个报文格式进行数据的封装和解包。

这样让人感觉就好像每一层都在直接通信,但实际上每一层不会直接对接通信。

3、四次挥手断开连接

缺陷

像OSl模型一样,TCP/IP模型和协议也有自己的问题。

(1)该模型没有明显地区分服务、接口和协议的概念。因此,对于使用新技术来设计新网络,TCP/IP模型不是一个太好的模板。 [5]

(2)TCP/IP模型完全不是通用的,并且不适合描述除TCP/IP模型之外的任何协议栈。 [5]

(3)链路层并不是通常意义上的一层。它是一个接口,处于网络层和数据链路层之间。接口和层间的区别是很重要的。 [5]

(4)TCP/IP模型不区分物理层和数据链路层。这两层完全不同,物理层必须处理铜缆、光纤和无线通信的传输特征;而数据链路层的工作是确定帧的开始和结束,并且按照所需的可靠程度把帧从一端发送到另一端。 [5]

Socket

        所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口 。

        Socket(套接字)可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,套接字主要有目标IP、传输层使用的传输协议、传输层使用的端口号这3个重要参数。

主要类型

1.流套接字(SOCK_STREAM)

        流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(The Transmission Control Protocol)协议。

2.数据报套接字(SOCK_DGRAM)

        数据报套接字提供一种无连接、不可靠的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用UDP( User DatagramProtocol)协议进行数据的传输。由于数据报套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。

3.原始套接字(SOCK_RAW)

        原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据报套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据报套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送的数据必须使用原始套接 [3]。原始套接字主要用于一些协议的开发,可以进行比较底层的操作。

Java中:java.net.Socket类代表创建TCP连接;java.net.DatagramSocket类代表创建UDP连接

工作流程

要通过互联网进行通信,至少需要一对套接字,其中一个运行于客户端,称之为 Client Socket,另一个运行于服务器端,称之为 Server Socket 。

1.服务器监听:所谓服务器监听,是指服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态 [3]。

2.客户端请求:所谓客户端请求,是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端接字提出连接请求 [3]。

3.连接确认:所谓连接确认,是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,就会响应客户端套接字的请求,建立一个新的线程,并把服务器端套接字的描述发送给客户端。一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,接收其他客户端套接字的连接请求 [3]。

数据物理网络传输

TCP/IP协议 (图解+秒懂+史上最全) - 疯狂创客圈 - 博客园 (cnblogs.com)

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

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

相关文章

省市县下拉框的逻辑以及多表联查的实例

2024.7.12 一. 省市县的逻辑开发。1、准备:1.1. 要求:1.2 数据库表: 2. 逻辑:3. 方法3.1 创建实体类3.2 数据访问层3.3 实现递归方法3.4 控制器实现3.5 前端处理 二、多表联查(给我干红温了)1. 出现了问题2…

python进阶(5):魔术方法篇(1)

之前使用的__init__ 构造方法,是Python类内置的方法之一。 这些内置的类方法,各自有各自特殊的功能,这些内置方法我们称之为:魔术方法 1 __str__ 字符串方法 class Student:name Noneage Nonetel Nonedef __init__(self,name…

shell脚本之if/case语句

一、条件测试 1、1 返回码 $? $? :返回码,用来判断命令或者脚本是否执行成功。 0 :表示true ,成功;非0 则表示flase ,失败。 1、2 test命令 可以进行条件测试,然后根据返回值来判断条件是否成立 -e…

Redis基础教程(十五):Redis GEO地理信息查询与管理

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…

怎么提高音频的播放速度?可以提高音频播放速度的四种方法推荐

怎么提高音频的播放速度?提高音频的播放速度是一种有效的策略,可以显著节省时间和提升信息获取的效率。随着信息量不断增加和学习需求的多样化,快速播放音频已成为许多人在日常生活和工作中的常见做法。这种方法不仅可以用于提高学习效率&…

Git-Unity项目版本管理

目录 准备GitHub新建项目并添加ssh密钥Unity文件夹 本文记录如何用git对unity 项目进行版本管理,并可传至GitHub远端。 准备 名称版本windows11Unity2202.3.9.f1gitN.A.githubN.A. GitHub新建项目并添加ssh密钥 GitHub新建一个repositorywindows11 生成ssh-key&…

全志A527 T527 android13支持usb摄像头

1.前言 我们发现usb摄像头在A527 android13上面并不能正常使用,需要支持相关的摄像头。 2.系统节点查看 我们查看系统是否有相关的节点生成,发现/dev/video相关的节点已经生成了。并没有问题,拔插正常。 3.这里我们需要查看系统层是否支持相关的相机, 我们使用命令进行…

详解yolov5的网络结构

转载自文章 网络结构图(简易版和详细版) 此图是博主的老师,杜老师的图 网络框架介绍 前言: YOLOv5是一种基于轻量级卷积神经网络(CNN)的目标检测算法,整体可以分为三个部分, ba…

警钟!电池储能安全事故频发!物联网技术如何加强储能安全排查?

在新能源时代背景下,储能系统作为能源转型的关键支撑技术,其安全问题日益凸显,尤其是近期海外电池项目连续发生的事故,为全球储能行业敲响了警钟。面对这一挑战,物联网技术以其强大的数据采集、智能分析与远程监控能力…

【计算机组成原理 | 第二篇】计算机硬件架构的发展

目录 前言: 冯诺依曼计算机架构 现代计算机架构: 总结: 前言: 在当今数字化时代,计算机硬件不仅是技术进步的见证者,更是推动这一进步的基石。它们构成了我们日常生活中不可或缺的数字生态系统的核心&a…

4. 小迪安全v2023笔记 javaEE应用

4. 小迪安全v2023笔记 javaEE应用 ​ 大体上跟随小迪安全的课程,本意是记录自己的学习历程,不能说是完全原创吧,大家可以关注一下小迪安全。 若有冒犯,麻烦私信移除。 默认有java基础。 文章目录 4. 小迪安全v2023笔记 javaEE应…

C++程序进阶学习

目录 引言 C内存分区 一、内存分区模型 二、 程序运行前 三、程序执行后 C引用 引用的语法 作用 本质 优点 C封装 C对象特性 C对象模型和this指针 C友元 C运算符重载 C继承 C多态 C文件 引言 看过我博客的朋友可能都了解这篇文章内容了,这篇博…

谷粒商城学习笔记-19-快速开发-逆向生成所有微服务基本CRUD代码

文章目录 一,使用逆向工程步骤梳理1,修改逆向工程的application.yml配置2,修改逆向工程的generator.properties配置3,以Debug模式启动逆向工程4,使用逆向工程生成代码5,整合生成的代码到对应的模块中 二&am…

FastAPI 学习之路(三十五)项目结构优化

之前我们创建的文件都是在一个目录中,但是在我们的实际开发中,肯定不能这样设计,那么我们去创建一个目录,叫models,大致如下。 主要目录是: __init__.py 是一个空文件,说明models是一个package…

2.GAP:通用访问协议

GAP的简单理解 GAP这个名字,直接翻译过来不好理解。 简单点可以理解为: 这是蓝牙设备在互联之前,过程中,第一个用于交流的协议。在代码上,会给这个协议实现,连接参数的设置,连接事件的实现&am…

maven高级1——一个项目拆成多个

把原来一个项目,拆成多个项目。 !!他们之间,靠接口通信。 以ssm整合好的项目为例: 如何看拆的ok不ok 只要compile通过就ok。 拆分pojo 先新建一个项目模块,再把内容复制进去。 拆分dao 1.和上面一样…

Unity之Text组件换行\n没有实现+动态中英互换

前因:文本中的换行 \n没有换行而是打印出来了,解决方式 因为unity会默认把\n替换成\\n 面板中使用富文本这个选项啊 没有用 m_text.text m_text.text.Replace("\\n", "\n"); ###动态中英文互译 using System.Collections; using…

牛客小白月赛98

骰子魔术 jackle 会拿出一枚骰子,骰子的表面分别写上了从 1∽5001\backsim 5001∽500 的数字,朋友会随便说一个 1∽5001\backsim 5001∽500 之间的点数,jackle 都能保证百分之百的掷出这个点数。 当然 jackle 有备而来,他准备了 …

代码随想录算法训练营Day62|冗余连接、冗余连接II

冗余连接 108. 冗余连接 (kamacoder.com) 考虑使用并查集&#xff0c;逐次将s、t加入并查集中&#xff0c;当发现并查集中find(u)和find(v)相同时&#xff0c;输出u和v&#xff0c;表示删除的边即可。 #include <iostream> #include <vector> using namespace s…

pytest使用报错(以及解决pytest所谓的“抑制print输出”)

1. 测试类的类名问题 #codingutf-8import pytestclass TestClass1:def setup(self) -> None:print(setup)def test_01(self) -> None:print(test_01111111111111111111111)def test_02(self) -> None:print(test_02)以上述代码为例&#xff0c;如果类名是Test开头&am…